Введение
Агломеративная кластеризация - это иерархический алгоритм кластеризации, который группирует похожие точки данных вместе. Она начинается с каждой точки данных в качестве отдельного кластера и затем итеративно объединяет эти кластеры на основе их сходства, пока все точки данных не будут принадлежать к одному кластеру. В этом лабораторном занятии мы исследуем влияние введения связности графа для захвата локальной структуры в данных.
Советы по работе с ВМ
После завершения запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Лэби. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импортируем необходимые библиотеки
Начнем с импорта необходимых библиотек, в том числе numpy, matplotlib и sklearn.
import time
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph
Генерируем примерные данные
Мы генерируем примерные данные, создавая синусоидальную волну с случайным шумом.
n_samples = 1500
np.random.seed(0)
t = 1.5 * np.pi * (1 + 3 * np.random.rand(1, n_samples))
x = t * np.cos(t)
y = t * np.sin(t)
X = np.concatenate((x, y))
X += 0.7 * np.random.randn(2, n_samples)
X = X.T
Создаем граф
Создаем граф, который захватывает локальную связность. Большое количество соседей даст более однородные кластеры, но за счет увеличения времени вычислений. Очень большое количество соседей дает более равномерно распределенные размеры кластеров, но может не учитывать локальную структуру данных.
knn_graph = kneighbors_graph(X, 30, include_self=False)
Визуализация кластеризации без связности
Визуализируем кластеризацию без связности, нанося точки данных разными цветами.
for n_clusters in (30, 3):
plt.figure(figsize=(10, 4))
for index, linkage in enumerate(("average", "complete", "ward", "single")):
plt.subplot(1, 4, index + 1)
model = AgglomerativeClustering(
linkage=linkage, connectivity=None, n_clusters=n_clusters
)
t0 = time.time()
model.fit(X)
elapsed_time = time.time() - t0
plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
plt.title(
"linkage=%s\n(time %.2fs)" % (linkage, elapsed_time),
fontdict=dict(verticalalignment="top"),
)
plt.axis("equal")
plt.axis("off")
plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
plt.suptitle(
"n_cluster=%i, connectivity=%r"
% (n_clusters, False),
size=17,
)
plt.show()
Визуализация кластеризации с связностью
Визуализируем кластеризацию с связностью, нанося точки данных разными цветами.
for n_clusters in (30, 3):
plt.figure(figsize=(10, 4))
for index, linkage in enumerate(("average", "complete", "ward", "single")):
plt.subplot(1, 4, index + 1)
model = AgglomerativeClustering(
linkage=linkage, connectivity=knn_graph, n_clusters=n_clusters
)
t0 = time.time()
model.fit(X)
elapsed_time = time.time() - t0
plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
plt.title(
"linkage=%s\n(time %.2fs)" % (linkage, elapsed_time),
fontdict=dict(verticalalignment="top"),
)
plt.axis("equal")
plt.axis("off")
plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
plt.suptitle(
"n_cluster=%i, connectivity=%r"
% (n_clusters, True),
size=17,
)
plt.show()
Резюме
В этом практическом занятии мы исследовали влияние введения графа связности для захвата локальной структуры в данных с использованием иерархической кластеризации. Мы визуализировали кластеризацию с и без связности и заметили, что использование графа связности может привести к более стабильным и значимым кластерам. Мы также наблюдали, что более большое количество соседей приводит к более однородным кластерам, но за счет увеличения времени вычислений.