web-dev-qa-db-ja.com

Pythonのscipyのリンケージ/距離行列からクラスター割り当てを計算する方法は?

pythonのscipyでこの階層的クラスタリング呼び出しがある場合:

from scipy.cluster.hierarchy import linkage
# dist_matrix is long form distance matrix
linkage_matrix = linkage(squareform(dist_matrix), linkage_method)

それでは、これから個々のポイントのクラスター割り当てに移行するための効率的な方法は何ですか?つまり、長さNのベクトル。ここで、Nはポイントの数です。ここで、各エントリiは、クラスターの数が与えられた場合のポイントiのクラスター番号です。結果のクラスタリングで指定されたしきい値threshによって生成されますか?

明確にするために:クラスター番号は、ツリーにしきい値を適用した後のクラスターになります。その場合、それが含まれるクラスターのリーフノードごとに一意のクラスターを取得します。各ポイントが樹状図を切り取るしきい値によって定義される1つの「最も特定のクラスター」に属するという意味で一意です。

そんなこと知ってる scipy.cluster.hierarchy.fclusterdataは、このクラスター割り当てを戻り値として提供しますが、カスタムメイドの距離行列と距離メトリックから始めているため、fclusterdataを使用できません。質問は要約すると、fclusterdataが計算しているもの(クラスターの割り当て)をどのように計算できますか?

22
user248237

私があなたを正しく理解しているなら、それは fcluster がすることです:

scipy.cluster.hierarchy.fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)

リンケージ行列Zで定義された階層的クラスタリングからフラットクラスターを形成します。

.。

戻り値:長さnの配列。 T [i]は、元の観測値iが属するフラットクラスター番号です。

したがって、fcluster(linkage_matrix, t)を呼び出すだけです。ここで、tはしきい値です。

23
BrenBarn

すべてのクラスターレベルでメンバーを表示し、それらがどのような順序で集約されているかを確認したい場合は、 https://stackoverflow.com/a/43170608/5728789 を参照してください