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

4. Иерархическая кластеризация:

4.1. Проведите иерархическую кластеризацию для параметра linkage указанного в вашем варианте, используя количество кластеров, полученных в п.2 или п.3. Постройте дендрограмму. Сделайте выводы, о разделении кластеров и необходимости изменить количество кластеров (если считаете, что необходимо изменить количество кластеров, то повторите кластеризацию с другим количеством кластеров).

Для иерархической кластеризации импортируем AgglomerativeClustering из библиотеки sklearn.cluster. Создадим функцию plot_dendrogram, которая принимает датасет в виде numpy.ndarray и параметры для дендрограммы. Создается модель AgglomerativeClustering с параметрами, позволяющими построить полную дендрограмму (без ограничения на число кластеров). Для каждого шага объединения кластеров подсчитывается, сколько точек в них входит. Формируется linkage_matrix – матрица, которая описывает, какие кластеры объединяются, на каком расстоянии и сколько элементов они содержат. Строится сама дендрограмма с помощью dendrogram из scipy.cluster.hierarchy, а также добавляется подпись по оси x. В конце функция вызывается для двух датасетов blobs и circles. Реализация приведена в Листинге 4.1.1. Дендрограммы представлены на Рисунке 4.1.2 и Рисунке 4.1.3.

Листинг 4.1.1 – Реализация построения дендрограмм

from sklearn.cluster import AgglomerativeClustering

from scipy.cluster.hierarchy import dendrogram

def plot_dendrogram(norm, **kwargs):

model = AgglomerativeClustering(distance_threshold=0, n_clusters=None).fit(norm)

counts = np.zeros(model.children_.shape[0])

n_samples = len(model.labels_)

for i, merge in enumerate(model.children_):

current_count = 0

for child_idx in merge:

if child_idx < n_samples:

current_count += 1

else:

current_count += counts[child_idx - n_samples]

counts[i] = current_count

linkage_matrix = np.column_stack([model.children_, model.distances_, counts]).astype(float)

dendrogram(linkage_matrix, **kwargs)

plt.xlabel("Количество точек в узле (или индекс точки, если скобки отсутствуют)")

plt.show()

plot_dendrogram(blobs_norm, truncate_mode="level", p=3)

plot_dendrogram(circles_std, truncate_mode="level", p=3)

Рисунок 4.1.2 – Дендрограмма датасета blobs

Рисунок 4.1.3 – Дендрограмма датасета circles

Главный критерий – поиск значительного увеличения расстояния между объединяемыми кластерами. На Рисунке 4.1.2 видны 3 больших скачка, значит для этого датасета оптимальное количество кластеров – 3. На Рисунке 4.1.3 видны 3 больших скачка: с 10 до 20, с 7.5 до 17.5, с 5 до 12.5 и 1 поменьше: с 7.5 до 12.5. Для этого датасета оптимальное количество кластеров – 4.

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

Создадим функцию hierarchy_clustering, которая принимает датафрейм и метки классов. В ней строится диаграмма рассеяния. До вызова функции используется иерархическая кластеризация. Для датасета blobs количество кластеров равно 3, а для датасета circles кластеризация производится для 8 и 4 кластеров, т.к. в п.2 и п.3 было получено разное количество кластеров. В конце функция вызывается 3 раза. Реализация приведена в Листинге 4.2.1. Диаграммы представлены на Рисунке 4.2.2, Рисунке 4.2.3 и Рисунке 4.2.4.

Листинг 4.2.1 – Реализация иерархической кластеризации и построения диаграмм рассеяния

def hierarchy_clustering(df, clust):

plt.scatter(df.iloc[:, 0], df.iloc[:, 1], c=clust)

plt.xlabel("x")

plt.ylabel("y")

plt.show()

blobs_ag_clust = AgglomerativeClustering(n_clusters = 3, linkage = 'ward').fit_predict(blobs_df)

circles_ag_clust_8 = AgglomerativeClustering(n_clusters = 8, linkage = 'ward').fit_predict(circles_df)

circles_ag_clust_4 = AgglomerativeClustering(n_clusters = 4, linkage = 'ward').fit_predict(circles_df)

hierarchy_clustering(blobs_df, blobs_ag_clust)

hierarchy_clustering(circles_df, circles_ag_clust_8)

hierarchy_clustering(circles_df, circles_ag_clust_4)

Рисунок 4.2.2 – Диаграмма рассеяния датасета blobs

Рисунок 4.2.3 – Диаграмма рассеяния датасета circles (8 кластеров)

Рисунок 4.2.4 – Диаграмма рассеяния датасета circles (4 кластера)

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