Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по ОМО 2025 / Baraeva_Elizaveta_lb2.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
1 Мб
Скачать
☆

1.4. Подготовьте наборы данных проведя стандартизация или нормировку данных. Обоснуйте выбор операции.

Так как данные датафрейма df_blobs представляют собой кластеры, они не распределены нормально. В этом случае лучше использовать нормировку (MinMaxScaler), так как она сохранит относительные расстояния между точками. У датафрейма df_circles данные представлены в виде круговых кластеров, что говорит о различных масштабах вдоль разных осей. В этом случае лучше использовать стандартизацию (StandardScaler), так как она сохранит относительную структуру данных.

Для начала импортируем MinMaxScaler и StandardScaler из библиотеки sklearn.preprocessing. Затем с помощью метода fit_transform подготовим данные, используя нормировку и стандартизацию для df_blobs и df_circles соответственно. Далее с помощью plt.scatter построим диаграммы рассеяния для датафреймов. Добавим контур для точек, заголовок и подписи осей. Реализация представлена в Листинге 1.4.1. Диаграммы изображены на Рисунке 1.4.2 и Рисунке 1.4.3.

Листинге 1.4.1 – Реализация подготовки наборов данных

from sklearn.preprocessing import MinMaxScaler, StandardScaler

blobs_norm = MinMaxScaler().fit_transform(df_blobs)

plt.scatter(blobs_norm[:, 0], blobs_norm[:, 1], edgecolors='w', linewidths=0.5)

plt.title("Нормализованная диаграмма рассеяния (MinMaxScaler)")

plt.xlabel("x")

plt.ylabel("y")

plt.show()

circles_std = StandardScaler().fit_transform(df_circles)

plt.scatter(circles_std[:, 0], circles_std[:, 1], edgecolors='w', linewidths=0.5)

plt.title("Стандартизованная диаграмма рассеяния (StandardScaler)")

plt.xlabel("x")

plt.ylabel("y")

plt.show()

Рисунок 1.4.2 – Диаграмма рассеяния датафрейма df_blobs

Рисунок 1.4.3 – Диаграмма рассеяния датафрейма df_circles

2. K-Means:

2.1. Проведите исследование оптимального количества кластеров методов локтя. Сделайте выводы, о наиболее подходящем количестве кластеров.

Для метода локтя необходимо построить график зависимости инерции (либо другой метрики качества) от количества кластеров. По графику выбрать точку, которая напоминает «локоть». Абсцисса точки и будет оптимальным количеством кластеров.

Для начала импортируем KMeans из библиотеки sklearn.cluster. Создадим функцию elbow_method, которая принимает датасет и строит график. Внутри функции создается массив значений инерции. В цикле до 10 для каждого значения создаётся модель KMeans с соответствующим числом кластеров. Параметр n_init=5 означает, что алгоритм запустится 5 раз с разными начальными центрами кластеров. После обучения модели на данных с помощью метода fit, добавляем значение инерции через атрибут inertia_ в список inert_list. После цикла строится график. По оси x откладывается количество кластеров, по y – соответствующие значения инерции. В конце функция вызывается для датафреймов df_blobs и df_circles. Реализация представлена в Листинге 2.1.1. Графики изображены на Рисунке 2.1.2 и Рисунке 2.1.3.

Листинг 2.1.1 – Реализация метода локтя

from sklearn.cluster import KMeans

def elbow_method(data):

inert_list = []

for i in range(10):

temp_km = KMeans(i + 1, n_init=5)

temp_km.fit(data)

inert_list.append(temp_km.inertia_)

plt.plot(list(range(1, 11)), inert_list)

plt.ylabel('Инерция')

plt.xlabel('Количество кластеров')

plt.xticks(list(range(1, 11)))

plt.grid()

plt.show()

elbow_method(blobs_norm)

elbow_method(circles_std)

Рисунок 2.1.2 – График метода локтя для датафрейма df_blobs

Рисунок 2.1.3 – График метода локтя для датафрейма df_circles

На Рисунке 2.1.2 явно видно, что «локоть» находится в точке 3. В то время как на Рисунке 2.1.3 сложно определить, где находится «локоть». Как мне кажется, он находится в точках в интервале от 3 до 7.

Соседние файлы в папке Лабы по ОМО 2025