尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
机器学习三大距离度量:欧式、曼哈顿、切比雪夫全解析
前阵子在帮一个实验室调试 KNN 推荐效果时折腾了一整天都没找到准确率上不去的原因。K 值试了一堆特征工程也反复做最后猛然发现所有代码里默认用的全是欧式距离——而面对那个高维稀疏的评分矩阵欧式距离恰恰是最不合适的度量之一。后来把距离度量换成曼哈顿距离结果提升肉眼可见。这件事让我彻底改变了对距离度量的看法。它绝不只是 KNN 里一个可以随手填的参数而是整个以“相似性”为核心的机器学习任务的底层地基。本文就围绕机器学习里最常用的三大距离度量——欧式距离、曼哈顿距离、切比雪夫距离——展开聊清楚它们的数学含义、几何直觉、适用场景和常见坑顺便把我实际踩过的坑也一并交代。1. 为什么机器学习需要距离度量相似性的底层逻辑1.1 从最近邻思想说起距离决定了“谁跟你是一类”假设你有一堆已经标注好的样本来了一个新样本你想判断它属于哪一类。KNN 的思路非常直观找到离它最近的 K 个已知样本看看这 K 个邻居大多数属于哪个类别就把它判成哪个类别。这里“离它最近”四个字本质上就是在算距离。距离越小表示两个样本越“像”。距离越大表示越“不像”。所以你选什么样的距离就等于在定义“像”这个字是什么意思。同一个问题同一批数据用欧式距离找出来的邻居可能和用曼哈顿距离找出来的邻居完全不同。比如有两个特征维度样本 A 在坐标(1, 2)样本 B 在坐标(3, 6)样本 C 在坐标(2, 1)。欧式距离算下来 A 到 C 更近曼哈顿距离算下来 A 到 B 和 A 到 C 的距离一样。邻居一换投票结果就可能跟着变最终的分类结论也就变了。1.2 不只 KNN 需要距离聚类、推荐系统、异常检测都离不开它很多人以为距离度量只在 KNN 里出现这是一个很大的误区。KMeans 聚类中每个样本要归到离它最近的质心这个“最近”就是在算距离。层次聚类中两个簇合并的依据是簇间距离。推荐系统中的协同过滤也要计算用户之间、物品之间的相似度再换算成距离。异常检测里的 LOF 算法核心还是基于距离密度来判断离群点。所以凡是模型逻辑里存在“相近则同类、相远则不同类”这类假设的地方距离度量都在悄悄起作用。表面上你在调 K 值、调聚类数、调阈值实际上这些参数的背后距离度量的选择已经把模型的上限框死了。1.3 “直觉合适”不等于“数学正确”大部分从业者的第一反应是直接选欧式距离因为它最符合人的直觉——两点之间直线最短嘛。但这里的“直线最短”是有条件的它要求各个特征维度在量纲和语义上是相对同质的。如果特征里有“年龄”这种几十到几百的数字又有“年薪”这种几万到几十万的数字欧式距离一算年龄那点差异几乎可以被忽略不计距离值基本被年薪主导。所以在动手建模之前先想清楚一件事你手动划分“谁和谁更接近”时凭的是什么直觉如果凭的是“总差异小”那可能是曼哈顿或者欧式的思路如果凭的是“某一个坏维度不能太离谱”那是切比雪夫的思路。三种度量对应三种不同的“相似”定义没有绝对优劣只有适配问题。2. 欧式距离直线最短但最短不一定最优2.1 公式与几何直觉欧式距离的数学形式很简洁。[ d(x, y) \sqrt{\sum_{i1}^{n}(x_i - y_i)^2} ]代码写起来也很直接用 numpy 几行就能搞定import numpy as np def euclidean_distance(x, y): return np.sqrt(np.sum((x - y) ** 2)) x np.array([1, 2, 3]) y np.array([4, 5, 6]) print(euclidean_distance(x, y))它的几何含义就是中学课本里两点间线段的长度。在二维平面里欧式距离对应着纸上画出的那条斜线。在三维空间里对应着空间中两点直接连出来的线段。到了高维虽然没法直观想象但数学本质没有变它计算的是所有维度差值的平方和再开根号。2.2 它最擅长的场景低维稠密连续特征欧式距离最舒服的发挥场景是特征全部是稠密的连续值而且维度不高。比如三维空间中的点云聚类每个点由 x、y、z 坐标描述三个维度量纲一致、语义一致此时欧式距离和人的几何直观完全吻合。再比如图像像素网格上某些简单的模板匹配如果在低维空间里做比较欧式距离也是够用的。还有一类场景是可视化降维后的空间。主成分分析或者 t-SNE 降维到两三维以后大家习惯直接用肉眼观察点的远近那种“远近感”本质上就是欧式距离。所以在嵌入空间里做简单的语义比较时欧式距离往往仍然是最合理的默认项。2.3 它最大的问题平方项会放大差异量纲又太敏感欧式距离有一个容易被忽略的数学性质它先对差值求平方再求和开根号。平方操作会放大大的差异——当一个维度差值达到 10它产生的贡献是 100而不像曼哈顿距离那样只贡献 10。这个特性让它对异常值和离群点异常敏感只要某一个特征上出现了极端偏差整个距离就会被这一个特征裹挟。另外一个更常见的问题是量纲敏感。如果一个特征是“年龄”单位是年取值范围是 0 到 100另一个特征是“消费金额”单位是元范围是 0 到 10000。即使你把两个维度都做了归一化只要没有转换成同一尺度金额的微小波动带来的平方差就可能远超年龄的整体差异。结果是模型无形中变成了只看金额特征的机器。高维情况下问题更严重。当维度上升到几十上百各维度的差值平方加起来后不同样本之间的距离差异会越来越不明显所有点之间的距离都趋于接近这就是常说的“高维诅咒”。这种情况下欧式距离在里面做比较往往什么都区分不出来。3. 曼哈顿距离一步步走出来的“城市街区”度量3.1 从“不能穿越大楼”说起曼哈顿距离的名字来源于纽约曼哈顿区的街道格局——整个街区横平竖直从 A 点到 B 点没法走斜线只能沿着直角街道走。所以它算的是各维度差值绝对值的总和。[ d(x, y) \sum_{i1}^{n}|x_i - y_i| ]代码实现也很简单import numpy as np def manhattan_distance(x, y): return np.sum(np.abs(x - y)) x np.array([1, 2, 3]) y np.array([4, 5, 6]) print(manhattan_distance(x, y))对比欧式距离欧式像是在空旷平原上两条点之间拉直线曼哈顿像是司机在棋盘式街道上按照直角路线开过去。3.2 为什么在高维稀疏场景下它比欧式更稳曼哈顿距离用的是绝对值而不是平方这意味着它不会对某一维度的巨大差值过度放大。单个异常维度的贡献最多等于该维差值本身不会被放大成平方量级。因此它在面对高维数据、包含大量零值的稀疏数据时表现得比欧式距离稳健得多。这一点在推荐系统里特别突出。用户行为数据常常是一个巨大的稀疏矩阵每个用户只对极少数物品产生过交互。假设两个维度上单独看用户 A 和用户 B 只在某一个物品上有差异而在其余大量维度上都是零。用欧式距离计算时平方求和会把那个点上的差异按平方放大显得两用户“离得远”。用曼哈顿距离计算时距离就是那个差值的绝对值相对更温和更符合人对“用户行为相似度”的直观预期。3.3 实战里的典型用法我什么时候主动选它在我自己的项目经验里遇到下列情况我会主动把默认度量从欧式换成曼哈顿特征包含大量计数型数值比如点击次数、浏览次数、购买次数。这类数值天然是稀疏的、有大量零值而且数值本身的大小不一定和“距离”成平方增长关系。维度很高且不需要精确反映欧氏几何属性。比如几百维的文本或行为向量纯粹的欧式距离意义越来越弱。对异常值比较敏感的模型。曼哈顿距离不会因为个别维度的大偏差而让整体距离失控。机器视觉领域还有一个经典案例块匹配中计算两个图像块的相似度时广泛使用的 SAD绝对差值和本质上就是曼哈顿距离。原因是像素差值的绝对值比平方在硬件上更容易快速计算同时对光照差异没那么敏感。这类工程细节虽然不在标准教材里但实战中非常常见。3.4 曼哈顿距离和 L1 正则的奇妙关联稍微拓展一下曼哈顿距离的底层逻辑是 L1 范数而 L1 范数在机器学习里还以 L1 正则的形式出现常用来做特征选择因为 L1 正则会把一部分特征系数压缩到零。相比之下欧式距离对应 L2 范数L2 正则只会把系数压缩到接近零但很少精确等于零。这个数学上的差异也从侧面反映了两种距离的性格不同L1 代表“稀疏、稳健、不折腾”L2 代表“能量平均、喜欢分摊差异”。读到后面你会发现这个差异会一直贯穿到距离度量的选择上。4. 切比雪夫距离当最坏情况决定距离时4.1 棋盘格上的直觉切比雪夫距离最早由俄国数学家切比雪夫提出其定义很特殊[ d(x, y) \max_i |x_i - y_i| ]它不看所有维度差异的总和也不看它们的平方和只看所有维度中绝对差值最大的那一个。换句话说它衡量的是“最糟糕的单一维度差异”。这个度量的经典直觉来自国际象棋国王在棋盘上可以朝八个方向移动从一格走到另一格所需要的最少步数恰好等于横纵坐标差值的最大值。这就是为什么有时候也叫它棋盘距离。4.2 它真正表达的语义极限约束切比雪夫距离的本质是“短板效应”。两个样本最终被认为差距有多大由它们差距最大的那个特征维度决定。这跟欧式、曼哈顿“总账式”的比较逻辑完全不同。举个例子。监控机房里的服务器状态有三个指标代表运行健康度温度、占用率、响应延迟。只要其中任何一个维度偏离标准值超过阈值就应该发出告警。此时评估两台服务器状态的差异就用切比雪夫距离温度差是 2占用率差是 20延迟差是 300 毫秒那么距离就等于 300 毫秒对应的那个维度差值。因为只要这个最差维度超标了其他维度再好也没用。4.3 典型场景异常告警、路径规划与多维达标判断切比雪夫距离在工业异常检测里非常常用。一个设备是否工作正常往往不是看所有指标的平均偏差而是看是否存在一个指标严重超标。用切比雪夫距离来度量当前状态向量和目标状态向量之间的距离一旦某个维度的偏差越线距离立刻变大告警系统就可以快速响应。路径规划里也很常见。两个机器人在棋盘式仓库中移动判断它们在运动中是否会提前进入彼此的禁区关键取决于两个方向中差距更大的那一个是否突破安全边界。这时候用切比雪夫距离去计算相对位置关系比用欧式或曼哈顿更贴近实际碰撞条件。多维达标判断是另一个好用案例。假设一个产品有多个质检指标任何一个指标不过关产品就算残次品。那衡量当前样品和标准样品之间的差距就应该看所有维度中最大的那个偏离而不是取平均式总账。切比雪夫距离在公式上还可以纳入闵可夫斯基距离的统一框架里当 p 趋于无穷大时闵可夫斯基距离就退化为切比雪夫距离。这一点后面单独讲。5. 三大度量如何影响实际建模选型对比与工程建议5.1 一张表看懂三个度量对比维度欧式距离曼哈顿距离切比雪夫距离几何直觉两点直线距离城市街区直角路径棋盘格国王步数数学形式差值平方和开根号差值绝对值求和差值绝对值的最大值对异常值敏感性敏感平方放大相对稳健只看最大偏差很极端对量纲的依赖强大数值维度支配也依赖量纲但不会平方放大依赖量纲且只被最大维度支配高维表现容易失效距离趋同相对更稳定关注单一维度未必合适典型场景低维稠密空间聚类、空间坐标高维稀疏行为数据、图像块匹配工业告警、路径规划、多维达标判断这张表是我做技术选型时脑子里默认浮现的东西。看到问题先落进表里对号入座大部分情况几秒钟就能锁定候选度量。5.2 三种距离其实是一家人闵可夫斯基距离的统一视角很多人没注意到三种距离度量其实属于同一个距离族闵可夫斯基距离。[ d(x, y) \left(\sum_{i1}^{n}|x_i - y_i|^p\right)^{1/p} ]当 p1 时它是曼哈顿距离p2 时它是欧式距离当 p 趋向无穷大时它退化为切比雪夫距离。这个统一视角的价值在于它告诉你三个距离并不是完全割裂的选项而是一个连续演变的光谱。p 越小距离越偏向“所有差异求和”越稳健p 越大距离越偏向“最大差异主导”越极端。理解这一点做选型的时候就不容易把三个度量当成敌对的三个黑盒而是理解成同一条轴上的三个锚点。5.3 我自己的选型路径五个问题决定用哪个实操中我不太喜欢死记硬背而是按下面五个问题走一遍特征是不是同量纲、同语义的连续稠密值如果领域里只有一个单一指标比如像素差、坐标差欧式距离通常没问题。数据维度高不高、稀不稀疏几百维乃至更高维且有大量零值优先考虑曼哈顿或者余弦距离而不是欧式。是否存在“一个维度超限就代表整体超限”的业务语义如果有那就是切比雪夫的舞台。有没有更专门的度量文本用余弦相似度分类特征用汉明距离地理路径用球面距离。这些更专的度量往往比三大标准距离更贴合业务。实在拿不准怎么办把三个度量都放进交叉验证里跑一遍用模型效果说话。距离度量本身也是超参数值得被调参搜索覆盖到。5.4 无论选哪个特征标准化都躲不掉这一点我必须强调很多距离度量翻车不是度量本身的问题而是没有做特征标准化。欧式距离对量纲极敏感前面的例子已经说过了。曼哈顿距离虽然不会平方放大差异但依然会被大数字特征的绝对值主导。切比雪夫距离更极端它只看最大值所以如果某个特征量纲特别大它简直是“天然隐身”。所以在计算任何距离之前先让所有特征站在同一尺度上。常用手段是 z-score 标准化把特征变成均值为 0、方差为 1或者用 min-max 归一化压缩到 0 到 1 区间。标准化做完距离的方向才不会被个别特征牵着走。需要特别提醒的是标准化要放在划分训练集和测试集之后。如果用全体数据求出的均值和方差去标准化训练集和测试集会把测试集的信息泄漏到训练过程中导致评估结果虚高。这个坑非常隐蔽很多老手都会在不知不觉间踩进去。6. 我踩过的“距离度量”的坑与教训6.1 默认欧式距离的翻车现场一次高维稀疏特征实验当时我们做了一个模拟项目 X场景大致是基于用户行为向量做相似物品推荐。特征一共 200 多维绝大多数用户只在几十个物品上有交互记录矩阵稀疏度超过九成。最开始全组默认用欧式距离实验结果很差Top-N 推荐的命中率一直上不去。排查过程不算复杂。我先打印了几个样本对在不同度量下的距离值发现大部分非零差异被集中到少部分高频物品上欧式距离的平方项放大了那几个维度的作用导致所有样本之间的距离都挤在同一个区间里——几乎区分不开。后来把度量换成曼哈顿距离效果立刻改善。再后来测试了余弦相似度在稀疏向量的场景下表现更稳。事后总结下来这个项目里真正的教训是默认值不是免检值距离度量的选择必须要基于数据和业务语义来验证。6.2 特征量纲不统一大数字特征统治了小数字特征另一个项目里我们要根据用户的活动时长和互动评分来判断用户群体亲疏。时长特征的取值在几十到几万秒评分特征的取值只在 1 到 5 之间。最开始直接算距离结果距离几乎完全由时长特征决定评分维度形同虚设模型的聚类结果几乎等于按时长单一维度切分。修复方式也不复杂对所有特征做标准化让每个维度对距离的贡献在合理范围内。做完后聚类结果发生了肉眼可见的变化评分维度开始发挥作用簇间差异明显更合理了。这个案例让我确信一个结论距离计算之前的工作比距离计算本身更重要。地基不打好上层再好的度量也会被带歪。6.3 分类特征和缺失值两个同样致命的小坑很多初学者会把分类特征用序数编码直接塞进距离计算比如“红黄绿”编码成 1、2、3。这样做产生的后果是算法认为黄色和红色之间的距离是 1黄色和绿色之间的距离也是 1但红和绿之间的距离却变成了 2。这种完全人为赋予的差值没有业务依据会让距离度量完全失真。正确的做法是对无序分类特征做独热编码再配合汉明距离或者余弦距离这类适合离散向量的度量。如果你的特征既有数值又有类别可以考虑 Gower 距离之类的混合距离度量它专门为这种场景设计。缺失值也是重灾区。很多人的做法是把缺失值直接补零然后在计算距离时一个缺失很严重的样本反而和大量零特征样本在距离上凑得很近变成“因为数据缺得太多所以看上去最相似”。合理的处理是先做缺失值填补再用有效维度上的均值距离或专门设计的分量距离去计算同时避免把缺失本身当作相似信号。还有一个小经验在比较距离度量时不要只看训练集效果。要同时看验证集和测试集上的稳定性。一个度量如果在训练集上大幅领先但在测试集上掉点严重往往说明它过度拟合了训练集里的某些异常结构。最后分享一个我目前还在坚持的工作习惯每次建立模型之前先打印出几个真实样本对在不同距离度量下的距离矩阵肉眼扫一遍再决定用哪个。别怕麻烦这一眼能挡掉后面很多无效调参的折腾。距离度量这种底层的东西选对了效果提升往往是润物细无声的却在关键节点上决定模型的上限。
RELATED

相关推荐

安了半天环境,刷完普通数组:第24天编程学习实战记录

安了半天环境,刷完普通数组:第24天编程学习实战记录

1. 项目拆解:从“半天装环境”到“刷完普通数组”的真实记录说实话,看到这个标题的第一眼,我就笑了——“安了半天程序”这几个字,简直是每个刷题人的灵魂写照。这个项目不是某个开源框架,也不是什么大型系统&#xff…

📅 2026/10/22 20:00:16
LeetCode Hot100普通数组五题详解:从暴力到最优解与Web环境排查

LeetCode Hot100普通数组五题详解:从暴力到最优解与Web环境排查

0x3f 第24天。先报个流水账:白天几乎没有写自己的代码,时间全泡在“黑马web”课程上,安装环境、配依赖、跑通 demo,真正坐下来敲业务逻辑的时间反而没多少;晚上回到 LeetCode Hot100,终于把“普通数组”这一…

📅 2026/10/22 20:00:16
智能体插槽设计:强类型能力接入接口详解

智能体插槽设计:强类型能力接入接口详解

1. 为什么“插槽”这个词突然在智能体开发圈火了? 最近在几个技术社区刷到高频词——不是“多模态”,不是“RAG”,而是“插槽”。有开发者发帖说:“给Agent加个记忆模块,结果发现框架根本不认我的类,查了半…

📅 2026/10/22 19:55:15
MORE NEWS

更多资讯

📰

基于SpringBoot+Vue的养老公寓管理系统:企业级架构与健康预警闭环解析

做了几年医疗健康类信息化项目,养老公寓管理系统这套东西一直是我觉得“看着简单,做起来全是细节”的典型。很多刚入行的朋友一听到“养老公寓管理系统”,第一反应就是“不就是个带老人信息管理的CRUD吗”。真拿下一个企业级项目的时候&#…

📰

反向传播与自动微分:PyTorch中梯度计算的原理与实践

1. 从链式法则到反向传播:为什么这一步必须学扎实 做深度学习也好几年了,带过不少新人。每次讲到 Back Propagation(反向传播)这一节,我都要专门停下来,因为这是一个分水岭——懂不懂反向传播,直…

📰

LangGraph实战:用图编排搞定复杂智能体流程

做应用层的朋友应该都有同感:模型本身往往不是最难的,真正难的是把模型塞进一条会转弯、会分叉、还会重复执行的业务流水线里。我帮某电商业务搭智能客服时,需求其实很朴素——用户进来先判断意图,查订单的走查询工具,…

📰

学术速递信息筛选与论文解读实战:从信息源到日更体系

1. 一份学术速递背后的信息筛选逻辑每天早上八点半,我习惯性地打开几个固定的信息源,扫一遍过去24小时内冒出来的新论文。这个动作从读研那会儿就开始了,到现在做了快十年,已经变成了一种肌肉记忆。2月23日这一期的学术速递&#…

📰

自动驾驶基座模型:从多模态感知到决策能力升级

前阵子海外GPU技术峰会刚结束,朋友圈几乎被一个词刷了屏:基座模型。尤其是一家长期专注L4级自动驾驶的公司,趁峰会窗口放了基座模型的新进展,并且把“自动驾驶”和“AI能力体系”放进同一个叙事框架。这组合乍看起来有点反差——一…

📰

Spring AI Alibaba停更后,Java AI应用开发的工程化选型与落地实践

1. 一个停更消息引发的技术选型焦虑前几天在技术群里看到有人转了一张截图,说 Spring AI Alibaba 这个项目停更了,紧接着群里就炸了锅。有人感叹“Java 在 AI 这条路上果然走不通”,有人开始盘算着要不要转 Python,还有人直接甩出…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬