Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ОМО 2025 / Baraeva_Elizaveta_lb2

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
1 Мб
Скачать
☆
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” или “violin­plot”, с разделением по кластерам. Сделайте выводы о разделении
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