Иерархическая кластеризация с ограничениями связности

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом практическом занятии показано, как выполнять иерархическое кластеризация с ограничениями связности с использованием библиотеки 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.