cdist#
- scipy.spatial.distance.cdist(XA, XB, metric='euclidean', *, out=None, **kwargs)[源代码]#
计算两组输入中每对之间的距离。
有关常见的调用约定,请参见注释。
- 参数:
- XA类数组
一个 \(m_A\) 乘以 \(n\) 的数组,包含 \(m_A\) 个原始观测值,位于 \(n\) 维空间中。输入会被转换为浮点类型。
- XB类数组
一个 \(m_B\) 乘以 \(n\) 的数组,包含 \(m_B\) 个原始观测值,位于 \(n\) 维空间中。输入会被转换为浮点类型。
- metricstr 或可调用对象,可选
要使用的距离度量。如果是一个字符串,距离函数可以是 ‘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 : 类数组 支持权重的度量的权重向量(例如,Minkowski)。
V : 类数组 标准化欧几里得的方差向量。默认值:var(vstack([XA, XB]), axis=0, ddof=1)
VI : 类数组 Mahalanobis 的协方差矩阵的逆矩阵。默认值: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
如果 XA 和 XB 没有相同数量的列,则会抛出异常。
注释
以下是常见的调用约定
Y = cdist(XA, XB, 'euclidean')
计算 \(m\) 个点之间的距离,使用欧几里得距离(2 范数)作为点之间的距离度量。这些点被排列为矩阵 X 中的 \(m\) 个 \(n\) 维行向量。
Y = cdist(XA, XB, 'minkowski', p=2.)
使用 Minkowski 距离 \(\|u-v\|_p\) (\(p\)-范数)计算距离,其中 \(p > 0\)(请注意,如果 \(0 < p < 1\),这只是一个拟度量)。
Y = cdist(XA, XB, 'cityblock')
计算点之间的城市街区或曼哈顿距离。
Y = cdist(XA, XB, 'seuclidean', V=None)
计算标准化欧几里得距离。两个 n 向量
u
和v
之间的标准化欧几里得距离为\[\sqrt{\sum {(u_i-v_i)^2 / V[x_i]}}.\]V 是方差向量;V[i] 是在点的所有第 i 个分量上计算的方差。如果未传递,则会自动计算。
Y = cdist(XA, XB, 'sqeuclidean')
计算向量之间的平方欧几里得距离 \(\|u-v\|_2^2\)。
Y = cdist(XA, XB, 'cosine')
计算向量 u 和 v 之间的余弦距离,
\[1 - \frac{u \cdot v} {{\|u\|}_2 {\|v\|}_2}\]其中 \(\|*\|_2\) 是其参数
*
的 2 范数,\(u \cdot v\) 是 \(u\) 和 \(v\) 的点积。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\) 的点积。
Y = cdist(XA, XB, 'hamming')
计算归一化的 Hamming 距离,或者两个 n 向量
u
和v
之间不一致的向量元素的比例。为了节省内存,矩阵X
可以是布尔类型。Y = cdist(XA, XB, 'jaccard')
计算点之间的 Jaccard 距离。给定两个向量,
u
和v
,Jaccard 距离是不一致的元素u[i]
和v[i]
的比例,其中至少一个是非零的。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 散度。
Y = cdist(XA, XB, 'chebyshev')
计算点之间的 Chebyshev 距离。两个 n 向量
u
和v
之间的 Chebyshev 距离是它们各自元素之间的最大范数-1 距离。更准确地说,距离由下式给出\[d(u,v) = \max_i {|u_i-v_i|}.\]Y = cdist(XA, XB, 'canberra')
计算点之间的 Canberra 距离。两个点
u
和v
之间的 Canberra 距离为\[d(u,v) = \sum_i \frac{|u_i-v_i|} {|u_i|+|v_i|}.\]Y = cdist(XA, XB, 'braycurtis')
计算点之间的 Bray-Curtis 距离。两个点
u
和v
之间的 Bray-Curtis 距离为\[d(u,v) = \frac{\sum_i (|u_i-v_i|)} {\sum_i (|u_i+v_i|)}\]Y = cdist(XA, XB, 'mahalanobis', VI=None)
计算点之间的 Mahalanobis 距离。两个点
u
和v
之间的 Mahalanobis 距离为 \(\sqrt{(u-v)(1/V)(u-v)^T}\),其中 \((1/V)\)(VI
变量)是逆协方差。如果VI
不是 None,则VI
将用作逆协方差矩阵。Y = cdist(XA, XB, 'yule')
计算布尔向量之间的 Yule 距离。(参见
yule
函数文档)Y = cdist(XA, XB, 'matching')
‘hamming’ 的同义词。
Y = cdist(XA, XB, 'dice')
计算布尔向量之间的 Dice 距离。(参见
dice
函数文档)Y = cdist(XA, XB, 'kulczynski1')
计算布尔向量之间的 kulczynski 距离。(参见
kulczynski1
函数文档)自 1.15.0 版本起已弃用: 此度量已弃用,将在 SciPy 1.17.0 中删除。请将
cdist(XA, XB, 'kulczynski1')
的用法替换为1 / cdist(XA, XB, 'jaccard') - 1
。Y = cdist(XA, XB, 'rogerstanimoto')
计算布尔向量之间的 Rogers-Tanimoto 距离。(参见
rogerstanimoto
函数文档)Y = cdist(XA, XB, 'russellrao')
计算布尔向量之间的 Russell-Rao 距离。(参见
russellrao
函数文档)Y = cdist(XA, XB, 'sokalmichener')
计算布尔向量之间的 Sokal-Michener 距离。(参见
sokalmichener
函数文档)自 1.15.0 版本起已弃用: 此度量已弃用,将在 SciPy 1.17.0 中删除。请将
cdist(XA, XB, 'sokalmichener')
的用法替换为cdist(XA, XB, 'rogerstanimoto')
。Y = cdist(XA, XB, 'sokalsneath')
计算向量之间的 Sokal-Sneath 距离。(参见
sokalsneath
函数文档)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 函数
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. ]])
查找从三维点到单位立方体角的曼哈顿距离
>>> 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]])