手書き数字データセットにおける凝集型クラスタリング

Beginner

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

はじめに

この実験では、手書き数字データセットの 2 次元埋め込みに対する凝集型クラスタリングのさまざまなリンク方法を示します。この実験の目的は、異なるリンク戦略がどのように振る舞うかを示すことであり、手書き数字に対する良いクラスタを見つけることではありません。これが、この例が 2 次元埋め込みで動作する理由です。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題に直面した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

ライブラリのインポート

この実験に必要なライブラリをインポートして始めましょう。凝集型クラスタリングを実行するために、numpy、matplotlib、manifold、および scikit-learn の datasets を使用します。

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)

データセットの可視化

manifold.SpectralEmbedding() を使って手書き数字データセットの 2 次元埋め込みを計算し、各数字に異なるマーカーを付けた散布図を描画することで、データセットを可視化します。

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()

まとめ

この実験では、異なるリンク戦略を使って手書き数字データセットに対して凝集型クラスタリングを行う方法を学びました。また、各戦略に対するデータセットとクラスタリング結果を可視化しました。結果は、異なるリンク戦略が異なるクラスタリング結果を生み出すことを示しており、ニーズに最適な戦略を選ぶ必要があります。