pdist#
- scipy.spatial.distance.pdist(X, metric='euclidean', *, out=None, **kwargs)[原始碼]#
計算 n 維空間中成對觀察值之間的距離。
請參閱「備註」以了解常見的呼叫慣例。
- 參數:
- Xarray_like
一個 m 乘 n 的陣列,包含 m 個在 n 維空間中的原始觀察值。
- metricstr 或 函數, optional
要使用的距離度量。距離函數可以是 ‘braycurtis’、‘canberra’、‘chebyshev’、‘cityblock’、‘correlation’、‘cosine’、‘dice’、‘euclidean’、‘hamming’、‘jaccard’、‘jensenshannon’、‘kulczynski1’、‘mahalanobis’、‘matching’、‘minkowski’、‘rogerstanimoto’、‘russellrao’、‘seuclidean’、‘sokalmichener’、‘sokalsneath’、‘sqeuclidean’、‘yule’。
- outndarray, optional
輸出陣列。如果不是 None,則壓縮距離矩陣 Y 會儲存在此陣列中。
- **kwargsdict, optional
傳遞給 metric 的額外參數:請參閱每個度量文件的所有可能參數列表。
一些可能的參數
p : scalar Minkowski 的 p-norm,加權和不加權。預設值:2。
w : ndarray 支援權重的度量的權重向量(例如,Minkowski)。
V : ndarray 標準化歐幾里得距離的變異數向量。預設值:var(X, axis=0, ddof=1)
VI : ndarray 馬氏距離的共變異數矩陣的反矩陣。預設值:inv(cov(X.T)).T
- 回傳值:
- Yndarray
回傳壓縮距離矩陣 Y。對於每個 \(i\) 和 \(j\) (其中 \(i<j<m\)),其中 m 是原始觀察值的數量。度量
dist(u=X[i], v=X[j])
會被計算並儲存在條目m * i + j - ((i + 2) * (i + 1)) // 2
中。
參見
squareform
在壓縮距離矩陣和方形距離矩陣之間轉換。
備註
請參閱
squareform
以取得關於如何計算此條目的索引,或將壓縮距離矩陣轉換為冗餘方形矩陣的資訊。以下是常見的呼叫慣例。
Y = pdist(X, 'euclidean')
使用歐幾里得距離(2-範數)作為點之間的距離度量,計算 m 個點之間的距離。這些點排列為矩陣 X 中的 m 個 n 維列向量。
Y = pdist(X, 'minkowski', p=2.)
使用 Minkowski 距離 \(\|u-v\|_p\) (\(p\)-範數) 計算距離,其中 \(p > 0\) (請注意,如果 \(0 < p < 1\),這只是一個準度量)。
Y = pdist(X, 'cityblock')
計算點之間的城市街區距離或曼哈頓距離。
Y = pdist(X, 'seuclidean', V=None)
計算標準化歐幾里得距離。兩個 n 維向量
u
和v
之間的標準化歐幾里得距離為\[\sqrt{\sum {(u_i-v_i)^2 / V[x_i]}}\]V 是變異數向量;V[i] 是在點的所有第 i 個分量上計算的變異數。如果未傳遞,則會自動計算。
Y = pdist(X, 'sqeuclidean')
計算向量之間的平方歐幾里得距離 \(\|u-v\|_2^2\)。
Y = pdist(X, 'cosine')
計算向量 u 和 v 之間的餘弦距離,
\[1 - \frac{u \cdot v} {{\|u\|}_2 {\|v\|}_2}\]其中 \(\|*\|_2\) 是其參數
*
的 2-範數,而 \(u \cdot v\) 是u
和v
的點積。Y = pdist(X, 'correlation')
計算向量 u 和 v 之間的相關距離。這是
\[1 - \frac{(u - \bar{u}) \cdot (v - \bar{v})} {{\|(u - \bar{u})\|}_2 {\|(v - \bar{v})\|}_2}\]其中 \(\bar{v}\) 是向量 v 的元素的平均值,而 \(x \cdot y\) 是 \(x\) 和 \(y\) 的點積。
Y = pdist(X, 'hamming')
計算標準化的漢明距離,或兩個 n 維向量
u
和v
之間不一致的向量元素的比例。為了節省記憶體,矩陣X
可以是布林類型。Y = pdist(X, 'jaccard')
計算點之間的傑卡德距離。給定兩個向量
u
和v
,傑卡德距離是不一致的元素u[i]
和v[i]
的比例。Y = pdist(X, 'jensenshannon')
計算兩個機率陣列之間的 Jensen-Shannon 距離。給定兩個機率向量 \(p\) 和 \(q\),Jensen-Shannon 距離為
\[\sqrt{\frac{D(p \parallel m) + D(q \parallel m)}{2}}\]其中 \(m\) 是 \(p\) 和 \(q\) 的逐點平均值,而 \(D\) 是 Kullback-Leibler 散度。
Y = pdist(X, 'chebyshev')
計算點之間的切比雪夫距離。兩個 n 維向量
u
和v
之間的切比雪夫距離是它們各自元素之間的最大範數-1 距離。更精確地說,距離由下式給出\[d(u,v) = \max_i {|u_i-v_i|}\]Y = pdist(X, 'canberra')
計算點之間的坎培拉距離。兩個點
u
和v
之間的坎培拉距離為\[d(u,v) = \sum_i \frac{|u_i-v_i|} {|u_i|+|v_i|}\]Y = pdist(X, 'braycurtis')
計算點之間的 Bray-Curtis 距離。兩個點
u
和v
之間的 Bray-Curtis 距離為\[d(u,v) = \frac{\sum_i {|u_i-v_i|}} {\sum_i {|u_i+v_i|}}\]Y = pdist(X, 'mahalanobis', VI=None)
計算點之間的馬氏距離。兩個點
u
和v
之間的馬氏距離為 \(\sqrt{(u-v)(1/V)(u-v)^T}\),其中 \((1/V)\)(VI
變數)是逆共變異數。如果VI
不是 None,則VI
將用作逆共變異數矩陣。Y = pdist(X, 'yule')
計算每對布林向量之間的尤爾距離。(請參閱 yule 函數文件)
Y = pdist(X, 'matching')
‘hamming’ 的同義詞。
Y = pdist(X, 'dice')
計算每對布林向量之間的 Dice 距離。(請參閱 dice 函數文件)
Y = pdist(X, 'kulczynski1')
計算每對布林向量之間的 kulczynski1 距離。(請參閱 kulczynski1 函數文件)
Deprecated since version 1.15.0: 此度量已被棄用,並將在 SciPy 1.17.0 中移除。請將
pdist(X, 'kulczynski1')
的用法替換為1 / pdist(X, 'jaccard') - 1
。Y = pdist(X, 'rogerstanimoto')
計算每對布林向量之間的 Rogers-Tanimoto 距離。(請參閱 rogerstanimoto 函數文件)
Y = pdist(X, 'russellrao')
計算每對布林向量之間的 Russell-Rao 距離。(請參閱 russellrao 函數文件)
Y = pdist(X, 'sokalmichener')
計算每對布林向量之間的 Sokal-Michener 距離。(請參閱 sokalmichener 函數文件)
Deprecated since version 1.15.0: 此度量已被棄用,並將在 SciPy 1.17.0 中移除。請將
pdist(X, 'sokalmichener')
的用法替換為pdist(X, 'rogerstanimoto')
。Y = pdist(X, 'sokalsneath')
計算每對布林向量之間的 Sokal-Sneath 距離。(請參閱 sokalsneath 函數文件)
Y = pdist(X, 'kulczynski1')
計算每對布林向量之間的 Kulczynski 1 距離。(請參閱 kulczynski1 函數文件)
Y = pdist(X, f)
使用使用者提供的二元函數 f 計算 X 中所有向量對之間的距離。例如,向量之間的歐幾里得距離可以如下計算
dm = pdist(X, lambda u, v: np.sqrt(((u-v)**2).sum()))
請注意,您應避免傳遞對此程式庫中定義的距離函數之一的參考。例如,
dm = pdist(X, sokalsneath)
將使用 Python 函數 sokalsneath 計算 X 中向量之間的成對距離。這將導致 sokalsneath 被呼叫 \({n \choose 2}\) 次,這是低效率的。相反,最佳化的 C 版本更有效率,我們可以使用以下語法呼叫它。
dm = pdist(X, 'sokalsneath')
範例
>>> import numpy as np >>> from scipy.spatial.distance import pdist
x
是一個三維空間中五個點的陣列。>>> x = np.array([[2, 0, 2], [2, 2, 3], [-2, 4, 5], [0, 1, 9], [2, 2, 4]])
pdist(x)
在沒有額外參數的情況下計算 10 個成對歐幾里得距離>>> pdist(x) array([2.23606798, 6.40312424, 7.34846923, 2.82842712, 4.89897949, 6.40312424, 1. , 5.38516481, 4.58257569, 5.47722558])
以下計算
p = 3.5
的成對 Minkowski 距離>>> pdist(x, metric='minkowski', p=3.5) array([2.04898923, 5.1154929 , 7.02700737, 2.43802731, 4.19042714, 6.03956994, 1. , 4.45128103, 4.10636143, 5.0619695 ])
成對城市街區距離或曼哈頓距離
>>> pdist(x, metric='cityblock') array([ 3., 11., 10., 4., 8., 9., 1., 9., 7., 8.])