【机器学习】一文搞懂机器学习中的距离公式
一、引言
在机器学习的广袤天地中,距离公式宛如隐匿的丝线,悄然编织起数据分类、聚类、异常检测等诸多任务的架构。从简单的欧氏距离,到复杂的马氏距离,每一种距离度量都蕴含独特智慧,为机器解读数据、洞察规律提供关键视角。无论你是初涉机器学习的新手,还是经验颇丰的行家,本文都将带你深入探索这些距离公式的奥秘,助你开启数据智慧之门。
二、常见距离公式详解
2.1 闵可夫斯基距离
闵可夫斯基距离,简称闵氏距离,并非单一距离,而是一组距离的统称。它的核心概念是指,在p维特征空间里,两个样本点之间的直线距离。
假设有两个特征长度均为n的样本点A和B:
A:(X11,X12,X13…X1n),
B:(X21,X22,X23…X2n)
则有闵氏距离公式为下图所示。其中p代表维度,n为特征长度,k的取值从1到n。
则有闵氏距离公式为下图所示。其中p代表维度,n为特征长度,k的取值从1到n。
)
在该公式中,当p=1时,闵氏距离摇身一变成为曼哈顿距离,此时距离是各维度差值绝对值之和;当p=2时,就化作我们熟悉的欧氏距离,对应两点间直线距离;而当p=∞时,则趋近切比雪夫距离,其关注的是各维度差值绝对值的最大值。

不过,闵氏距离也有短板,它默认各分量量纲相同,未考量分量分布差异,像在分析身高(cm)、体重(kg)样本时,就可能得出有偏差的相似度结论。
闵氏距离的缺点:
- 将各个特征维度的量纲,也就是“度量”当作相同单位同等对待了,当量纲过大或者过小时,计算结果的差异变化会过大或过小;
- 没有考虑到在各个特征维度上,数值的分布特征(期望,方差等)可能是不同的。
2.2 欧氏距离
欧式距离全称为欧几里得距离,其源于欧几里得空间中两点间距离公式,欧氏距离是我们最熟悉的 “直线距离”。在n维空间里,对于两点之间的直线距离,其欧氏距离计算公式为:

在二维平面,它就是平面直角坐标系下两点连线长度:

在三维空面,它就是空间三维直角坐标系下两点连线长度:

到了高维空间,原理相通,只是维度增多、计算更加复杂。例如在图像识别中,欧氏距离可衡量图像特征点间相似程度,为图像分类、识别提供依据。
2.3 曼哈顿距离
想象一下纽约曼哈顿街区,道路横平竖直。若驾车从一处十字路口前往另一处,实际行驶距离绝非两点间直线(欧氏距离),而是沿街道的行驶路径之和 |X1 - X2| + |Y1 - Y2| ,这就是 “曼哈顿距离”。下图中,绿色的线是直线距离(欧式距离),而红色、黄色、蓝色的线都代表曼哈顿距离,因为横纵方向上各个小单元格的距离之和是相等的。

数学上,二维平面两点之间的曼哈顿距离公式为:

三维平面两点之间的曼哈顿距离公式为:

推广到n维空间,曼哈顿距离公式为:

如下图所示,红色的线条代表欧式距离,绿色的线条代表曼哈顿距离。

与欧氏距离相比,曼哈顿距离更贴合只能沿坐标轴移动场景,计算只需加减法,在早期计算机图形学、路径规划算法中有诸多应用,可大幅降低浮点运算开销。
2.4 切比雪夫距离
切比雪夫距离可以理解为,在特征空间里,两点之间在各个特征维度上,坐标数值差的绝对值中的最大值。比如说,在国际象棋里,国王能横行、直行、斜行,每次移动一格。从棋盘一格走到最少步数便是切比雪夫距离,因此切比雪夫距离也称为棋盘距离,指的是王在棋盘上到达另一个位置时所需要移动的步数。

如上图所示,国际象棋中,王可以横、纵、斜走,但每次只能走一步。现在王的位置在f6,如果它要移动5b的位置,不管什么样的走法,我们会发现最少要移动4步,而且开始不论是横、纵、斜着走,最终所需的步数是一样的,而这个步数,正好是横轴距离与纵轴距离中的最大值。
二维平面上,两点之间的切比雪夫距离公式为:

扩展到n维度空间,两点之间的切比雪夫距离公式为:

切比雪夫距离适用于在一些对距离上限敏感、无需精准路径场景,如游戏地图寻路(只需关注最远距离方向推进)、机器人运动规划,切比雪夫距离能高效指引方向。
2.5 夹角余弦距离
余弦距离:也称为余弦相似度,往往用于稀疏矩阵的相似度计算(尤其在NLP自然语言处理领域)。它用向量空间中两个向量夹角的余弦值来衡量个体之间的差异大小。夹角越小,余弦值就越大,相似度就越高;反之,夹角越大,余弦值就越小,相似度就越低。

在几何领域,夹角余弦用于度量向量方向差异。根据数学定理,cosθ = 邻边b / 斜边c,所以 cos0° = 1 且 cos90° = 0 。这说明,两条射线交叉形成的角(0°~90°),夹角越小,余弦值就越大;夹角越大,余弦值就越小,夹角的大小与余弦值的大小成反比。机器学习借鉴此概念衡量样本向量差异,维空间中两向量、夹角余弦公式为:

余弦距离对数值的距离不敏感,但是对差异的角度敏感,常用于文本数据挖掘、推荐算法、知识图谱等的数据挖掘场景。在文本分类中,用向量表示文本特征,夹角余弦可判断文本语义相近程度,且不受向量长度影响,专注语义方向,对长、短文本对比分析尤为实用。举例来说,当两条新闻向量夹角余弦等于1时,意味着角度为0,这两条新闻完全重复(用这个办法可以删除爬虫所收集网页中的重复网页)当夹角的余弦值接近于1时,角度越接近0,两条新闻相似(可以用作文本分类);当夹角的余弦值接近0时,角度越接近90°,两条新闻越不相关。
2.6 汉明距离
汉明距离主要针对两个等长字符串,定义为将一个字符串变换为另一个所需的最小替换次数。例如,字符串 “1011” 和 “1101”,有两位不同,汉明距离即为。在信息论、编码理论里,它用于衡量编码差异、检错纠错;在机器学习聚类分析文本数据时,可依汉明距离归并相似文本,助于文本快速分类,提升处理效率。
2.7 杰卡德相似系数与杰卡德距离
杰卡德相似系数着眼于集合,指两集合交集元素个数在并集元素个数中占比,即。与之相反,杰卡德距离衡量两集合区分度,用不同元素占比表示:。以样本向量维度取值为例,若向量各维度是二值特征(如是否含某词、有无某属性),杰卡德距离可有效评估样本相似性,在推荐系统、文本挖掘(分析文本关键词集合差异)等场景广泛应用,助力筛选关联物品、挖掘相似文本。
2.8 兰氏距离
兰氏距离又称 Lance 距离、Willcox 距离,由 Lance 和 Williams 最早提出,它衡量两个向量间的相对差异,对数据的量纲不敏感,适用于包含高度偏态或有奇异值的数据。其计算公式为:。例如,在分析不同城市居民消费结构数据时,各消费品类数值差异大、量纲不一,兰氏距离能合理比较城市间消费模式相似性,找出消费偏好相近群体,为市场细分、商业布局提供参考。
2.9 马氏距离
马氏距离基于样本分布,考虑数据协方差结构,能排除变量相关性干扰、消除量纲影响。假设有个样本向量,协方差矩阵为,均值向量为,样本向量到的马氏距离表示为:,向量与间马氏距离定义类似。如在医学诊断中,分析多项生理指标(各指标有相关性、量纲不同)判断疾病,马氏距离可精准衡量患者指标偏离正常群体程度,辅助医生识别异常、诊断病症,提高诊断准确性。
三、各距离公式的 Python 实现
3.1 准备工作
在开启代码实现之旅前,我们需引入一位得力 “助手”——Python 的科学计算库 Numpy。它犹如一座装满工具的百宝箱,为数组操作、数学计算提供超强助力。其优势显著:一是高效的数组操作,无论是创建、索引、切片还是重塑数组,Numpy 都能闪电般完成,让数据处理流畅无阻;二是丰富的数学函数,涵盖线性代数、傅里叶变换、统计函数等,恰似给编程者配备了专业数学智囊团,复杂计算瞬间化简。有了 Numpy 加持,后续距离公式的代码实现将事半功倍。
3.2 各距离公式代码示例
3.2.1 闵可夫斯基距离
import numpy as np
def minkowski_distance(x, y, p):
return np.power(np.sum(np.power(np.abs(x - y), p)), 1 / p)
# 示例数据
point1 = np.array([1, 2, 3])
point2 = np.array([4, 5, 6])
# 计算闵可夫斯基距离,这里以p=3为例
distance = minkowski_distance(point1, point2, 3)
print(f"闵可夫斯基距离(p=3): {distance}")
在上述代码中,我们定义了 minkowski_distance 函数,它接收两个点坐标数组 x、y 以及参数 p。函数内先用 np.abs(x - y) 求出各维度差值的绝对值数组,再用 np.power 对差值数组按 p 次幂运算,接着 np.sum 求和,最后用 np.power 开 1 / p 次方得到闵可夫斯基距离。以 point1 和 point2 为例,当 p = 3 时,算出特定闵氏距离值,若改变 p,可探索不同距离度量效果,如 p = 1 得曼哈顿距离,p = 2 为欧氏距离。
3.2.2 欧氏距离
import numpy as np
# 示例数据
point1 = np.array([1, 2, 3])
point2 = np.array([4, 5, 6])
# 利用 Numpy 函数计算欧氏距离
distance = np.linalg.norm(point1 - point2)
print(f"欧氏距离: {distance}")
这里借助 np.linalg.norm 函数,它默认按欧氏距离(L2 范数)计算两向量差的范数,即欧氏距离。输入 point1 和 point2 坐标数组,一步到位得出距离。对比按公式 np.sqrt(np.sum(np.square(point1 - point2))) 分步计算,此方法简洁高效,代码量少,还利用了 Numpy 底层优化,执行更快,是计算欧氏距离首选,常用于图像特征匹配、K-Means 聚类初始中心选取等。
3.2.3 曼哈顿距离
import numpy as np
# 示例数据
point1 = np.array([1, 2, 3])
point2 = np.array([4, 5, 6])
# 计算曼哈顿距离
distance = np.sum(np.abs(point1 - point2))
print(f"曼哈顿距离: {distance}")
该代码中,np.abs(point1 - point2) 先算出两向量各维度差值绝对值数组,如 [3, 3, 3],再用 np.sum 对这些绝对值求和,完美契合曼哈顿距离定义。如 point1 和 point2 示例,结果是各维度差值绝对值之和 9,验证了函数正确性。在路径规划算法里,用此代码模拟城市街区移动成本,可快速比较不同路径 “距离” 优劣,辅助智能导航寻优。
3.2.4 切比雪夫距离
import numpy as np
# 示例数据
point1 = np.array([1, 2, 3])
point2 = np.array([4, 7, 5])
# 计算切比雪夫距离
distance = np.max(np.abs(point1 - point2))
print(f"切比雪夫距离: {distance}")
该代码中 np.max(np.abs(point1 - point2)) 先是 np.abs 求出坐标差值绝对值数组,像示例得 [3, 5, 2],再用 np.max 找出其中最大值 5,此即切比雪夫距离,对应国际象棋国王最少步数场景。在游戏地图设计中,用此计算角色到目标点切比雪夫距离,能快速圈定关键移动方向,聚焦重点探索区域,提升游戏 AI 效率。
3.2.5 夹角余弦距离
import numpy as np
# 示例数据
vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 7, 5])
# 计算夹角余弦
cosine_similarity = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))
print(f"夹角余弦值: {cosine_similarity}")
该代码中,np.dot(vector1, vector2) 算出两向量点积,反映向量同向程度;np.linalg.norm(vector1) 和 np.linalg.norm(vector2) 分别求两向量 L2 范数即模长,按夹角余弦公式组合运算,得到 vector1 与 vector2 夹角余弦值。如示例数据算出值约 0.929,接近 1 表明夹角小、方向相近,符合余弦值与夹角关系理论。在文本分类任务中,将文本转向量后用此代码,可依余弦值判断文本语义亲疏,精准分类。
3.2.6 汉明距离
import numpy as np
# 示例数据,两个等长字符串对应数组
string1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1])
string2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1])
# 计算汉明距离
hamming_distance = np.sum(string1!= string2)
print(f"汉明距离: {hamming_distance}")
该代码的关键在于 np.sum(string1!= string2),通过对两等长数组对应元素比较(!= 操作),生成布尔数组,True 处表示元素不同,np.sum 统计 True 数量即不同元素个数,也就是汉明距离。如示例 string1 和 string2,有 6 位不同,汉明距离为 6,精准反映两 “字符串” 差异程度。在通信编码纠错中,依汉明距离识别传输错误码位,助于恢复正确信息。
3.2.7 杰卡德相似系数与距离
from scipy.spatial.distance import pdist
import numpy as np
# 示例数据,需为二值特征向量
vector1 = np.array([1, 1, 0, 1, 0, 1, 0, 0, 1], dtype=int)
vector2 = np.array([0, 1, 1, 0, 0, 0, 1, 1, 1], dtype=int)
# 计算杰卡德距离
distance = pdist(np.vstack([vector1, vector2]), 'jaccard')
print(f"杰卡德距离: {distance[0]}")
该代码中引入 scipy.spatial.distance 模块的 pdist 函数,它对输入数组按指定距离度量计算。先 np.vstack 将两向量堆叠,符合函数输入要求,指定 ‘jaccard’ 按杰卡德距离计算。示例数据模拟二值特征样本,如关键词是否出现,函数依集合方式算出杰卡德距离,结果反映样本区分度。在推荐系统里,用杰卡德距离对比用户物品偏好集合,挖掘相似兴趣用户,精准推荐。
3.2.8 兰氏距离
from scipy.spatial.distance import pdist
import numpy as np
# 示例数据
vector1 = np.array([1, 2, 3])
vector2 = np.array([4, 7, 5])
# 计算兰氏距离
distance = pdist(np.vstack([vector1, vector2]), 'lance')
print(f"兰氏距离: {distance[0]}")
该代码同样借助 scipy.spatial.distance 模块的 pdist 函数,输入示例向量并指定 ‘lance’(对应兰氏距离)。函数内部按兰氏距离公式,对堆叠数组各维度数据处理,考虑量纲差异,算出相对距离值。如 vector1 和 vector2 数据,结果给出两向量兰氏距离,适用于分析量纲混杂数据相似性,像比较不同产品多属性指标,精准洞察产品差异。
3.2.9 马氏距离
from scipy.spatial.distance import mahalanobis
import numpy as np
# 示例数据
vector1 = np.array([1, 2])
vector2 = np.array([4, 7])
cov_matrix = np.array([[1, 0.5], [0.5, 1]]) # 协方差矩阵
# 计算马氏距离
distance = mahalanobis(vector1, vector2, cov_matrix)
print(f"马氏距离: {distance}")
该代码使用 scipy.spatial.distance 模块的 mahalanobis 函数计算马氏距离,需传入两个向量 vector1、vector2 及协方差矩阵 cov_matrix。函数依据马氏距离公式,考虑数据分布协方差特性,对向量差值做变换计算,输出反映向量在分布中相对距离。如示例,依给定协方差,算出 vector1 到 vector2 马氏距离,在多变量数据分析、异常检测领域,能精准甄别异常样本,辅助决策。
四、距离公式的应用场景
4.1 聚类算法
聚类,恰似一场数据分类的盛宴,旨在将相似样本归拢成群。K-Means 作为聚类算法的明星成员,以距离为尺,衡量样本间亲疏。如在分析消费者购物行为时,将消费记录化作多维向量(购买频次、消费金额、品类偏好等维度),用欧氏距离度量,距离近的消费者购物模式相仿,可聚为一类,助商家洞察消费群体特性。再看 DBSCAN,基于密度概念聚类,通过距离圈定核心点、边界点与噪声点。以城市商圈分布研究为例,店铺坐标为数据点,设定距离阈值,相近店铺构成核心商圈(核心点),边缘关联店铺为边界,孤立店铺成噪声,助力商业布局规划。不同距离公式在聚类中表现各异,欧氏距离聚焦整体数值差异,对球状分布数据聚类效果佳;余弦相似度关注向量方向,适用于文本、高维稀疏数据聚类,从不同视角挖掘数据内在结构,为聚类分析注入多元智慧。
4.2 分类算法
分类算法宛如精准导航,引领数据驶向既定类别港湾。KNN(K - 近邻算法)堪称分类翘楚,在 Iris 鸢尾花数据集分类任务中大放异彩。该数据集含花萼、花瓣长宽等特征,KNN 依据样本特征向量距离判断类别归属。对于未知花样本,计算它与已知类别样本(训练集)距离,近邻样本 “投票” 定其类别。若数据特征连续,欧氏距离能精准捕捉特征差异;若遇离散特征,如花朵颜色(红、蓝、紫等),曼哈顿距离更胜一筹,因其擅长处理非连续、类别型数据,仅考量特征值差异次数,精准匹配样本特征,让分类决策精准无误,广泛应用于医疗诊断、图像识别、信用评估等领域,依数据特性选对距离公式,是开启精准分类之门的关键密钥。
4.3 文本挖掘
在浩渺的文本海洋中,挖掘文本关联与差异是关键诉求。文本经向量化后,余弦相似度化身文本亲疏 “裁判”。如在新闻资讯聚合平台,将新闻文本转为词向量,用余弦相似度度量,相似新闻(如体育赛事报道、科技成果发布)聚类呈现,既方便用户浏览同类资讯,又为个性化推荐夯实基础。汉明距离则专注文本差异细节,在文本纠错、版本比对场景作用斐然。比如比对论文不同版本,字符差异一目了然,快速定位修改之处。在自然语言处理(NLP)的广袤天地,距离公式应用广泛。情感分析里,对比正负样本评论向量距离判断情感倾向;机器翻译中,衡量源文本与翻译候选文本距离筛选最优译文,从多维度解锁文本隐藏信息,让机器理解文本语义、服务人类需求。
五、总结与展望
本文对机器学习领域的诸多距离公式抽丝剥茧,从闵可夫斯基距离的多元统一,到欧氏、曼哈顿、切比雪夫距离的直观呈现;从夹角余弦、汉明距离、杰卡德距离的独特视角,再到兰氏、马氏距离的精妙度量,各公式特色鲜明。Python 实现借助 Numpy、Scipy 等库,代码简洁高效,为算法落地铺就道路。在应用中,聚类、分类、文本挖掘等场景各取所需,不同距离度量成为挖掘数据价值的关键工具。
展望未来,随着数据量呈指数级增长、维度持续攀升,传统距离度量面临挑战。一方面,需探索适应高维稀疏数据的距离公式,优化计算复杂度,让距离计算在海量数据中依然敏捷;另一方面,针对复杂结构数据,如图、时间序列,融合领域知识设计专属距离度量,将是突破方向。相信在持续探索下,距离公式将不断进化,为机器学习注入源源不断动力,解锁更多数据隐藏奥秘,推动技术迈向新高度。
