机器学习中使用的距离类型

2025 年 6 月 19 日 | 阅读 9 分钟

距离在大多数学习算法中都很有用,并且可以应用于广泛的问题。它们是许多熟悉现有算法类型的基础,例如用于监督学习的 k-近邻算法和用于无监督学习的 k-均值聚类算法。在选择距离度量时,了解如何计算许多选定的流行指标以及如何解释从这些度量派生的分数至关重要。

距离度量的作用

距离度量在机器学习中很重要,因为它们充当数值,使预先确定的问题域能够评估两个实体之间存在的差异。

通常,这些实体是数据行,用于描述主题(个人、车辆、财产或/和事件,例如购买、索赔或诊断等)。

也就是说,在学习机器学习时,您会发现距离度量经常且显著地被使用。最容易想到的简单例子是 k-近邻 (KNN) 算法。在 KNN 中,新数据的预测是基于新实例与构成训练集的其他实例的距离。获取 k 个最近邻的实例,并在回归情况下通过取其结果的平均值,在分类情况下通过取其众数来获得近似值。

KNN 可以归类为基于案例的学习或实例学习,因为它们都使用了我们之前研究的距离度量。 学习向量量化 (LVQ) 是该系列中的另一个算法。它被认为是神经网络版本。

此外,自组织映射 (SOM) 利用距离度量,并可能提供监督和无监督学习功能。与在无监督空间中运行的其他算法类似,K-均值聚类也利用距离来聚类点。

实例学习保留训练样本,并应用距离函数来识别与测试实例最相似的实例。最后,使用训练数据集中最近距离的类别来为测试实例分配类别。

机器学习中使用的距离度量

一些依赖距离度量的广泛使用的机器学习算法包括:

  • K-近邻 (KNN)
  • 学习向量量化 (LVQ)
  • 自组织映射 (SOM)
  • K-Means 聚类

这些是一些核方法,它们被归类为基于距离的学习类别,其中支持向量机 (SVM) 可能是最常见的。

在计算任何两个数据点之间的距离时,不同的列可能包含不同类型的数据,包括实数、布尔值、类别或序数数据类型。根据属性的特定类型,很可能需要各种距离度量;因此,它们被整合到一个单一的分数中。

由于特征可能是定量的,它们的尺度会根据测量单位而变化;因此,对数值特征进行归一化或标准化对于计算距离度量至关重要。

在回归任务中,例如均方误差,预测值与实际值之间的差值就像一维距离度量一样。这种误差,例如以均方误差或平均绝对误差的形式,可以累加起来以对整个测试集进行求和,以表示预测结果和预期结果之间差异的总和。

机器学习中常用的距离度量

  • 汉明距离
  • 欧几里得距离
  • 曼哈顿距离
  • 闵可夫斯基距离

这些距离度量仍然是机器学习的核心机制之一,并用于监督和无监督学习。

让我们逐一讨论每种类型。

汉明距离

汉明距离是用于确定两个二元向量(即二元字符串或位串)之间差异的度量。

当对类别数据进行独热编码时,通常会遇到一串比特。例如,如果一列包含“红色”、“绿色”和“蓝色”这三个类别,您可以将它们表示为位串:

红色 = [1, 0, 0]

绿色 = [0, 1, 0]

蓝色 = [0, 0, 1]

两个位串(例如,红色和绿色)的汉明距离是它们之间允许的差异位数总和或平均值。此距离使得能够度量编码类别集之间的接近程度或远近程度。

对于独热编码的字符串,计算字符串之间比特差异的总和可能更有意义,这对于每次比较总是产生 0 或 1。

汉明距离公式(总和)

Types of Distances Used in Machine Learning

当队列处理具有在特定位置设置一个以上 1 的位串时,需要使用差异位数的平均值。这给出了一个介于 0(相同)和 1(完全不同)之间的汉明距离分数。

汉明距离公式(平均值)

Types of Distances Used in Machine Learning

现在,让我们采取正式的步骤,计算两个位串之间的汉明距离。

代码

输出

 
0.3333333333333333   

这里,还可以注意到两个字符串在第 5 位和第 6 位之间有两个不同的比特。这些差异是根据总共 6 个比特位置进行平均的,得到

或者,我们可以使用 SciPy 库来执行相同的计算。

代码

输出

 
0.3333333333333333   

因此,通过设计的手动实现和 SciPy 函数获得的结果是相同的,这证明了解决方案的正确性。

欧几里得距离

欧几里得距离计算连接两个实向量的直线距离。

此度量最常用于数字的两个数据行之间,包括行之间的整数或浮点数。

初步研究表明,当数据列的尺度不均匀时,将每列中的数值归一化或标准化到某个尺度对于计算欧几里得距离至关重要。否则,具有大数量级的列将主导所有其他列的整体距离。

当然,有多种可能的距离度量,其中欧几里得度量在实例学习算法中最为流行。

欧几里得距离计算

欧几里得距离计算是通过取两个向量之差的平方和的平方根来计算的。

Types of Distances Used in Machine Learning

在需要执行数千甚至数百万次计算的情况下,通常可以省略平方根运算效率更高。然而,省略平方根不会影响距离的相对比例,因此修改后的分数在机器学习算法中仍然有用,可以用来找到其他同类示例。

Types of Distances Used in Machine Learning

此公式等同于 L2 范数,并且等于均方误差和均方根误差(如果计算了平方根)。

以下示例显示了如何执行一种计算上简单的类型,即两个实值向量之间的欧几里得距离。

示例:计算两个向量的距离

现在,作为示例,让我们手动计算两个向量之间的欧几里得距离,如下所示。

代码

输出

 
6.082762530298219   

两个向量之间的欧几里得距离在 6.08 到 6.10 之间。

或者,可以使用 SciPy 中的 `euclidean()` 函数执行相同的计算,如下所示。

代码

输出

 
6.082762530298219   

出租车度量、街区距离或曼哈顿距离

曼哈顿距离也称为出租车距离或街区距离,最初是计算实值向量中两点之间的距离。

当对象按照规则的网格排列,包括棋盘格或城市街区时,这种度量尤其有利。出租车距离源于出租车在城市道路网络上行驶以到达某个地方的最佳路线的概念。

当特征空间由整数组成时,欧几里得距离可能不合适,而曼哈顿距离可能因此更合适。

公式

曼哈顿距离通过将两个向量中对应元素的绝对差相加来计算。

曼哈顿距离 = sum(|v1[i] - v2[i]|) 对于 i 到 N

此度量与 L1 范数相关,并且也是诸如平均绝对误差和平均绝对误差之类的度量的典型。

示例:曼哈顿距离的计算方法如下。

以下是一个解释两个整数向量之间曼哈顿距离的示例。

代码

输出

 
13   

该示例表明两个向量的曼哈顿距离为 13。

SciPy 中也存在的 `cityblock()` 函数也可用于计算曼哈顿距离。在此处提醒一下,这是一个更完整的示例。

代码

输出

 
13   

正如预期的那样,结果与手动实现一致,因此我们的自动化实现也是准确的。

闵可夫斯基距离

闵可夫斯基度量实际上是两个实值 d 向量之间的距离。

它通过添加参数 p 来泛化欧几里得和曼哈顿距离,该参数产生不同的距离。

闵可夫斯基距离的公式为:

闵可夫斯基距离 = (∑ pow(|v1[i] - v2[i], p))^(1/p)

使用的符号:“p”是阶参数。

p = 1:曼哈顿距离

p = 2:欧几里得距离

“p”值介于两者之间,表示这两种度量的组合。

闵可夫斯基距离主要应用于处理距离计算的机器学习算法,因为其参数“p”具有灵活性。

这是一个展示如何计算它的例子。

代码

输出证实了两种距离的结果。

输出

 
Manhattan distance (p=1): 13.0
Euclidean distance (p=2): 6.082762530298219   

我们还可以使用 SciPy 的 `minkowski_distance()` 函数来计算闵可夫斯基距离。下面是完整的示例。

代码

运行示例后,输出证实了与我们的手动计算相同的结果。

输出

 
p = 1 (Manhattan distance): 13.0
p = 2 (Euclidean distance): 6.082762530298219   

结论

距离度量在机器学习中非常重要,因为它们是 KNN、K-均值和 SVM 工作的基础。它衡量两个数据点之间的接近程度或远近程度,并确定两种学习中结果输出之间的统计依赖性。这些是欧几里得距离、曼哈顿距离、汉明距离和闵可夫斯基距离,具体取决于数据和手头的任务。

归一化有助于在数据尺度不同时保持比较的公平性。在聚类和分类之间进行选择时,理解这些度量有助于选择解决问题的最合适的方法。这类算法的性能总是在优化距离的基础上得到改善,而这些距离又能在各个领域带来快速准确的预测和分析。