scipy.spatial.distance.cdist

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

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

有关常见的调用约定,请参阅注释。

参数
XAarray_like

一个 \(m_A\) 通过 \(n\) 数组 \(m_A\) 原始观测数据在一个 \(n\) -维度空间。输入转换为浮点类型。

XBarray_like

一个 \(m_B\) 通过 \(n\) 数组 \(m_B\) 原始观测数据在一个 \(n\) -维度空间。输入转换为浮点类型。

metric字符串或可调用,可选

要使用的距离度量。如果是字符串,则距离函数可以是‘braycurtis’,‘堪培拉’,‘Chebyshev’,‘cityblock’,‘Correlation’,‘cosine’,‘Dice’,‘Euclides’,‘Hamming’,‘Jaccard’,‘jensenshannon’,‘kulsinski’,‘kulczynski 1’,‘Mahalanobis’,‘Matching’,‘Minkowski’,‘rogerstanimoto’,

**kwargsDICT,可选

的额外参数 metric :有关所有可能参数的列表,请参阅每个指标文档。

一些可能的论点:

p:适用于Minkowski的标量p-范数,加权和未加权。默认值:2。

W:array_like支持权重的指标的权重向量(例如,Minkowski)。

V:类似数组的标准化欧几里得的方差向量。默认值:var(vstack( [Xa、Xb] ),轴=0,ddof=1)

VI:类似数组的马氏协方差矩阵的逆。默认值:inv(cov(vstack( [Xa、Xb] .T)).T

输出:对输出数组进行扫描如果不是无,则距离矩阵Y存储在此数组中。

退货
Yndarray

A \(m_A\) 通过 \(m_B\) 返回距离矩阵。对于每个 \(i\)\(j\) ,公制 dist(u=XA[i], v=XB[j]) 被计算并存储在 \(ij\) 这个条目。

加薪
ValueError

如果出现以下情况,则会引发异常 XAXB 列数不同。

注意事项

以下是常见的调用约定:

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

    计算 \(m\) 使用欧几里得距离(2范数)作为点之间的距离度量的点。这些点的排列方式如下 \(m\) \(n\) 矩阵X中的维行向量。

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

    Computes the distances using the Minkowski distance \(||u-v||_p\) (\(p\)-norm) where \(p \geq 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')

    计算点之间的Jaccard距离。给出两个矢量, uv ,Jaccard距离就是这些元素的比例 u[i]v[i] 在它们中至少有一个是非零的情况下,这一点是不一致的。

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

    计算两个概率数组之间的Jensen-Shannon距离。给定两个概率向量, \(p\)\(q\) ,Jensen-Shannon距离为

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

    哪里 \(m\) 是按点表示的平均值 \(p\)\(q\)\(D\) 就是库尔巴克-莱布勒发散。

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

    计算点之间的切比雪夫距离。两个n维向量之间的切比雪夫距离 uv 是它们各自元素之间的最大范数距离。更准确地说,距离是由以下公式给出的

    \[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距离。两点间的Bray-Curtis距离 uv

    \[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 不是没有, VI 将用作逆协方差矩阵。

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

    计算布尔向量之间的Yule距离。(请参阅 yule 功能文档)

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

    “汉明”的同义词。

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

    计算布尔向量之间的骰子距离。(请参阅 dice 功能文档)

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

    计算布尔向量之间的Kulsinski距离。(请参阅 kulsinski 功能文档)

  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 功能文档)

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

    计算向量之间的Sokal-Sneath距离。(请参阅 sokalsneath 功能文档)

  23. Y = cdist(XA, XB, 'wminkowski', p=2., w=w)

    计算矢量之间的加权Minkowski距离。(请参阅 wminkowski 功能文档)

    “wminkowski”已弃用,将在本网站1.8.0中删除。用‘Minkowski’代替。

  24. 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函数计算X中矢量之间的成对距离 sokalsneath 。这将导致调用sokalkinath \({{n \choose 2}}\) 倍,这是低效的。相反,优化的C版本效率更高,我们使用以下语法调用它:

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

示例

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

>>> from scipy.spatial import distance
>>> 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.    ]])

找出从三维点到单位立方体角点的曼哈顿距离:

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