Построение иерархической кластеризации

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Агломеративная кластеризация - это иерархический алгоритм кластеризации, который группирует похожие точки данных вместе. Она начинается с каждой точки данных в качестве отдельного кластера и затем итеративно объединяет эти кластеры на основе их сходства, пока все точки данных не будут принадлежать к одному кластеру. В этом лабораторном занятии мы исследуем влияние введения связности графа для захвата локальной структуры в данных.

Советы по работе с ВМ

После завершения запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Лэби. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49062{{"Построение иерархической кластеризации"}} sklearn/cluster -.-> lab-49062{{"Построение иерархической кластеризации"}} ml/sklearn -.-> lab-49062{{"Построение иерархической кластеризации"}} end

Импортируем необходимые библиотеки

Начнем с импорта необходимых библиотек, в том числе 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()

Резюме

В этом практическом занятии мы исследовали влияние введения графа связности для захвата локальной структуры в данных с использованием иерархической кластеризации. Мы визуализировали кластеризацию с и без связности и заметили, что использование графа связности может привести к более стабильным и значимым кластерам. Мы также наблюдали, что более большое количество соседей приводит к более однородным кластерам, но за счет увеличения времени вычислений.