scipyで階層的クラスタリングを実行する際の備忘録です。
scipy.cluster.hierarchy.linkage
関数を利用して階層型クラスタリングを実行しますが、この関数の返り値がどういうデータなのかメモします。
ward_linkage = linkage(データ点のリスト)
結論
この関数の返り値は2次元のデータで、(N-1, 4)
の形式の numpy.ndarray
で出力されます。ただし、N
はデータの個数です。
各列方向の成分は、[データ番号, データ番号, データ間距離, 結合後のデータ数] という意味でまとまっています。
解説
import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt
x軸上の4点をテストデータとして階層的クラスタリングを実行してみる。
datalist = np.array([[0,0], [0,2], [0,9],[0,10]]) #データの番号は順に0,1,2,3番とする
linkage_result = linkage(datalist, method='single', metric='euclidean')
print(linkage_result)
結果は、以下のように (3,4)
の numpy.ndarray
が出力されます。
[[2. 3. 1. 2.]
[0. 1. 2. 2.]
[4. 5. 7. 4.]]
1行目 [2. 3. 1. 2.]
は、以下のように解釈できます。
datalist
の2番目の点 (0,9)
と 3番目の点 (0,10)
の2点(2グループ)が結合された。これらのグループ間距離は 1
で、結合後のグループの点個数は 2
個になった。
ただし、データの番号は0始まりです。 2行目と3行目も原理は同じように解釈できます。
注意として、結合されて新しくできたグループには、N
以降の番号がつけられます。
今回の例であれば、番号 2
と 3
が結合してできたグループ番号は 4
であり、番号 0
と 1
が結合してできたグループ番号は 5
です。
ちなみに、デンドログラムの横軸には初期のデータ点の番号が記されます。
dendrogram(linkage_result)
plt.show()
まとめと参考
scipyで階層的クラスタリングを実行する際に利用する scipy.cluster.hierarchy.linkage
の返り値についてメモしました。
何かの参考になれば幸いです。
参考リンク
linkage — SciPy v1.14.0 Manual
コメント