pdist#
- scipy.spatial.distance.pdist(X, metric='euclidean', *, out=None, **kwargs)[源代码]#
计算 n 维空间中观测值之间的成对距离。
有关常用调用约定,请参阅“说明”。
- 参数:
- Xarray_like
m 行 n 列的数组,包含 n 维空间中的 m 个原始观测值。
- metricstr 或函数,可选
要使用的距离度量。距离函数可以是“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')
计算点之间的切比雪夫距离。两个 n 向量
u
和v
之间的切比雪夫距离是它们各自元素之间的最大范数 1 距离。更准确地说,距离由下式给出\[d(u,v) = \max_i {|u_i-v_i|}\]Y = pdist(X, 'canberra')
计算点之间的堪培拉距离。两个点
u
和v
之间的堪培拉距离为\[d(u,v) = \sum_i \frac{|u_i-v_i|} {|u_i|+|v_i|}\]Y = pdist(X, 'braycurtis')
计算点之间的布雷-柯蒂斯距离。两个点
u
和v
之间的布雷-柯蒂斯距离为\[d(u,v) = \frac{\sum_i {|u_i-v_i|}} {\sum_i {|u_i+v_i|}}\]Y = pdist(X, 'mahalanobis', VI=None)
计算点之间的马氏距离。两个点
u
和v
之间的马氏距离为 \(\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, 'sokalmichener')
的用法替换为pdist(X, 'rogerstanimoto')
。Y = pdist(X, 'sokalsneath')
计算每对布尔向量之间的 Sokal-Sneath 距离。(请参阅 sokalsneath 函数文档)
Y = pdist(X, 'kulczynski1')
计算每对布尔向量之间的 Kulczynski 1 距离。(请参阅 kulczynski1 函数文档)
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])
以下计算
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.])