scipy.spatial.distance.

cdist#

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

计算两组输入中每对之间的距离。

请参阅“注释”以了解常见的调用约定。

参数:
XAarray_like

一个 \(m_A\)\(n\) 列的数组,表示 \(n\) 维空间中 \(m_A\) 个原始观测值。输入会被转换为浮点类型。

XBarray_like

一个 \(m_B\)\(n\) 列的数组,表示 \(n\) 维空间中 \(m_B\) 个原始观测值。输入会被转换为浮点类型。

metricstr 或 callable, 可选

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

**kwargsdict, 可选

传递给 metric 的额外参数:有关所有可能的参数列表,请参阅每个度量文档。

一些可能的参数

p : 标量,用于 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.)

    使用闵可夫斯基距离 \(\|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 函数文档)

    自 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 函数文档)

    自 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)

    使用用户提供的二元函数 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')
    

示例

查找四个二维坐标之间的欧几里得距离

>>> 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.    ]])

查找从 3D 点到单位立方体顶点的曼哈顿距离

>>> 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]])