距离度量在机器学习中扮演着重要的角色。
它们为许多流行且有效的机器学习算法奠定了基础,例如用于监督学习的 k-近邻算法和用于无监督学习的 k-均值聚类算法。
必须根据数据的类型来选择和使用不同的距离度量。因此,了解如何实现和计算一系列流行的距离度量以及它们得分背后的直觉非常重要。
在本教程中,您将发现机器学习中的距离度量。
完成本教程后,您将了解:
- 距离度量在机器学习算法中的作用和重要性。
- 如何实现和计算汉明距离、欧几里得距离和曼哈顿距离。
- 如何实现和计算闵可夫斯基距离,它概括了欧几里得距离和曼哈顿距离。
立即开始您的项目,阅读我的新书《Python 机器学习精通》,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。

机器学习的距离度量
照片作者 Prince Roy,保留部分权利。
教程概述
本教程分为五个部分;它们是:
- 距离度量的作用
- 汉明距离
- 欧几里得距离
- 曼哈顿距离(出租车距离或城市街区距离)
- 闵可夫斯基距离
距离度量的作用
距离度量在机器学习中扮演着重要的角色。
距离度量是一种客观分数,它总结了问题域中两个对象之间的相对差异。
最常见的是,这两个对象是描述一个主题(例如人、汽车或房屋)或一个事件(例如购买、索赔或诊断)的数据行。
您最有可能在您使用以距离度量为核心的特定机器学习算法时遇到距离度量。这类算法中最著名的是 k-近邻算法,简称 KNN。
在 KNN 算法中,通过计算新样本(行)与训练数据集中所有样本(行)之间的距离来对新样本进行分类或回归预测。然后选择训练数据集中距离最小的 k 个样本,并通过平均结果(类标签的众数或回归的实数值的均值)来进行预测。
KNN 属于一个更广泛的算法领域,称为基于案例或 基于实例的学习,其中大多数算法以类似的方式使用距离度量。另一个使用距离度量的流行基于实例算法是 学习向量量化(LVQ)算法,它也可以被视为一种神经网络。
与之相关的是自组织映射算法(SOM),它也使用距离度量,可用于监督或无监督学习。另一种以距离度量为核心的无监督学习算法是 K-均值聚类算法。
在基于实例的学习中,训练样本被原封不动地存储,并使用距离函数来确定未知测试实例最接近的训练集成员。一旦找到最近的训练实例,就为其测试实例预测其类别。
— 第 135 页,《数据挖掘:实用机器学习工具与技术》,第 4 版,2016。
以下是一些以距离度量为核心的更流行的机器学习算法的简短列表:
- K-最近邻
- 学习向量量化 (LVQ)
- 自组织映射 (SOM)
- K-均值聚类
许多基于核的方法也可以被视为基于距离的算法。也许最广为人知的核方法是支持向量机算法,简称 SVM。
您知道更多使用距离度量的算法吗?
在下面的评论中告诉我。
在计算两个示例或数据行之间的距离时,不同列可能使用不同的数据类型。一个示例可能包含实数值、布尔值、分类值和有序值。每种类型可能需要不同的距离度量,然后将它们相加得到一个单一的距离分数。
数值可能具有不同的尺度。这会极大地影响距离度量的计算,因此在计算距离度量之前对数值进行归一化或标准化通常是一种好习惯。
回归问题中的数值误差也可以被视为一种距离。例如,预期值和预测值之间的误差是一种一维距离度量,可以对测试集中的所有示例进行求和或平均,以得到数据集中的预期结果和预测结果之间的总距离。误差的计算,例如均方误差或平均绝对误差,可能类似于标准的距离度量。
正如我们所见,距离度量在机器学习中发挥着重要作用。在机器学习中最常用的四种距离度量可能是:
- 汉明距离
- 欧几里得距离
- 曼哈顿距离
- 闵可夫斯基距离
您还使用或听说过哪些其他距离度量?
在下面的评论中告诉我。
当您从头开始实现算法时,您需要了解如何计算每种距离度量,并在使用利用这些距离度量的算法时理解计算的直觉。
让我们依次仔细看看每一个。
汉明距离
汉明距离计算两个二进制向量之间的距离,也称为二进制字符串或简称位串。
当您对分类列进行 独热编码 时,最有可能遇到位串。
例如,如果一个列包含类别“红色”、“绿色”和“蓝色”,您可能会为每个示例进行独热编码,为一个位串,其中每个位对应一个列。
- 红色 = [1, 0, 0]
- 绿色 = [0, 1, 0]
- 蓝色 = [0, 0, 1]
红色和绿色之间的距离可以计算为两个位串之间差异位数之和或平均数。这就是汉明距离。
对于独热编码的字符串,将位串的差异位数之和(始终为 0 或 1)进行汇总可能更有意义。
- 汉明距离 = i 到 N 的总和 abs(v1[i] – v2[i])
对于可能有很多 1 的位串,通常计算差异位数的平均值,得到一个介于 0(相同)和 1(完全不同)之间的汉明距离分数。
- 汉明距离 = (i 到 N 的总和 abs(v1[i] – v2[i])) / N
我们可以用一个例子来演示计算两个位串之间的汉明距离,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 计算位串之间的汉明距离 # 计算汉明距离 def hamming_distance(a, b): return sum(abs(e1 - e2) for e1, e2 in zip(a, b)) / len(a) # 定义数据 row1 = [0, 0, 0, 0, 0, 1] row2 = [0, 0, 0, 0, 1, 0] # 计算距离 dist = hamming_distance(row1, row2) print(dist) |
运行示例将报告两个位串之间的汉明距离。
我们可以看到,这两个字符串之间有两个差异,即 6 个位中有 2 个不同,平均 (2/6) 约为 1/3 或 0.333。
1 |
0.3333333333333333 |
我们也可以使用 SciPy 的 hamming() 函数执行相同的计算。完整示例如下。
1 2 3 4 5 6 7 8 |
# 计算位串之间的汉明距离 from scipy.spatial.distance import hamming # 定义数据 row1 = [0, 0, 0, 0, 0, 1] row2 = [0, 0, 0, 0, 1, 0] # 计算距离 dist = hamming(row1, row2) print(dist) |
运行示例,我们可以看到我们得到了相同的结果,这证实了我们的手动实现。
1 |
0.3333333333333333 |
欧几里得距离
欧几里得距离计算两个实值向量之间的距离。
当计算具有数值(如浮点或整数值)的两行数据之间的距离时,最有可能使用欧几里得距离。
如果列的值尺度不同,通常在计算欧几里得距离之前对所有列的数值进行归一化或标准化。否则,值较大的列将主导距离度量。
尽管还有其他可能的选择,但大多数基于实例的学习器使用欧几里得距离。
— 第 135 页,《数据挖掘:实用机器学习工具与技术》,第 4 版,2016。
欧几里得距离计算为两个向量之间差值的平方和的平方根。
- 欧几里得距离 = sqrt(i 到 N 的总和 (v1[i] – v2[i])^2)
如果距离计算要执行数千或数百万次,通常会删除平方根运算以加快计算速度。修改后的分数将具有相同的相对比例,并且仍然可以在机器学习算法中有效用于查找最相似的示例。
- 欧几里得距离 = i 到 N 的总和 (v1[i] – v2[i])^2
此计算与 L2 向量范数 相关,如果加上平方根,则等同于均方误差和均方根误差。
我们可以用一个例子来演示计算两个实值向量之间的欧几里得距离,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 计算向量之间的欧几里得距离 from math import sqrt # 计算欧几里得距离 def euclidean_distance(a, b): return sqrt(sum((e1-e2)**2 for e1, e2 in zip(a,b))) # 定义数据 row1 = [10, 20, 15, 10, 5] row2 = [12, 24, 18, 8, 7] # 计算距离 dist = euclidean_distance(row1, row2) print(dist) |
运行示例将报告两个向量之间的欧几里得距离。
1 |
6.082762530298219 |
我们也可以使用 SciPy 的 euclidean() 函数执行相同的计算。完整示例如下。
1 2 3 4 5 6 7 8 |
# 计算向量之间的欧几里得距离 from scipy.spatial.distance import euclidean # 定义数据 row1 = [10, 20, 15, 10, 5] row2 = [12, 24, 18, 8, 7] # 计算距离 dist = euclidean(row1, row2) print(dist) |
运行示例,我们可以看到我们得到了相同的结果,这证实了我们的手动实现。
1 |
6.082762530298219 |
曼哈顿距离(出租车距离或城市街区距离)
曼哈顿距离,也称为出租车距离或城市街区距离,计算两个实值向量之间的距离。
它可能更适用于描述均匀网格上对象(如棋盘或城市街区)的向量。该度量的出租车名称指的是该度量计算的直观含义:出租车在城市街区(网格上的坐标)之间行驶的最短路径。
对于整数特征空间中的两个向量,计算曼哈顿距离而不是欧几里得距离可能更有意义。
曼哈顿距离计算为两个向量之间绝对差值的总和。
- 曼哈顿距离 = i 到 N 的总和 sum |v1[i] – v2[i]|
曼哈顿距离与 L1 向量范数 以及绝对误差之和和平均绝对误差度量相关。
我们可以用一个例子来演示计算两个整数向量之间的曼哈顿距离,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 计算向量之间的曼哈顿距离 from math import sqrt # 计算曼哈顿距离 def manhattan_distance(a, b): return sum(abs(e1-e2) for e1, e2 in zip(a,b)) # 定义数据 row1 = [10, 20, 15, 10, 5] row2 = [12, 24, 18, 8, 7] # 计算距离 dist = manhattan_distance(row1, row2) print(dist) |
运行示例将报告两个向量之间的曼哈顿距离。
1 |
13 |
我们也可以使用 SciPy 的 cityblock() 函数执行相同的计算。完整示例如下。
1 2 3 4 5 6 7 8 |
# 计算向量之间的曼哈顿距离 from scipy.spatial.distance import cityblock # 定义数据 row1 = [10, 20, 15, 10, 5] row2 = [12, 24, 18, 8, 7] # 计算距离 dist = cityblock(row1, row2) print(dist) |
运行示例,我们可以看到我们得到了相同的结果,这证实了我们的手动实现。
1 |
13 |
闵可夫斯基距离
闵可夫斯基距离计算两个实值向量之间的距离。
它是欧几里得距离和曼哈顿距离度量的推广,并增加了一个称为“阶数”或“p”的参数,允许计算不同的距离度量。
闵可夫斯基距离度量计算如下:
- 欧几里得距离 = (i 到 N 的总和 (abs(v1[i] – v2[i]))^p)^(1/p)
其中“p”是阶数参数。
当 p 为 1 时,计算与曼哈顿距离相同。当 p 为 2 时,则与欧几里得距离相同。
- p=1:曼哈顿距离。
- p=2:欧几里得距离。
中间值在两种度量之间提供了一种受控的平衡。
在实现使用距离度量的机器学习算法时,通常使用闵可夫斯基距离,因为它可以通过可调的超参数“p”来控制实值向量的距离度量类型。
我们可以用一个例子来演示计算两个实向量之间的闵可夫斯基距离,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 计算向量之间的闵可夫斯基距离 from math import sqrt # 计算闵可夫斯基距离 def minkowski_distance(a, b, p): return sum(abs(e1-e2)**p for e1, e2 in zip(a,b))**(1/p) # 定义数据 row1 = [10, 20, 15, 10, 5] row2 = [12, 24, 18, 8, 7] # 计算距离 (p=1) dist = minkowski_distance(row1, row2, 1) print(dist) # 计算距离 (p=2) dist = minkowski_distance(row1, row2, 2) print(dist) |
运行示例,首先计算并打印 p=1 时的闵可夫斯基距离(即曼哈顿距离),然后打印 p=2 时的闵可夫斯基距离(即欧几里得距离),结果与前几节中针对相同数据计算的值相匹配。
1 2 |
13.0 6.082762530298219 |
我们也可以使用 SciPy 的 minkowski_distance() 函数执行相同的计算。完整示例如下。
1 2 3 4 5 6 7 8 9 10 11 |
# 计算向量之间的闵可夫斯基距离 from scipy.spatial import minkowski_distance # 定义数据 row1 = [10, 20, 15, 10, 5] row2 = [12, 24, 18, 8, 7] # 计算距离 (p=1) dist = minkowski_distance(row1, row2, 1) print(dist) # 计算距离 (p=2) dist = minkowski_distance(row1, row2, 2) print(dist) |
运行示例,我们可以看到我们得到了相同的结果,这证实了我们的手动实现。
1 2 |
13.0 6.082762530298219 |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 数据挖掘:实用机器学习工具与技术,第 4 版,2016。
API
- 距离计算 (scipy.spatial.distance)
- scipy.spatial.distance.hamming API.
- scipy.spatial.distance.euclidean API.
- scipy.spatial.distance.cityblock API.
- scipy.spatial.minkowski_distance API.
文章
总结
在本教程中,您学习了机器学习中的距离度量。
具体来说,你学到了:
- 距离度量在机器学习算法中的作用和重要性。
- 如何实现和计算汉明距离、欧几里得距离和曼哈顿距离。
- 如何实现和计算闵可夫斯基距离,它概括了欧几里得距离和曼哈顿距离。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
为什么你没有写关于马哈拉诺比斯距离? 如果我们考虑变量的不同度量尺度和它们之间的相关性,它比欧几里得距离好得多。
点赞支持介绍马哈拉诺比斯距离!
谢谢 Mel!
你能为我推荐一些用于数据科学距离计算的书籍吗?
Subrata 你好… 以下资源可能对你有帮助
https://towardsdatascience.com/9-distance-measures-in-data-science-918109d069fa
再次点赞支持马哈拉诺比斯距离!
谢谢,我已列入待办事项。
好建议,谢谢!
同意楼上的评论。此外,可以通过使用使用欧几里得距离的无监督支持向量聚类算法和使用马哈拉诺比斯距离度量的无监督椭圆支持向量聚类算法来解释马哈拉诺比斯距离和欧几里得距离度量之间的区别。
谢谢。
向量余弦相似度没有被提及吗?
很好的建议,谢谢。
EMD 距离怎么样?
EMD 距离是什么?
地球搬运工距离
谢谢。
值得一提的是,在某些高级情况下,默认的度量选项可能不够(例如 sklearn 中 KNN 的度量选项)。我目前正在处理一个项目,其中 KNN 距离是通过分类列(在值不同时具有不同的距离权重)和数值列(距离与绝对值差成正比)定义的。最终距离是所有列的距离之和。
不要害怕自定义度量!
此致!
好建议!
相似性和距离之间有什么区别?
另外,之间的区别
1 余弦距离和欧几里得距离?
2 余弦相似度和欧几里得相似度?
区别不大,在此上下文中它们的意思相同。
您好,我还在学习这种距离测量。我可以问您一个问题吗?
欧几里得距离中的行数据是如何工作的?如何获取数据?它是随机的数值吗?
我希望这个问题不会让您太困扰。谢谢
您将从您的领域收集数据,每一行数据都是一个观察值。
在我的项目中,我正在测量图像的相似性。那么我可以使用图像的坐标作为我的数据吗?
我相信有一些特定的度量方法用于比较图像(像素矩阵)之间的相似性。我建议查阅相关文献。
距离算法中缺少余弦模型,请用余弦模型更新它,它是距离度量的第5种模型
感谢您的建议。
初学者距离测量;对于无监督学习K-Clustering分析,是否有首选方法?我的变量与购物有关,我试图识别具有相同购物习惯的客户群体,我有客户信息(年龄、收入、教育水平)以及他们购买的产品。谢谢。
是的,有特定的聚类度量方法。
https://machinelearning.org.cn/faq/single-faq/how-do-i-evaluate-a-clustering-algorithm
余弦相似性距离
好建议!
我非常喜欢这个主题。周五我有一个关于聚类、ACO、感知器的考试。我擅长所有数学,而且我喜欢做数学。我希望在博士阶段从事数据科学工作。
你好 Jason,感谢这篇帖子。
在同一上下文中,我在 caret 中调整了 KKNN 算法的距离度量,它通过随机搜索给了我三个值 1、2 和 3。这是什么意思?
你好 Ghizlane……你可能会发现以下内容很有趣
https://www.analyticsvidhya.com/blog/2021/08/how-knn-uses-distance-measures/
谢谢 James 的回复,我会查看这个链接。
你好 Jason,非常好的帖子,PCA 可以被视为一种基于度量的算法吗?当计算投影时,它在核心中使用距离度量,对吧?
你好 Dani……你可能会发现以下内容很有趣
https://www.keboola.com/blog/pca-machine-learning
非常感谢您的贡献。
请问如何用曼哈顿距离方法初始化 K-Means 过程?
与欧几里得距离相同吗?簇的选择、质心计算、迭代……等等?
谢谢你
Renato,不客气!以下资源可能对您有帮助
https://www.analyticsvidhya.com/blog/2019/08/comprehensive-guide-k-means-clustering/
你好
您能帮我找到比 Wasserstein 统计距离更好的机器学习度量方法吗?
你好 farid……请详细说明您在比较算法时考虑的标准。换句话说,请详细说明您对 Wasserstein 的顾虑。
您可以在这里找到替代方案
https://towardsdatascience.com/statistical-tests-wont-help-you-to-compare-distributions-d829eefe418