はじめに
この実験では、Python の Scikit-learn ライブラリを使って、接続制約付きの階層的クラスタリングを行う方法を示します。階層的クラスタリングでは、クラスタは相互間の距離に基づいて再帰的にマージまたは分割することによって形成されます。接続制約は、データポイント間の接続性に基づいてクラスタの形成を制限するために使用でき、より意味のあるクラスタをもたらすことができます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
データの生成
まず、Scikit-learn のmake_swiss_roll関数を使ってスイスロールデータセットを生成します。スイスロールデータセットは、渦巻き形状の 3 次元データセットです。
from sklearn.datasets import make_swiss_roll
n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
## Make it thinner
X[:, 1] *= 0.5
非構造化階層的クラスタリング
接続制約なしで階層的クラスタリングに属する凝集型クラスタリング(AgglomerativeClustering)を行います。
from sklearn.cluster import AgglomerativeClustering
ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
label = ward.labels_
非構造化階層的クラスタのプロット
matplotlibライブラリを使って、非構造化階層的クラスタをプロットします。
import matplotlib.pyplot as plt
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
ax1.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
構造化階層的クラスタリング
Scikit-learn のkneighbors_graph関数を使って、10 個の近傍点を持つ k 近傍法(k-Nearest Neighbors)を定義します。
from sklearn.neighbors import kneighbors_graph
connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)
接続制約付きで再び凝集型クラスタリング(AgglomerativeClustering)を行います。
ward = AgglomerativeClustering(
n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
label = ward.labels_
構造化階層的クラスタのプロット
matplotlibライブラリを使って、構造化階層的クラスタをプロットします。
fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
ax2.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
まとめ
この実験では、Python の Scikit-learn ライブラリを使って接続制約付きの階層的クラスタリングを行う方法を示しました。まず、スイスロールデータセットを生成し、非構造化階層的クラスタリングを行いました。次に、10 個の近傍点を持つ k 近傍法を定義し、構造化階層的クラスタリングを行いました。最後に、matplotlibライブラリを使って非構造化および構造化階層的クラスタをプロットしました。