Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по ОМО 2025 / Baraeva_Elizaveta_lb2
.pdf
11
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

12
На Рисунке 2.1.2 явно видно, что «локоть» находится в точке 3. В то
время как на Рисунке 2.1.3 сложно определить, где находится «локоть». Как
мне кажется, он находится в точках в интервале от 3 до 7.
2.2. Проведите исследование оптимального количества кластеров
методом силуэта. Сделайте выводы, о наиболее подходящем
количестве кластеров.
Создадим функцию silhouette_method, которая принимает датасет и
строит график. Внутри функции создается массив значений коэффициента
силуэта. В цикле до 10 для каждого значения создаётся модель KMeans с
соответствующим числом кластеров. Параметр n_init=5 означает, что
алгоритм запустится 5 раз с разными начальными центрами кластеров. После
обучения и предсказания модели на данных с помощью метода fit_predict,
добавляем значение коэффициента силуэта через функцию silhouette_score в
список sil_list. После цикла строится график. По оси x откладывается
количество кластеров, по y – соответствующие значения коэффициента
силуэта. В конце функция вызывается для датафреймов df_blobs и df_circles.
Реализация представлена в Листинге 2.2.1. Графики изображены на Рисунке
2.2.2 и Рисунке 2.2.3.
Листинг 2.2.1 – Реализация метода силуэта
def silhouette_method(data):
sil_list = []
for i in range(1, 10):
temp_km = KMeans(i + 1, n_init=5)
temp_clust = temp_km.fit_predict(data)
sil_list.append(silhouette_score(data, temp_clust))
plt.plot(list(range(2, 11)), sil_list)
plt.ylabel('Среднее значение коэффициента силуэта')
plt.xlabel('Количество кластеров')
plt.xticks(list(range(1, 11)))

13
plt.grid()
plt.show()
silhouette_method(blobs_norm)
silhouette_method(circles_std)
Рисунок 2.2.2 – График метода силуэта для датафрейма df_blobs
Рисунок 2.2.3 – График метода силуэта для датафрейма df_circles

14
На Рисунке 2.2.2 видно, что максимум находится в точке 3. В то время
как на Рисунке 2.2.3 максимальные значения находятся в интервале от 7 до
10. Учитывая предыдущий пункт, как мне кажется, следует взять количество
кластеров равным 8.
2.3. Проведите кластеризацию алгоритмом K-means, с выбранным
оптимальным количеством кластеров.
Создается модель K-means с тремя кластерами для датасета blobs и с
восьмью кластерами для датасета circles, которая обучается на данных и
предсказывает метки кластеров для каждой точки. Реализация приведена в
Листинге 2.3.1.
Листинг 2.3.1 – Кластеризация алгоритмом K-means
blobs_km = KMeans(n_clusters=3)
blobs_clust = blobs_km.fit_predict(blobs_norm)
circles_km = KMeans(n_clusters=8)
circles_clust = circles_km.fit_predict(circles_std)
2.4. Постройте диаграмму рассеяния результатов кластеризации с
выделением разным цветом разных кластеров.
Для каждого датасета подготовленные данные преобразуются в
датафрейм. Далее добавляется колонка cluster с метками, полученными в
результате кластеризации. После этого строится диаграмма рассеяния, где
каждый кластер выделен своим цветом. Реализация представлена в Листинге
2.4.1. Диаграммы изображены на Рисунке 2.4.2 и Рисунке 2.4.3.
Листинг 2.4.1 – Реализация построения диаграмм рассеяния для результатов
кластеризации
blobs_norm_df = pd.DataFrame(blobs_norm, columns=['x', 'y'])
blobs_norm_df['cluster'] = blobs_clust
sns.scatterplot(blobs_norm_df, x='x', y='y', hue='cluster',

15
palette='tab10')
plt.show()
circles_std_df = pd.DataFrame(circles_std, columns=['x', 'y'])
circles_std_df['cluster'] = circles_clust
sns.scatterplot(circles_std_df, x='x', y='y', hue='cluster',
palette='tab10')
plt.show()
Рисунок 2.4.2 – Диаграмма рассеяния для датасета blobs
Рисунок 2.4.3 – Диаграмма рассеяния для датасета circles

16
2.5. Постройте диаграмму Вороного для результатов кластеризации. На
диаграмме отметьте центроиды полученных кластеров.
Создадим функцию voronoi, которая принимает обученную модель,
подготовленные данные, а также границы графика. Сначала извлекаются
центроиды кластеров из модели, затем строится диаграмма Вороного. На
графике отображаются точки данных, раскрашенные в соответствии с их
кластером, и центроиды, помеченные красными крестами. Далее
устанавливаются границы осей, добавляются подписи осей и легенда.
Функция вызывается для датасетов blobs и circles. Реализация представлена в
Листинге 2.5.1. Диаграммы изображены на Рисунке 2.5.2 и Рисунке 2.5.3.
Листинг 2.5.1 – Реализация построения диаграмм Вороного для результатов
кластеризации
def voronoi(data_km, data_norm, minn, maxx):
centroids = data_km.cluster_centers_
ax = plt.gca()
vor = Voronoi(centroids)
voronoi_plot_2d(vor, ax, show_vertices=False)
plt.scatter(data_norm[:, 0], data_norm[:, 1],
c=data_km.labels_, edgecolors='black')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red',
marker='X', s=200, label='Центроиды', edgecolors='black')
ax.set_xlim([minn, maxx])
ax.set_ylim([minn, maxx])
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
voronoi(blobs_km, blobs_norm, -0.02, 1.02)
voronoi(circles_km, circles_std, -2.1, 2.1)

17
Рисунок 2.5.2 – Диаграмма Вороного для датасета blobs
Рисунок 2.5.3 – Диаграмма Вороного для датасета circles
2.6. Постройте для каждого признака диаграмму “box-plot” или “violinplot”, с разделением по кластерам. Сделайте выводы о разделении

18
кластеров и успешности применения кластеризации K-means к
набору данных.
Создадим функцию violin_plot, которая принимает датафрейм с метками
кластеров, количество кластеров, размер графика и название анализируемого
признака. Сначала она сортирует датафрейм по возрастанию номеров
кластеров, затем создает отдельную скрипичную диаграмму для каждого
кластера, добавляет заголовок и подписывает оси. Функция вызывается для
двух признаков датасетов blobs и circles. Реализация представлена в Листинге
2.6.1. Диаграммы изображены на Рисунке 2.6.2 – Рисунке 2.6.5.
Листинг 2.6.1 – Реализация построения диаграмм violin-plot
def violin_plot(norm_df, n_clust, figsize, attribute):
sorted_df = norm_df.sort_values('cluster')
plt.figure(figsize=figsize)
plt.violinplot([sorted_df[sorted_df['cluster'] ==
i][attribute] for i in range(n_clust)])
plt.title(f'Распределение {attribute} по кластерам')
plt.xticks([i+1 for i in range(n_clust)], [f'Кластер {i}'
for i in range(n_clust)])
plt.ylabel(attribute)
plt.show()
violin_plot(blobs_norm_df, 3, (6, 5), 'x')
violin_plot(blobs_norm_df, 3, (6, 5), 'y')
violin_plot(circles_std_df, 8, (10, 5), 'x')
violin_plot(circles_std_df, 8, (10, 5), 'y')

19
Рисунок 2.6.2 – Диаграмма распределения x для датасета blobs
Рисунок 2.6.3 – Диаграмма распределения y для датасета blobs

20
Рисунок 2.6.4 – Диаграмма распределения x для датасета circles
Рисунок 2.6.5 – Диаграмма распределения y для датасета circles
На Рисунке 2.6.2 видно, что кластер 2 четко выделяется, так как его
значения x находятся в верхнем диапазоне (0.5-1.0). Кластеры 0 и 1
Соседние файлы в папке Лабы по ОМО 2025
