Агломеративная кластеризация на наборе данных цифр

Beginner

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

Введение

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

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

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

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

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

Импорт библиотек

Начнем с импорта необходимых библиотек для этого практического занятия. Будем использовать numpy, matplotlib, manifold и datasets из scikit - learn для выполнения агломеративной кластеризации.

import numpy as np
from matplotlib import pyplot as plt
from time import time
from sklearn import manifold, datasets
from sklearn.cluster import AgglomerativeClustering

Загрузка и подготовка набора данных

Загружаем набор данных цифр и готовим его для кластеризации, извлекая данные и метки целей. Также устанавливаем случайный种子 в ноль, чтобы обеспечить воспроизводимость.

digits = datasets.load_digits()
X, y = digits.data, digits.target
n_samples, n_features = X.shape
np.random.seed(0)

Визуализация набора данных

Визуализируем набор данных, вычисляя 2D-эмбеддинг набора данных цифр с использованием manifold.SpectralEmbedding() и рисуя диаграмму рассеяния с разными маркерами для каждой цифры.

def plot_dataset(X_red):
    x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
    X_red = (X_red - x_min) / (x_max - x_min)

    plt.figure(figsize=(6, 4))
    for digit in digits.target_names:
        plt.scatter(
            *X_red[y == digit].T,
            marker=f"${digit}$",
            s=50,
            alpha=0.5,
        )

    plt.xticks([])
    plt.yticks([])
    plt.title('Digits Dataset Scatter Plot', size=17)
    plt.axis("off")
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])

print("Computing embedding")
X_red = manifold.SpectralEmbedding(n_components=2).fit_transform(X)
print("Done.")
plot_dataset(X_red)

Агломеративная кластеризация с разными стратегиями связывания

Выполняем агломеративную кластеризацию с разными стратегиями связывания: ward, average, complete и single. Для всех стратегий устанавливаем количество кластеров равным 10. Затем рисуем результаты кластеризации, используя разные цвета для каждой цифры.

def plot_clustering(X_red, labels, title=None):
    x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
    X_red = (X_red - x_min) / (x_max - x_min)

    plt.figure(figsize=(6, 4))
    for digit in digits.target_names:
        plt.scatter(
            *X_red[y == digit].T,
            marker=f"${digit}$",
            s=50,
            c=plt.cm.nipy_spectral(labels[y == digit] / 10),
            alpha=0.5,
        )

    plt.xticks([])
    plt.yticks([])
    if title is not None:
        plt.title(title, size=17)
    plt.axis("off")
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])

for linkage in ("ward", "average", "complete", "single"):
    clustering = AgglomerativeClustering(linkage=linkage, n_clusters=10)
    t0 = time()
    clustering.fit(X_red)
    print("%s :\t%.2fs" % (linkage, time() - t0))

    plot_clustering(X_red, clustering.labels_, "%s linkage" % linkage)

plt.show()

Резюме

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