質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

539閲覧

Pythonの階層クラスタを構成する葉を取得したい。

Hikoans

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/24 02:04

Pythonの scipy.cluster.hierarchyで階層クラスタリングをすると、以下のようなリンケージ行列だけが返ってきますが、簡単にクラスタを構成する葉を取ってくることは可能でしょうか?

例えば、最後のクラスタは16と17を結合していますが、この16と17に含まれる最下層の葉を全て取得したいです。

array([[ 6. , 7. , 0.63367942, 2. ],
[ 2. , 4. , 0.64049371, 2. ],
[ 1. , 10. , 0.66276945, 3. ],
[ 0. , 3. , 0.68889077, 2. ],
[ 5. , 13. , 0.80291289, 3. ],
[ 8. , 12. , 0.8065282 , 4. ],
[ 14. , 15. , 0.87251961, 7. ],
[ 9. , 11. , 1.03447273, 3. ],
[ 16. , 17. , 1.37861456, 10. ]])

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのものずばりのメソッドは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/10/25 01:12

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hikoans

2017/11/14 02:38

ご返事おそくなってすみません。素晴らしいです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問