pdist#
- scipy.spatial.distance.pdist(X, metric='euclidean', *, out=None, **kwargs)[源代码]#
计算 n 维空间中观测值之间的成对距离。
参见注释以了解常见的调用约定。
- 参数:
- Xarray_like
一个 m 行 n 列的数组,表示 n 维空间中的 m 个原始观测值。
- metricstr 或 function,可选
要使用的距离度量。距离函数可以是 ‘braycurtis’、‘canberra’、‘chebyshev’、‘cityblock’、‘correlation’、‘cosine’、‘dice’、‘euclidean’、‘hamming’、‘jaccard’、‘jensenshannon’、‘kulczynski1’、‘mahalanobis’、‘matching’、‘minkowski’、‘rogerstanimoto’、‘russellrao’、‘seuclidean’、‘sokalmichener’、‘sokalsneath’、‘sqeuclidean’、‘yule’。
- outndarray,可选
输出数组。如果不是 None,则压缩距离矩阵 Y 存储在此数组中。
- **kwargsdict,可选
传递给 metric 的额外参数:有关所有可能参数的列表,请参阅每个度量的文档。
一些可能的参数
p : 标量 应用于 Minkowski 的 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
。以下是常见的调用约定。
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')
计算点之间的 Jaccard 距离。给定两个向量,
u
和v
,Jaccard 距离是那些不一致的元素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')
计算点之间的 Chebyshev 距离。两个 n 向量
u
和v
之间的 Chebyshev 距离是它们各自元素之间的最大范数-1 距离。更准确地说,距离由下式给出\[d(u,v) = \max_i {|u_i-v_i|}\]Y = pdist(X, 'canberra')
计算点之间的 Canberra 距离。两个点
u
和v
之间的 Canberra 距离为\[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)
计算点之间的 Mahalanobis 距离。两个点
u
和v
之间的 Mahalanobis 距离是 \(\sqrt{(u-v)(1/V)(u-v)^T}\),其中 \((1/V)\)(VI
变量)是逆协方差。如果VI
不是 None,则VI
将用作逆协方差矩阵。Y = pdist(X, 'yule')
计算每对布尔向量之间的 Yule 距离。(参见 yule 函数文档)
Y = pdist(X, 'matching')
‘hamming’ 的同义词。
Y = pdist(X, 'dice')
计算每对布尔向量之间的 Dice 距离。(参见 dice 函数文档)
Y = pdist(X, 'kulczynski1')
计算每对布尔向量之间的 kulczynski1 距离。(参见 kulczynski1 函数文档)
自版本 1.15.0 起已弃用:此度量已弃用,将在 SciPy 1.17.0 中删除。使用
1 / pdist(X, 'jaccard') - 1
替换pdist(X, 'kulczynski1')
的用法。Y = pdist(X, 'rogerstanimoto')
计算每对布尔向量之间的 Rogers-Tanimoto 距离。(参见 rogerstanimoto 函数文档)
Y = pdist(X, 'russellrao')
计算每对布尔向量之间的 Russell-Rao 距离。(参见 russellrao 函数文档)
Y = pdist(X, 'sokalmichener')
计算每对布尔向量之间的 Sokal-Michener 距离。(参见 sokalmichener 函数文档)
自版本 1.15.0 起已弃用:此度量已弃用,将在 SciPy 1.17.0 中删除。使用
pdist(X, 'rogerstanimoto')
替换pdist(X, 'sokalmichener')
的用法。Y = pdist(X, 'sokalsneath')
计算每对布尔向量之间的 Sokal-Sneath 距离。(参见 sokalsneath 函数文档)
Y = pdist(X, 'kulczynski1')
计算每对布尔向量之间的 Kulczynski 1 距离。(参见 kulczynski1 函数文档)
Y = pdist(X, f)
使用用户提供的 2 元函数 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.])