Python scikit-learn 凝集型クラスタリングを使用する

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

凝集型クラスタリングとは

データポイントを単クラスタと仮設定し、最も似たクラスタ同士を指定の数のクラスタ数になるまで集めていく。

また、クラスタの結合は少ない数のクラスタ同士で結合していこうとする。

"最も似た"のアルゴリズムは以下の3種類がある。

  • ward (併合した際のクラスタの分散が最小になるように選択)
  • average(クラスタ間のデータポイントの平均値を最小になるよう選択)
  • complete(クラスタの点間の距離の最大値が最小となるよう選択)

大体の場合はwardで正しく分類されるみたい。

f:id:letitride:20200728122229p:plain:w500


凝集型クラスタリングを行う

AgglomerativeClustering()でクラスタリングを行います。

from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
X, y = make_blobs(random_state=1)
agg = AgglomerativeClustering(n_clusters=3)
assignment = agg.fit_predict(X)
mglearn.discrete_scatter(X[:,0], X[:,1], assignment)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

f:id:letitride:20200728122405p:plain:w500


クラスタ併合の順序を可視化する

from scipy.cluster.hierarchy import dendrogram, ward

X, y = make_blobs(random_state=0, n_samples=12)
linkage_array = ward(X)
dendrogram(linkage_array)

ax = plt.gca()
bounds = ax.get_xbound()
ax.plot(bounds, [7.25, 7.25], '--', c="k")
ax.plot(bounds, [4, 4], '--', c="k")
ax.text(bounds[1], 7.25, " two clusters", va="center", fontdict={"size":15})
ax.text(bounds[1], 4, " three clusters", va="center", fontdict={"size":15})
plt.xlabel("Sample index")
plt.ylabel("Cluster distance")

f:id:letitride:20200728122608p:plain