距離行列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の初心者として、私はそれがどのように機能するのかわからないため、この問題の処理方法を知りません。
実際には冗長な正方行列を直接渡すことはできないようですが、ドキュメントではそうすることができると主張しています。
将来同じ問題に直面するすべての人に利益をもたらすために、ここに追加の回答として私の解決策を書きます。したがって、コピーアンドペーストの担当者はクラスタリングを続行できます。
次のスニペットを使用して、マトリックスを圧縮し、喜んで続行します。
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
私が間違っていたら訂正してください。
ここでは、「圧縮された距離行列」、つまり距離行列の上三角のみをベクトル形式で渡す必要があります。
y = M[np.triu_indices(n,1)]
@ hongbo-zhu-cnのプルリクエストの説明 は、ユーザーが明示的に指定できるようにするlinkage
関数にキーワード引数を追加することで解決するようですmxn観測値ではなく、nxn距離行列で渡されていることマトリックス。