scipyのlinkage関数の返り値について

記事内に広告が含まれています。

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 以降の番号がつけられます。

今回の例であれば、番号 23 が結合してできたグループ番号は 4 であり、番号 01 が結合してできたグループ番号は 5 です。

ちなみに、デンドログラムの横軸には初期のデータ点の番号が記されます。

dendrogram(linkage_result)
plt.show()
図1: 階層的クラスタリングの樹形図.

まとめと参考

scipyで階層的クラスタリングを実行する際に利用する scipy.cluster.hierarchy.linkage の返り値についてメモしました。

何かの参考になれば幸いです。

参考リンク

linkage — SciPy v1.14.0 Manual
Python
スポンサーリンク

コメント