- •Подготовка наборов данных:
- •Загрузите наборы.
- •1.2. Проверьте корректность загрузки.
- •1.3. Постройте диаграмму рассеяния набора данных. Опишите форму данных, и особенности в данных.
- •1.4. Подготовьте наборы данных проведя стандартизация или нормировку данных. Обоснуйте выбор операции.
- •2.1. Проведите исследование оптимального количества кластеров методов локтя. Сделайте выводы, о наиболее подходящем количестве кластеров.
- •2.2. Проведите исследование оптимального количества кластеров методом силуэта. Сделайте выводы, о наиболее подходящем количестве кластеров.
- •2.3. Проведите кластеризацию алгоритмом k-means, с выбранным оптимальным количеством кластеров.
- •2.4. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.
- •2.5. Постройте диаграмму Вороного для результатов кластеризации. На диаграмме отметьте центроиды полученных кластеров.
- •2.7. Рассчитайте для каждого кластера кол-во точек, среднее, ско, минимум и максимум. Сопоставьте результаты с построенными графиками.
- •3.1. Подберите параметры алгоритма dbscan, которые на ваш взгляд дают наилучшие результаты. Опишите процесс (почему и как изменяли параметры) подбора параметров.
- •3.2. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.
- •3.3. Сделайте выводы об успешности кластеризации.
- •4. Иерархическая кластеризация:
- •4.2. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.
- •4.3. Сравните результаты кластеризации с результатами, полученными в п.2 и п.3. Сделайте выводы о том, какой метод кластеризации подходит под каждый из наборов данных.
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) |
Рисунок 2.5.2 – Диаграмма Вороного для датасета blobs
Рисунок 2.5.3 – Диаграмма Вороного для датасета circles
2.6. Постройте для каждого признака диаграмму “box-plot” или “violin-plot”, с разделением по кластерам. Сделайте выводы о разделении кластеров и успешности применения кластеризации 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') |
Рисунок 2.6.2 – Диаграмма распределения x для датасета blobs
Рисунок 2.6.3 – Диаграмма распределения y для датасета blobs
Рисунок 2.6.4 – Диаграмма распределения x для датасета circles
Рисунок 2.6.5 – Диаграмма распределения y для датасета circles
На Рисунке 2.6.2 видно, что кластер 2 четко выделяется, так как его значения x находятся в верхнем диапазоне (0.5-1.0). Кластеры 0 и 1 перекрываются в диапазоне (0-0.5), что может указывать на недостаточно четкое разделение между ними. Форма плотности распределений всех кластеров схожи. Также на Рисунке 2.6.3 ситуация похожая. Кластер 1 четко выделяется, а кластеры 0 и 2 перекрываются в диапазоне. Форма плотности распределений 0 и 1 кластеров схожи. Кластер 3 имеет более плотное распределение.
На Рисунке 2.6.4 видно, что кластеры попарно перекрываются. Кластеры 0 и 7 перекрываются в диапазоне от 0.5 до 2, кластеры 1 и 2 перекрываются в диапазоне от -1 до 0.5, кластеры 3 и 4 перекрываются в диапазоне от -0.5 до 1, кластеры 5 и 6 перекрываются в диапазоне от -2 до -0.5. Это может указывать на недостаточно четкое разделение между ними. Ширина распределения кластеров 0, 2, 4, 6 схожа, также и у кластеров 1, 3, 5, 7. Нормальная форма плотности распределений у кластеров 0 и 6. На Рисунке 2.6.5 видно, что кластеры 1, 3, 5 перекрываются в диапазоне от -1 до 1. Ширина распределения кластеров 0, 1, 3, 5, 6, 7 почти одинаковая, но только у 3 и 7 схожая плотность. Кластеры 2 и 4 имеют одинаковую ширину распределения, но разную плотность.
Я считаю, что для датасета blobs кластеризация K-means применилась успешно, в то время как для датасета circles кластеризация прошла менее успешно из-за большого количества асимметрий и перекрытий.
