以前書いた、 scipyで階層的クラスタリング の記事の続きです。
階層的クラスタリングを行って結果を樹形図(デンドログラム)で表示すると、元のデータが多い場合は非常にみづらいものになります。
このような時は、樹形図の表示を途中で打ち切って必要なクラスタ分だけ表示するとクラスタ間の関係が掴みやすくなります。
scipyのdendrogram関数では、 truncate_mode というオプションが用意されており、これと、 値pを適切に指定することで実現できます。
ドキュメント: scipy.cluster.hierarchy.dendrogram
truncate_mode はNone, lastp, levelの3つの値を取ります。
Noneがデフォルト、lastpがデンドログラムの上から数えてp個のノードを残す、
levelは逆に下から数えて、各ノードがp回マージされるように動きます。
それぞれ動かしてみましょう。
truncate_mode=”lastp”, p=16
と
truncate_mode=”level”, p=3
の場合に、表示されるノードがどちらも16個になるので、動きの違いも見ておきます。
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
# データ取得。
X = load_iris().data
# ユークリッド距離とウォード法を使用してクラスタリング
z = linkage(X, metric='euclidean', method='ward')
# 結果を可視化
fig = plt.figure(figsize=(8, 15), facecolor="w")
ax = fig.add_subplot(3, 1, 1, title="樹形図: 全体")
dendrogram(z)
ax = fig.add_subplot(3, 1, 2, title="樹形図: lastp 16")
dendrogram(z, truncate_mode="lastp", p=16)
ax = fig.add_subplot(3, 1, 3, title="樹形図: level 3")
dendrogram(z, truncate_mode="level", p=3)
plt.show()
結果がこちら。
truncate_mode=”lastp” は、樹形図全体の上部の部分をそのまま切り出したものになっていて、
truncate_mode=”level” の方は、各枝に至るまでの分岐回数が一定になっているのがわかります。
また、どちらも図がすっきりしてみやすくなりました。