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
が計算しているもの(クラスターの割り当て)をどのように計算できますか?
私があなたを正しく理解しているなら、それは 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
はしきい値です。
すべてのクラスターレベルでメンバーを表示し、それらがどのような順序で集約されているかを確認したい場合は、 https://stackoverflow.com/a/43170608/5728789 を参照してください