scipy.spatial.distance.

cdist#

scipy.spatial.distance.cdist(XA, XB, metric='euclidean', *, out=None, **kwargs)[source]#

計算兩組輸入集合中每對輸入之間的距離。

請參閱「註解」以了解常見的呼叫慣例。

參數:
XAarray_like

一個 \(m_A\)\(n\) 的陣列,包含 \(m_A\) 個在 \(n\) 維空間中的原始觀測值。輸入會轉換為浮點類型。

XBarray_like

一個 \(m_B\)\(n\) 的陣列,包含 \(m_B\) 個在 \(n\) 維空間中的原始觀測值。輸入會轉換為浮點類型。

metricstr 或 callable, optional

要使用的距離度量。如果是一個字串,距離函數可以是 ‘braycurtis’、‘canberra’、‘chebyshev’、‘cityblock’、‘correlation’、‘cosine’、‘dice’、‘euclidean’、‘hamming’、‘jaccard’、‘jensenshannon’、‘kulczynski1’、‘mahalanobis’、‘matching’、‘minkowski’、‘rogerstanimoto’、‘russellrao’、‘seuclidean’、‘sokalmichener’、‘sokalsneath’、‘sqeuclidean’、‘yule’。

**kwargsdict, optional

傳遞給 metric 的額外參數:請參閱每個度量文件的可能參數列表。

一些可能的參數

p : scalar Minkowski 的 p-範數,加權和非加權。預設值:2。

w : array_like 支援權重的度量的權重向量(例如,Minkowski)。

V : array_like 標準化歐幾里得距離的變異數向量。預設值:var(vstack([XA, XB]), axis=0, ddof=1)

VI : array_like 馬氏距離的共變異數矩陣的反矩陣。預設值:inv(cov(vstack([XA, XB].T))).T

out : ndarray 輸出陣列。如果不是 None,距離矩陣 Y 將儲存在此陣列中。

返回:
Yndarray

返回一個 \(m_A\)\(m_B\) 的距離矩陣。對於每個 \(i\)\(j\),度量 dist(u=XA[i], v=XB[j]) 會被計算並儲存在第 \(ij\) 個條目中。

引發:
ValueError

如果 XAXB 沒有相同的列數,則會拋出例外。

註解

以下是一些常見的呼叫慣例

  1. Y = cdist(XA, XB, 'euclidean')

    使用歐幾里得距離(2-範數)作為點之間的距離度量,計算 \(m\) 個點之間的距離。這些點排列在矩陣 X 中,作為 \(m\)\(n\) 維的行向量。

  2. Y = cdist(XA, XB, 'minkowski', p=2.)

    使用 Minkowski 距離 \(\|u-v\|_p\) (\(p\)-範數) 計算距離,其中 \(p > 0\)(請注意,如果 \(0 < p < 1\),這只是一個準度量)。

  3. Y = cdist(XA, XB, 'cityblock')

    計算點之間的城市街區或曼哈頓距離。

  4. Y = cdist(XA, XB, 'seuclidean', V=None)

    計算標準化歐幾里得距離。兩個 n 維向量 uv 之間的標準化歐幾里得距離為

    \[\sqrt{\sum {(u_i-v_i)^2 / V[x_i]}}.\]

    V 是變異數向量;V[i] 是在點的所有第 i 個分量上計算的變異數。如果未傳遞,則會自動計算。

  5. Y = cdist(XA, XB, 'sqeuclidean')

    計算向量之間的平方歐幾里得距離 \(\|u-v\|_2^2\)

  6. Y = cdist(XA, XB, 'cosine')

    計算向量 u 和 v 之間的餘弦距離,

    \[1 - \frac{u \cdot v} {{\|u\|}_2 {\|v\|}_2}\]

    其中 \(\|*\|_2\) 是其參數 * 的 2-範數,而 \(u \cdot v\)\(u\)\(v\) 的點積。

  7. Y = cdist(XA, XB, '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\) 的點積。

  8. Y = cdist(XA, XB, 'hamming')

    計算標準化的漢明距離,或兩個 n 維向量 uv 之間不一致的向量元素的比例。為了節省記憶體,矩陣 X 可以是布林類型。

  9. Y = cdist(XA, XB, 'jaccard')

    計算點之間的傑卡德距離。給定兩個向量 uv,傑卡德距離是不一致的元素 u[i]v[i] 的比例,其中至少一個是非零的。

  10. Y = cdist(XA, XB, 'jensenshannon')

    計算兩個機率陣列之間的 Jensen-Shannon 距離。給定兩個機率向量 \(p\)\(q\),Jensen-Shannon 距離為

    \[\sqrt{\frac{D(p \parallel m) + D(q \parallel m)}{2}}\]

    其中 \(m\)\(p\)\(q\) 的逐點平均值,而 \(D\) 是 Kullback-Leibler 散度。

  11. Y = cdist(XA, XB, 'chebyshev')

    計算點之間的切比雪夫距離。兩個 n 維向量 uv 之間的切比雪夫距離是它們各自元素之間的最大範數-1 距離。更精確地說,距離由下式給出

    \[d(u,v) = \max_i {|u_i-v_i|}.\]
  12. Y = cdist(XA, XB, 'canberra')

    計算點之間的坎培拉距離。兩個點 uv 之間的坎培拉距離為

    \[d(u,v) = \sum_i \frac{|u_i-v_i|} {|u_i|+|v_i|}.\]
  13. Y = cdist(XA, XB, 'braycurtis')

    計算點之間的 Bray-Curtis 距離。兩個點 uv 之間的 Bray-Curtis 距離為

    \[d(u,v) = \frac{\sum_i (|u_i-v_i|)} {\sum_i (|u_i+v_i|)}\]
  14. Y = cdist(XA, XB, 'mahalanobis', VI=None)

    計算點之間的馬氏距離。兩個點 uv 之間的馬氏距離為 \(\sqrt{(u-v)(1/V)(u-v)^T}\),其中 \((1/V)\)VI 變數)是逆共變異數。如果 VI 不是 None,則 VI 將用作逆共變異數矩陣。

  15. Y = cdist(XA, XB, 'yule')

    計算布林向量之間的 Yule 距離。(請參閱 yule 函數文件)

  16. Y = cdist(XA, XB, 'matching')

    ‘hamming’ 的同義詞。

  17. Y = cdist(XA, XB, 'dice')

    計算布林向量之間的 Dice 距離。(請參閱 dice 函數文件)

  18. Y = cdist(XA, XB, 'kulczynski1')

    計算布林向量之間的 kulczynski 距離。(請參閱 kulczynski1 函數文件)

    Deprecated since version 1.15.0: 此度量已棄用,將在 SciPy 1.17.0 中移除。將 cdist(XA, XB, 'kulczynski1') 的用法替換為 1 / cdist(XA, XB, 'jaccard') - 1

  19. Y = cdist(XA, XB, 'rogerstanimoto')

    計算布林向量之間的 Rogers-Tanimoto 距離。(請參閱 rogerstanimoto 函數文件)

  20. Y = cdist(XA, XB, 'russellrao')

    計算布林向量之間的 Russell-Rao 距離。(請參閱 russellrao 函數文件)

  21. Y = cdist(XA, XB, 'sokalmichener')

    計算布林向量之間的 Sokal-Michener 距離。(請參閱 sokalmichener 函數文件)

    Deprecated since version 1.15.0: 此度量已棄用,將在 SciPy 1.17.0 中移除。將 cdist(XA, XB, 'sokalmichener') 的用法替換為 cdist(XA, XB, 'rogerstanimoto')

  22. Y = cdist(XA, XB, 'sokalsneath')

    計算向量之間的 Sokal-Sneath 距離。(請參閱 sokalsneath 函數文件)

  23. Y = cdist(XA, XB, f)

    使用使用者提供的 2 元函數 f 計算 X 中所有向量對之間的距離。例如,向量之間的歐幾里得距離可以如下計算

    dm = cdist(XA, XB, lambda u, v: np.sqrt(((u-v)**2).sum()))
    

    請注意,您應該避免傳遞對此庫中定義的距離函數之一的引用。例如,

    dm = cdist(XA, XB, sokalsneath)
    

    將使用 Python 函數 sokalsneath 計算 X 中向量之間的成對距離。這將導致 \({n \choose 2}\) 次調用 sokalsneath,這是低效的。相反,優化的 C 版本更有效率,我們可以使用以下語法調用它

    dm = cdist(XA, XB, 'sokalsneath')
    

範例

找出四個 2-D 坐標之間的歐幾里得距離

>>> from scipy.spatial import distance
>>> import numpy as np
>>> coords = [(35.0456, -85.2672),
...           (35.1174, -89.9711),
...           (35.9728, -83.9422),
...           (36.1667, -86.7833)]
>>> distance.cdist(coords, coords, 'euclidean')
array([[ 0.    ,  4.7044,  1.6172,  1.8856],
       [ 4.7044,  0.    ,  6.0893,  3.3561],
       [ 1.6172,  6.0893,  0.    ,  2.8477],
       [ 1.8856,  3.3561,  2.8477,  0.    ]])

找出從 3-D 點到單位立方體角落的曼哈頓距離

>>> a = np.array([[0, 0, 0],
...               [0, 0, 1],
...               [0, 1, 0],
...               [0, 1, 1],
...               [1, 0, 0],
...               [1, 0, 1],
...               [1, 1, 0],
...               [1, 1, 1]])
>>> b = np.array([[ 0.1,  0.2,  0.4]])
>>> distance.cdist(a, b, 'cityblock')
array([[ 0.7],
       [ 0.9],
       [ 1.3],
       [ 1.5],
       [ 1.5],
       [ 1.7],
       [ 2.1],
       [ 2.3]])