2022年 11月 9日

python distance_Python – scipy.spatial.distance 距离计算函数

scipy.spatial 模块提供了距离计算模块 – scipy.spatial.distance.

1. 距离度量函数

两个向量 u 和 v 间的距离度量函数. 输入参数 u 和 v 分别都是 n-dim 的向量,也可以是 (1, n)-dim 的(计算时会自动 squeeze 去掉维度为 1 的维度). 如果维度大于 1, 则出错.

1.1. 距离函数列表(数值)

两个数值向量 u 和 v 间的距离度量函数. 不过,直接采用如下函数计算较大规模的向量集合时,会比较低效的,此时可采用 pdist 函数.(Computing distances over a large collection of vectors is inefficient for these functions).序号函数名函数说明1计算两个 1-D 数组间的 Bray-Curtis distance

2计算两个 1-D 数组间的 Canberra distance

3计算 Chebyshev distance

4计算 City Block (Manhattan) distance

5计算 u 和 v 之间的相关系数

6计算两个 1-D 数组间的 Cosine distance

7计算两个 1-D 数组间的 Euclidean distance

8计算两个 1-D 数组间的 Jensen-Shannon distance (metric)

9计算两个 1-D 数组间的 Mahalanobis distance

10计算两个 1-D 数组间的 Minkowski distance

11计算两个 1-D 数组间的 standardized Euclidean distance

12计算两个 1-D 数组间的 squared Euclidean distance

13计算两个 1-D 数组间的 weighted Minkowski distance

1.2. 距离函数列表(二值向量)

两个二值向量(boolean vectors) u 和 v 间的距离度量函数. 同样地,对于较大规模的向量集合的距离计算,pdist 效率更高.序号函数名函数说明1计算两个 1-D 布尔向量间的 Dice dissimilarity

2计算两个 1-D 向量间的 Hamming distance

3计算两个 1-D 布尔向量间的 Jaccard-Needham dissimilarity

4计算两个 1-D 布尔向量间的 Kulsinski dissimilarity

5计算两个 1-D 布尔向量间的 Rogers-Tanimoto dissimilarity

6计算两个 1-D 布尔向量间的 Russell-Rao dissimilarity

7计算两个 1-D 布尔向量间的 Sokal-Michener dissimilarity

8计算两个 1-D 布尔向量间的 Sokal-Sneath dissimilarity

9计算两个 1-D 布尔向量间的 Yule dissimilarity

注:hamming 也可以用于离散数值向量间的距离度量.

1.3. cosine

计算两个 1-D 数组间的 Cosine 距离.scipy.spatial.distance.cosine(u, v, w=None)

# u – 输入数组

# v – 输入数组

# w – u 和 v 中每个元素值的权重. 默认为 None,每个元素值的权重为 1.0

向量 u 和 v 间的余弦距离,计算公式为:

$$

dist = 1 – \frac{u \cdot v}{||u||_2 ||v||_2}

$$

其中,$u \cdot v$ 为 u 和 v 的点积(dot product).

如:from scipy.spatial import distance

distance.cosine([1, 0, 0],

[0, 1, 0])

# 1.0

distance.cosine([100, 0, 0],

[0, 1, 0])

# 1.0

distance.cosine([1, 1, 0],

[0, 1, 0])

# 0.29289321881345254

1.4. euclidean

计算两个 1-D 数组间的欧式距离.scipy.spatial.distance.euclidean(u, v, w=None)

向量 u 和 v 间的欧式距离,计算公式为:

$$

dist = ||u – v||_2

= \sqrt{\sum(w_i|(u_i – v_i)|^2)}

$$

如:from scipy.spatial import distance

distance.euclidean([1, 0, 0],

[0, 1, 0])

# 1.4142135623730951

distance.euclidean([1, 1, 0],

[0, 1, 0])

# 1.0

1.5. dice

计算两个 1-D 二值向量间的 Dice 不相似性.scipy.spatial.distance.dice(u, v, w=None)

向量 u 和 v 间的欧式距离,计算公式为:

$$

dice\_dissimilarity = \frac{c_{TF} + c_{FT}}{2c_{TT} + c_{FT} + c_{TF}}

$$

其中,$c_{ij}$ 为 k

如:from scipy.spatial import distance

distance.dice([1, 0, 0],

[0, 1, 0])

# 1.0

distance.dice([1, 0, 0],

[1, 1, 0])

# 0.3333333333333333

distance.dice([1, 0, 0],

[2, 0, 0])

#-0.3333333333333333

1.6. hamming

计算两个 1-D 向量间的 hamming 距离.

向量 u 和 v 间的 hamming 距离是 u 和 v 之间的元素不一致性的比例. 如果 u 和 v 是二值向量,Hamming 距离的计算公式为:

$$

hamming\_dist = \frac{c_{01} + c_{10}}{n}

$$

其中,$c_{ij}$ 为 k

如:from scipy.spatial import distance

distance.hamming([1, 0, 0],

[0, 1, 0])

# 0.66666666666666663

distance.hamming([1, 0, 0],

[1, 1, 0])

# 0.33333333333333331

distance.hamming([1, 0, 0],

[2, 0, 0])

# 0.33333333333333331

distance.hamming([1, 0, 0],

[3, 0, 0])

# 0.33333333333333331

2. 距离计算函数

以矩阵数据形式保存的向量集合见得距离矩阵计算(Distance matrix computation from a collection of raw observation vectors stored in a rectangular array.).

矩阵的每行表示一个观测向量值,计算结果为每行之间的距离.

scipy.spatial.distance 提供了几种距离计算函数:pdist, cdist,

2.1. pdist

计算 n-dim 空间中观测值之间的成对距离(pairwise distances). 距离值越大,相关度越小.

定义如:Y = scipy.spatial.distance.pdist(X, metric=’euclidean’, *args, **kwargs)

参数说明:

[1] – X – n-dim 空间中 m 个观察值组成的 mxn 的数组.

[2] – metric – 字符串或函数. 距离度量函数.

[3] – Y – 距离矩阵. 对于每个 i 和 j,其中,i

如:import numpy as np

from scipy.spatial.distance import pdist

from scipy.spatial.distance import squareform

A=np.array([[1,2],

[3,4],

[5,6],

[7,8]])

# A是一个向量矩阵,distA 为数组形式

distA = pdist(A,metric=’euclidean’)

#array([2.82842712,

# 5.65685425,

# 8.48528137,

# 2.82842712,

# 5.65685425,

# 2.82842712])

# 将 distA 数组变成一个矩阵

distB = squareform(distA)

#array([[0. , 2.82842712, 5.65685425, 8.48528137],

# [2.82842712, 0. , 2.82842712, 5.65685425],

# [5.65685425, 2.82842712, 0. , 2.82842712],

# [8.48528137, 5.65685425, 2.82842712, 0. ]])

不同的距离度量方式,pdist 函数使用如:

2.2. cdist

计算两个输入集合(如,矩阵A和矩阵B)间每个向量对之间的距离.Y = scipy.spatial.distance.cdist(XA, XB, metric=’euclidean’, *args, **kwargs)

返回值 Y – 距离矩阵. 对于每个 i 和 j,计算 dist(u=XA[i], v=XB[j]) 度量值,并保存于 Y[ij].

其他类似于 pdist. Y[ij] 表示 A 中第 i 个向量到B中第 j 向量的距离.

如:import numpy as np

from scipy.spatial.distance import cdist

A=np.array([[1,2],

[3,4],

[5,6]])

B=np.array([[7,8],

[9,10]])

distAB = cdist(A,B,metric=’euclidean’)

#array([[ 8.48528137, 11.3137085 ],

# [ 5.65685425, 8.48528137],

# [ 2.82842712, 5.65685425]])

2.3. squareform

将向量形式(vector-form) 距离向量转换方形(square-form) 距离矩阵. 反之.scipy.spatial.distance.squareform(X, force=’no’, checks=True)