一、距离度量概念
- 距离度量是有监督和无监督学习算法的基础,包括k近邻、支持向量机和k均值聚类等;
- 距离度量用于计算给定问题空间中两个对象之间的差异,即数据集中的特征。然后可以使用该距离来确定特征之间的相似性, 距离越小特征越相似;
二、距离度量方式
2.1 几何距离度量
2.1.1 欧氏距离Euclidean distance
- 欧式距离是度量2个实值向量之间的最短距离;

- 欧式距离也称为
l
2
l2
l2范数,其计算方式如下:
d
=
∑
i
=
1
n
(
x
i
−
y
i
)
2
(1)
d=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}\tag{1}
d=i=1∑n(xi−yi)2
(1) - python代码如下:
from scipy.spatial import distance
distance.euclidean(vector_1, vector_2)
- 欧氏距离有两个主要缺点。首先,距离测量不适用于比2D或3D空间更高维度的数据。第二,如果我们不将特征规范化和/或标准化,距离可能会因为单位的不同而倾斜。
2.1.2 曼哈顿距离 Manhattan distance
- 曼哈顿距离:也被称为出租车或城市街区距离,因为两个实值向量之间的距离是根据一个人只能以直角移动计算的。这种距离度量通常用于离散和二元属性,这样可以获得真实的路径;

- 曼哈顿距离也称为
l
1
l1
l1范数,其计算方式如下:
d
=
∑
i
=
1
n
(
x
i
−
y
i
)
(2)
d=\sum_{i=1}^{n}(x_i-y_i)\tag{2}
d=i=1∑n(xi−yi)(2) - python代码如下:
from scipy.spatial import distance
distance.cityblock(vector_1, vector_2)
- 曼哈顿的距离有两个主要的缺点。它不如高维空间中的欧氏距离直观,它也没有显示可能的最短路径。虽然这可能没有问题,但我们应该意识到这并不是最短的距离。
2.1.3 切比雪夫距离 Chebyshev distance
- 切比雪夫距离也称为棋盘距离,因为它是两个实值向量之间任意维度上的最大距离。它通常用于仓库物流中,其中最长的路径决定了从一个点到另一个点所需的时间。

- 切比雪夫距离也称为
l
l
l-无穷范数,其计算方式如下:
d
=
max
i
=
1
(
∣
x
i
−
y
i
∣
)
(3)
d=\max_{i=1}(|x_i-y_i|)\tag{3}
d=i=1max(∣xi−yi∣)(3) - python代码如下:
from scipy.spatial import distance
distance.chebyshev(vector_1, vector_2)
2.1.4 闵可夫斯基距离 Minkowski distance
- 闵可夫斯基距离是上述距离度量的广义形式。它可以用于相同的用例,同时提供高灵活性。我们可以选择 p 值来找到最合适的距离度量。

- 闵可夫斯基距离计算方式如下:
d
=
∑
i
=
1
n
(
x
i
−
y
i
)
p
p
(4)
d=\sqrt[p]{\sum_{i=1}^{n}(x_i-y_i)^p}\tag{4}
d=pi=1∑n(xi−yi)p
(4) - python代码如下:
from scipy.spatial import distance
distance.minkowski(vector_1, vector_2, p)
- 由于闵可夫斯基距离表示不同的距离度量,它就有与它们相同的主要缺点,例如在高维空间的问题和对特征单位的依赖。此外,p值的灵活性也可能是一个缺点,因为它可能降低计算效率,因为找到正确的p值需要进行多次计算。
2.1.5 余弦相似度和距离 Cosine similarity
- 弦相似度是方向的度量,他的大小由两个向量之间的余弦决定,并且忽略了向量的大小。余弦相似度通常用于与数据大小无关紧要的高维,例如,推荐系统或文本分析。

- 余弦相似度可以介于-1(相反方向)和1(相同方向)之间,计算方法为:
d
=
c
o
s
(
α
)
=
x
y
∥
x
∥
∥
y
∥
(5)
d=cos{(\alpha)}=\frac{xy}{\|x\|\|y\|}\tag{5}
d=cos(α)=∥x∥∥y∥xy(5) - python代码如下:
from scipy.spatial import distance
distance.minkowski(vector_1, vector_2, p)
- 余弦相似度常用于范围在0到1之间的正空间中。余弦距离就是用1减去余弦相似度,位于0(相似值)和1(不同值)之间。
- python代码如下:
from scipy.spatial import distance
distance.cosine(vector_1, vector_2)
- 余弦距离的主要缺点是它不考虑大小而只考虑向量的方向。因此,没有充分考虑到值的差异。
2.1.6 半正矢距离 Haversine distance
- 半正矢距离测量的是球面上两点之间的最短距离。因此常用于导航,其中经度和纬度和曲率对计算都有影响。

- 半正矢距离的公式如下:
d
=
2
r
arcsin
(
sin
2
(
ψ
2
−
ψ
1
2
)
+
cos
ψ
1
cos
ψ
2
sin
2
(
λ
2
−
λ
1
2
)
)
(6)
d=2r\arcsin(\sqrt{\sin^2(\frac{\psi_2-\psi_1}{2})+\cos\psi_1\cos\psi_2\sin^2(\frac{\lambda_2-\lambda_1}{2}}))\tag{6}
d=2rarcsin(sin2(2ψ2−ψ1)+cosψ1cosψ2sin2(2λ2−λ1
))(6) - 其中
r
r
r为球的半径,
ψ
\psi
ψ和
λ
\lambda
λ为经度和纬度;
- python代码如下:
from sklearn.metrics.pairwise import haversine_distances
haversine_distances([vector_1, vector_2])
- 半正矢距离的主要缺点是假设是一个球体,而这种情况很少出现。
2.1.7 汉明距离
- 汉明距离衡量两个二进制向量或字符串之间的差异。

- 对向量按元素进行比较,并对差异的数量进行平均。如果两个向量相同,得到的距离是0之间,如果两个向量完全不同,得到的距离是1。
- python代码如下:
from scipy.spatial import distance
distance.hamming(vector_1, vector_2)
- 汉明距离有两个主要缺点。距离测量只能比较相同长度的向量,它不能给出差异的大小。所以当差异的大小很重要时,不建议使用汉明距离。
2.2 统计距离度量
- 统计距离测量可用于假设检验、拟合优度检验、分类任务或异常值检测。
2.2.1 杰卡德指数和距离 Jaccard Index
- Jaccard指数用于确定两个样本集之间的相似性。它反映了与整个数据集相比存在多少一对一匹配。Jaccard指数通常用于二进制数据比如图像识别的深度学习模型的预测与标记数据进行比较,或者根据单词的重叠来比较文档中的文本模式。

- Jaccard距离的计算方法为:
d
=
1
−
x
∩
y
x
∪
y
(7)
d=1-\frac{x\cap y}{x\cup y}\tag{7}
d=1−x∪yx∩y(7) - python代码如下:
from scipy.spatial import distance
distance.jaccard(vector_1, vector_2)
- Jaccard指数和距离的主要缺点是,它受到数据规模的强烈影响,即每个项目的权重与数据集的规模成反比。
2.2.2 Sorensen-Dice指数
- Sörensen-Dice指数类似于Jaccard指数,它可以衡量的是样本集的相似性和多样性。该指数更直观,因为它计算重叠的百分比。Sörensen-Dice索引常用于图像分割和文本相似度分析。

- 计算方法为:
d
=
2
∣
x
∩
y
∣
∣
x
∣
+
∣
y
∣
(8)
d=\frac{2|x\cap y|}{|x|+|y|}\tag{8}
d=∣x∣+∣y∣2∣x∩y∣(8) - python代码如下:
from scipy.spatial import distance
distance.dice(vector_1, vector_2)
2.2.3 动态时间规整 Dynamic Time Warping
- 动态时间规整是测量两个不同长度时间序列之间距离的一种重要方法。可以用于所有时间序列数据的用例,如语音识别或异常检测。

- 为什么我们需要一个为时间序列进行距离测量的度量呢?如果时间序列长度不同或失真,则上面说到的其他距离测量无法确定良好的相似性。比如欧式距离计算每个时间步长的两个时间序列之间的距离。但是如果两个时间序列的形状相同但在时间上发生了偏移,那么尽管时间序列非常相似,但欧几里得距离会表现出很大的差异。
- 动态时间规整通过使用多对一或一对多映射来最小化两个时间序列之间的总距离来避免这个问题。当搜索最佳对齐时,这会产生更直观的相似性度量。通过动态规划找到一条弯曲的路径最小化距离,该路径必须满足以下条件:
- 边界条件:弯曲路径在两个时间序列的起始点和结束点开始和结束
- 单调性条件:保持点的时间顺序,避免时间倒流
- 连续条件:路径转换限制在相邻的时间点上,避免时间跳跃
- 整经窗口条件(可选):允许的点落入给定宽度的整经窗口
- 坡度条件(可选):限制弯曲路径坡度,避免极端运动
- 我们可以使用 Python 中的 fastdtw 包:
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
distance, path = fastdtw(timeseries_1, timeseries_2, dist=euclidean)
- 动态时间规整的一个主要缺点是与其他距离测量方法相比,它的计算工作量相对较高。