web-dev-qa-db-ja.com

scipy.cluster.hierarchy.linkage()で距離行列を使用しますか?

距離行列n * n Mがあります。ここで、_M_ij_は_object_i_と_object_j_の間の距離です。したがって、予想通り、次の形式になります。

_   /  0     M_01    M_02    ...    M_0n\
   | M_10    0      M_12    ...    M_1n |
   | M_20   M_21     0      ...    M2_n |
   |                ...                 |
   \ M_n0   M_n2    M_n2    ...      0 / 
_

次に、これらのn個のオブジェクトを階層的クラスタリングでクラスター化したいと思います。 Pythonには、これと呼ばれるscipy.cluster.hierarchy.linkage(y, method='single', metric='euclidean')の実装があります。

そのドキュメント は言う:

yは{n\choose 2}サイズのベクトルでなければなりません。ここで、nは距離行列でペアにされた元の観測値の数です。

y:ndarray

圧縮または冗長距離マトリックス。圧縮距離行列は、距離行列の上三角を含むフラット配列です。これは、pdistが返す形式です。または、n次元のm個の観測ベクトルのコレクションをm行n列の配列として渡すこともできます。

yの説明に戸惑っています。 _Mを入力として直接入力できますかy


更新

@ hongbo-zhu-cn この問題はGitHubで発生しています 。これがまさに私が心配していることです。ただし、GitHubの初心者として、私はそれがどのように機能するのかわからないため、この問題の処理方法を知りません。

38
Sibbs Gambling

実際には冗長な正方行列を直接渡すことはできないようですが、ドキュメントではそうすることができると主張しています。

将来同じ問題に直面するすべての人に利益をもたらすために、ここに追加の回答として私の解決策を書きます。したがって、コピーアンドペーストの担当者はクラスタリングを続行できます。

次のスニペットを使用して、マトリックスを圧縮し、喜んで続行します。

import scipy.spatial.distance as ssd
# convert the redundant n*n square matrix form into a condensed nC2 array
    distArray = ssd.squareform(distMatrix) # distArray[{n choose 2}-{n-i choose 2} + (j-i-1)] is the distance between points i and j

私が間違っていたら訂正してください。

41
Sibbs Gambling

ここでは、「圧縮された距離行列」、つまり距離行列の上三角のみをベクトル形式で渡す必要があります。

y = M[np.triu_indices(n,1)]

@ hongbo-zhu-cnのプルリクエストの説明 は、ユーザーが明示的に指定できるようにするlinkage関数にキーワード引数を追加することで解決するようですmxn観測値ではなく、nxn距離行列で渡されていることマトリックス。

10
ali_m