Введение
В этом практическом занятии показано, как выполнять иерархическое кластеризация с ограничениями связности с использованием библиотеки Scikit-learn в Python. При иерархической кластеризации кластеры формируются путём рекурсивного объединения или разделения на основе расстояния между ними. Ограничения связности можно использовать для ограничения формирования кластеров на основе связности между точками данных, что может привести к более осмысленным кластерам.
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Генерация данных
Начнём с генерации датасета Swiss Roll с использованием функции make_swiss_roll из библиотеки Scikit-learn. Датасет Swiss Roll представляет собой трёхмерный датасет в виде спираль.
from sklearn.datasets import make_swiss_roll
n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
## Make it thinner
X[:, 1] *= 0.5
Неструктурированная иерархическая кластеризация
Выполняем AgglomerativeClustering, которая относится к иерархической кластеризации без каких-либо ограничений связности.
from sklearn.cluster import AgglomerativeClustering
ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
label = ward.labels_
Построение графиков для неструктурированных иерархических кластеров
Построим графики для неструктурированных иерархических кластеров с использованием библиотеки matplotlib.
import matplotlib.pyplot as plt
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
ax1.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
Структурная иерархическая кластеризация
Определяем k-ближайших соседей с 10 соседями с использованием функции kneighbors_graph из библиотеки Scikit-learn.
from sklearn.neighbors import kneighbors_graph
connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)
Выполняем AgglomerativeClustering снова с ограничениями связности.
ward = AgglomerativeClustering(
n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
label = ward.labels_
Построение графиков для структурированных иерархических кластеров
Построим графики для структурированных иерархических кластеров с использованием библиотеки matplotlib.
fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
ax2.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
Резюме
В этом практическом занятии показано, как выполнять иерархическую кластеризацию с ограничениями связности с использованием библиотеки Scikit-learn в Python. Сначала мы сгенерировали набор данных Swiss Roll и выполнили неструктурированную иерархическую кластеризацию. Затем мы определили k-ближайших соседей с 10 соседями и выполнили структурированную иерархическую кластеризацию. Наконец, мы построили графики как для неструктурированных, так и для структурированных иерархических кластеров с использованием библиотеки matplotlib.