1. ホーム
  2. python

[解決済み] 凝縮された距離行列のしくみ (pdist)

2023-07-28 15:25:17

質問

scipy.spatial.distance.pdist は凝縮された距離行列を返す。から ドキュメント :

凝縮された距離行列Yを返します。各and (where ) に対して、メトリック dist(u=X[i], v=X[j]) が計算され、エントリijに格納されます。

と思ったら ij というのは i*j . しかし、私は間違っているかもしれないと思う。考慮する

X = array([[1,2], [1,2], [3,4]])
dist_matrix = pdist(X)

とすると、ドキュメントには dist(X[0], X[2])dist_matrix[0*2] . しかし dist_matrix[0*2] は0であり、本来あるべき2.8ではありません。

が与えられたとき、2つのベクトルの類似性にアクセスするために使うべき公式は何でしょうか。 ij ?

どのように解決するのですか?

このように見ることができます。 仮に x がm×nであるとします。 の可能なペアは m の行は、一度に2つずつ選ばれて、次のようになります。 itertools.combinations(range(m), 2) の場合、例えば m=3 :

>>> import itertools
>>> list(combinations(range(3),2))
[(0, 1), (0, 2), (1, 2)]

ということは、もし d = pdist(x) は、その k のタプルは combinations(range(m), 2)) の行の添字を与える。 x に関連付けられた d[k] .

例です。

>>> x = array([[0,10],[10,10],[20,20]])
>>> pdist(x)
array([ 10.        ,  22.36067977,  14.14213562])

最初の要素は dist(x[0], x[1]) であり、2つ目は dist(x[0], x[2]) で、3番目は dist(x[1], x[2]) .

あるいは、正方形の距離行列の上三角部分の要素を、1次元の配列につなぎ合わせたものと見ることもできます。

>>> squareform(pdist(x)) 
array([[  0.   ,  10.   ,  22.361],
       [ 10.   ,   0.   ,  14.142],
       [ 22.361,  14.142,   0.   ]])

>>> y = array([[0,10],[10,10],[20,20],[10,0]])
>>> squareform(pdist(y)) 
array([[  0.   ,  10.   ,  22.361,  14.142],
       [ 10.   ,   0.   ,  14.142,  10.   ],
       [ 22.361,  14.142,   0.   ,  22.361],
       [ 14.142,  10.   ,  22.361,   0.   ]])
>>> pdist(y)
array([ 10.   ,  22.361,  14.142,  14.142,  10.   ,  22.361])