そのものずばりのメソッドはscipyには用意されていないようですので作成してみました。
階層クラスタリングの結果ツリーにおいて、中間(親)ノードのラベル番号の振られ方の仕様がよく分からなかったのですが、以下のようなコード結果で正しいでしょうか?
参考:Node indexing in hierarachical clustering dendrograms
Python
1# リンク行列から親→子マップを作成
2# 親ラベル番号は、リンク行列先頭行から連番で振られていることが前提
3def make_child_map( link_ary):
4 map_child = {}
5
6 # ルート要素のラベル番号(存在する最大+1)を決定
7 root_label = max(max(link_ary[:,0]),max(link_ary[:,1])) + 1
8 #print(root_label)
9
10 # リンク行列の最終行=ルート要素から逆順で親→子マップを作成
11 for line in reversed(link_ary):
12 map_child[root_label] = (line[0],line[1])
13 root_label -= 1
14
15 #print(map_child)
16 return map_child
17
18# 指定ラベル配下に属する葉ラベル番号を返す
19def get_leafs(map_child, label):
20 ret = []
21 if label in map_child:
22 for c in map_child[label]:
23 ret.extend( get_leafs( map_child, c))
24 else:
25 ret.append(label)
26
27 return ret
28
29# 元データ
30import numpy as np
31link_ary = np.array([
32 [ 6. , 7. , 0.63367942, 2. ],
33 [ 2. , 4. , 0.64049371, 2. ],
34 [ 1. , 10. , 0.66276945, 3. ],
35 [ 0. , 3. , 0.68889077, 2. ],
36 [ 5. , 13. , 0.80291289, 3. ],
37 [ 8. , 12. , 0.8065282 , 4. ],
38 [ 14. , 15. , 0.87251961, 7. ],
39 [ 9. , 11. , 1.03447273, 3. ],
40 [ 16. , 17. , 1.37861456, 10. ]])
41# print(link_ary)
42
43map_child = make_child_map(link_ary)
44leafs = get_leafs( map_child, 16)
45print(leafs)
46leafs = get_leafs( map_child, 17)
47print(leafs)
48
49# 描画
50import matplotlib.pyplot as plt
51from scipy.cluster.hierarchy import dendrogram
52dendrogram(link_ary)
53plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/14 02:38