凝集型クラスタリングをプロットする

Machine LearningMachine LearningBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

凝集クラスタリングは、類似するデータポイントをグループ化する階層型クラスタリングアルゴリズムです。このアルゴリズムは、各データポイントを個別のクラスタとして始め、その後、類似性に基づいてこれらのクラスタを反復的に結合していきます。すべてのデータポイントが単一のクラスタに属するまで続けます。この実験では、データ内の局所構造を捉えるために接続グラフを課すことの影響を調べます。

VMのヒント

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) 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

必要なライブラリをインポートする

まずは、numpymatplotlib、および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()

まとめ

この実験では、凝集型クラスタリングを用いて、データ内の局所構造を捉えるために接続性グラフを適用する効果を検討しました。接続性の有無を持つクラスタリングを可視化し、接続性グラフを使用することで、より安定的で意味のあるクラスタが得られることを観察しました。また、近傍点の数を増やすと、計算時間が増える代わりにより均一なクラスタが得られることも観察しました。