はじめに
凝集クラスタリングは、類似するデータポイントをグループ化する階層型クラスタリングアルゴリズムです。このアルゴリズムは、各データポイントを個別のクラスタとして始め、その後、類似性に基づいてこれらのクラスタを反復的に結合していきます。すべてのデータポイントが単一のクラスタに属するまで続けます。この実験では、データ内の局所構造を捉えるために接続グラフを課すことの影響を調べます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook が読み込み終わるまで数秒待つことがあります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
まずは、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()
まとめ
この実験では、凝集型クラスタリングを用いて、データ内の局所構造を捉えるために接続性グラフを適用する効果を検討しました。接続性の有無を持つクラスタリングを可視化し、接続性グラフを使用することで、より安定的で意味のあるクラスタが得られることを観察しました。また、近傍点の数を増やすと、計算時間が増える代わりにより均一なクラスタが得られることも観察しました。