Scipyのpdist, cdist:n次元空間内の複数の点どうしの距離を測る

Python

scipy.spatial.distance.pdist(X, metric=’euclidean’) について
X:m×n行列(m個のn次元ベクトル(n次元空間内の点の座標)を要素に持っていると見る)
pdist(X, metric=’euclidean’):m個のベクトル\((v_1, v_2,\ldots , v_m)\)の表す点どうしの距離\(\mathrm{d}(v_i,v_{j})\; (i<j) \)を成分に持つ次のようなベクトルを出力。
$$\left( \mathrm{d}(v_1,v_2), \mathrm{d}(v_1,v_{3}),\ldots, \mathrm{d}(v_1,v_{m}),\mathrm{d}(v_2,v_{3}),\ldots, \mathrm{d}(v_2,v_{m}),\ldots, \mathrm{d}(v_{m-1},v_{m})\right)$$

squareform:pdistで出力した距離のベクトルを行列形式に変換できる。

#入力
import scipy.spatial.distance as distance
X=np.array([[1,0],[0,1],[2,0],[3,3]])
dist1=distance.pdist(X)
print(dist1)

#出力
[1.41421356 1.         3.60555128 2.23606798 3.60555128 3.16227766]
#入力
distance.squareform(dist1)

#出力
array([[0.        , 1.41421356, 1.        , 3.60555128],
       [1.41421356, 0.        , 2.23606798, 3.60555128],
       [1.        , 2.23606798, 0.        , 3.16227766],
       [3.60555128, 3.60555128, 3.16227766, 0.        ]])

#対角成分は同じ点どうしでの距離なので0となる。

scipy.spatial.distance.cdist(X, Y, metric=’euclidean’) について
X:m×n行列(m個のn次元ベクトルを要素に持っていると見る)
Y:l×n行列(l個のn次元ベクトルを要素に持っていると見る)
cdist(X, Y, metric=’euclidean’):m個のベクトルとn個のベクトルの表す点の距離行列を出力。距離はn次元空間内のユークリッド距離。
距離行列とは \(X=(v_1,v_2,\ldots, v_m), Y=(w_1,w_2,\ldots, w_l)\) のとき、2点間の距離\(d(v_i,w_j)\)を成分に持つ行列。
$$\left( \begin{array}{cccc}
\mathrm{d}(v_1,w_1) & \mathrm{d}(v_1,w_2)& \cdots & \mathrm{d}(v_1,w_l) \\
\mathrm{d}(v_2,w_1)& \mathrm{d}(v_2,w_2)& \cdots& \mathrm{d}(v_2,w_l)\\
\vdots & \vdots& \ddots & \vdots \\
\mathrm{d}(v_m,w_1)& \mathrm{d}(v_m,w_2) &\cdots & \mathrm{d}(v_m,w_l)
\end{array}\right)$$

#入力
X=np.array([[1,0],[0,1],[2,0],[3,3]])
Y=np.array([[2,0],[1,1],[3,0]])
dist2=distance.cdist(X,Y)
print(dist2)

#出力
[[1.         1.         2.        ]
 [2.23606798 1.         3.16227766]
 [0.         1.41421356 1.        ]
 [3.16227766 2.82842712 3.        ]]

参考サイトはscipy documentationのページ
https://docs.scipy.org/doc/scipy/reference/spatial.distance.html

コメント

タイトルとURLをコピーしました