scipy.spatial.distance.

pdist#

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

n维空间中观测值之间的成对距离。

参见注释以了解常见的调用约定。

参数:
Xarray_like

一个 m 乘 n 的数组,表示在 n 维空间中的 m 个原始观测值。

指标str 或 function,可选

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

ndarray,可选

输出数组。如果非空,压缩距离矩阵 Y 将存储在此数组中。

**kwargsdict, 可选

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

一些可能的参数:

p : 标量 应用于闵可夫斯基、加权和非加权的 p-范数。默认值: 2。

w : ndarray 支持权重的度量(例如,Minkowski)的权重向量。

V : ndarray 标准化欧几里得距离的方差向量。默认值: var(X, axis=0, ddof=1)

VI : ndarray Mahalanobis 协方差矩阵的逆。默认值: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

以下是常见的调用约定。

  1. Y = pdist(X, 'euclidean')

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

  2. Y = pdist(X, 'minkowski', p=2.)

    使用Minkowski距离计算距离 \(\|u-v\|_p\) (\(p\)-范数),其中 \(p > 0`(注意,当 :math:`0 < p < 1\) 时,这只是一个拟度量)。

  3. Y = pdist(X, 'cityblock')

    计算点之间的城市街区或曼哈顿距离。

  4. Y = pdist(X, 'seuclidean', V=None)

    计算标准化的欧几里得距离。两个 n 维向量 uv 之间的标准化欧几里得距离为

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

    V 是方差向量;V[i] 是所有点的第 i 个分量计算出的方差。如果没有传递,它将自动计算。

  5. Y = pdist(X, 'sqeuclidean')

    计算向量之间的平方欧几里得距离 \(\|u-v\|_2^2\)

  6. Y = pdist(X, 'cosine')

    计算向量 u 和 v 之间的余弦距离,

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

    其中 \(\|*\|_2\) 是其参数 * 的 2-范数,而 \(u \cdot v\)uv 的点积。

  7. 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\) 的点积。

  8. Y = pdist(X, 'hamming')

    计算两个 n 维向量 uv 之间归一化的汉明距离,即这两个向量元素中不一致的比例。为了节省内存,矩阵 X 可以是布尔类型。

  9. Y = pdist(X, 'jaccard')

    计算点之间的Jaccard距离。给定两个向量,uv,Jaccard距离是那些元素 u[i]v[i] 不一致的比例。

  10. 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 散度。

  11. Y = pdist(X, 'chebyshev')

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

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

    计算点之间的堪培拉距离。两点 uv 之间的堪培拉距离是

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

    计算点之间的 Bray-Curtis 距离。两点 uv 之间的 Bray-Curtis 距离是

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

    计算点之间的马氏距离。两点 uv 之间的马氏距离为 \(\sqrt{(u-v)(1/V)(u-v)^T}\),其中 \((1/V)`(即 ``VI`\) 变量)是协方差的逆。如果 VI 不为 None,则 VI 将被用作协方差矩阵的逆。

  15. Y = pdist(X, 'yule')

    计算每对布尔向量之间的 Yule 距离。(参见 yule 函数文档)

  16. Y = pdist(X, 'matching')

    “hamming”的同义词。

  17. Y = pdist(X, 'dice')

    计算每对布尔向量之间的Dice距离。(参见dice函数文档)

  18. Y = pdist(X, 'kulczynski1')

    计算每对布尔向量之间的kulczynski1距离。(参见kulczynski1函数文档)

  19. Y = pdist(X, 'rogerstanimoto')

    计算每对布尔向量之间的Rogers-Tanimoto距离。(参见rogerstanimoto函数文档)

  20. Y = pdist(X, 'russellrao')

    计算每对布尔向量之间的Russell-Rao距离。(参见russellrao函数的文档)

  21. Y = pdist(X, 'sokalmichener')

    计算每对布尔向量之间的 Sokal-Michener 距离。(参见 sokalmichener 函数文档)

  22. Y = pdist(X, 'sokalsneath')

    计算每对布尔向量之间的 Sokal-Sneath 距离。(参见 sokalsneath 函数文档)

  23. Y = pdist(X, 'kulczynski1')

    计算每对布尔向量之间的 Kulczynski 1 距离。(参见 kulczynski1 函数文档)

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

以下计算了成对 Minkowski 距离,其中 p = 3.5

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