☰
欧几里得距离与曼哈顿距离:从数学到工程选型全解析
2026/10/19 10:35:37 网站建设 项目流程

1. 从一次召回效果翻车说起:距离函数的选择如何影响算法结果

1.1 一次召回实验的复盘

前阵子我在调一个面向电商场景的相似商品向量召回模块,用的是某开源向量数据库,底库里存了几万条商品特征向量。一开始我图省事,默认用欧几里得距离,匹配出来的结果看着也还行,准确率大概七成。后来同事提了一嘴:要不要试试曼哈顿距离?我嘴上说着"差别应该不大",手上还是改了配置跑了测试,结果让我有点意外——两个距离度量下的召回结果,重叠率居然只有六成左右。更夸张的是,对某些特定类目,曼哈顿距离的召回准确率直接涨了快9个百分点。

这个现象让我意识到,我过去很长一段时间都在"无脑"使用欧几里得距离,觉得它就是距离度量的默认选项。实际上,距离函数的选择会改变整个算法的行为,尤其在数据带有明显高维稀疏、特征尺度差异大或者噪声点较多的情况下,选错距离度量,后面的聚类、分类、检索结果都会被带偏。

1.2 为什么这个问题值得专门写一篇对比

很多资料里对这两种距离的解释都停在公式层面:欧几里得距离是直线距离,曼哈顿距离是网格路径的折线距离,然后给个二维平面上的示意图就结束了。但真到实战里,我们需要回答的问题远不止"哪条线更短":

  • 在高维空间里,这两种距离的排序稳定性谁更好?
  • 特征没有做标准化的时候,哪个距离更容易被大数值特征支配?
  • 聚类算法用哪种距离更合理,比如K-Means和K-Means变体?
  • 路径规划、推荐系统、异常检测里,各自的默认选择是什么,为什么。
  • 工程实现时,哪种距离更适合做整数运算和内存优化?

这篇内容我会从数学定义、几何直觉、高维行为、工程实现四个角度展开,尽量把两种距离的差异说透,顺带分享一些我在真实项目里踩过坑和验证过的经验。适合正在做机器学习特征工程、聚类分类、向量检索,以及任何需要自己选距离度量的开发者参考。

2. 数学与几何层面的对比:谁在什么条件下更"合理"

2.1 欧几里得距离:直线最短的数学表达

欧几里得距离源自公元前三世纪的几何学定义,描述的是两点在欧氏空间中的直线距离。在n维空间中,两个点 ( A = (a_1, a_2, ..., a_n) ) 和 ( B = (b_1, b_2, ..., b_n) ) 的欧几里得距离为:

[ d_{euclidean} = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} ]

这个公式背后的直觉是"连一条直线,量这条线的长度"。它对应的是我们平时在物理世界里用尺子量两点之间距离的方式。在二维平面上,如果所有坐标轴的单位一致、方向正交,那么欧几里得距离确实是我们认知中最自然的距离。

从数学性质上说,欧几里得距离是平移不变的,也是旋转不变的——你把整个坐标系旋转任意角度,两点之间的直线距离不会变。这在物理模拟、几何计算、图像配准等场景里非常关键,因为它保证了度量和坐标系的朝向无关。另外,欧几里得距离满足三角不等式,也就是任意三点之间,直接距离总是小于等于经由第三点的折线距离,这保证了它作为度量空间基础函数的完备性。

2.2 曼哈顿距离:网格中的真实路程

曼哈顿距离,又叫城市街区距离或L1距离,它模拟的是在方格状街道布局中,你从一个路口走到另一个路口需要的实际路程,因为建筑设计决定了你没法斜穿建筑,只能沿着水平或垂直方向走。公式为:

[ d_{manhattan} = \sum_{i=1}^{n} |a_i - b_i| ]

在二维平面上,它的等距线是菱形(旋转45°的正方形),不是圆形。欧几里得距离下的"距离为1"的点构成一个圆,而曼哈顿距离下"距离为1"的点构成一个以原点为中心的菱形,四个顶点分别在坐标轴上。

换个角度理解:曼哈顿距离等于各维度上绝对差异的总和,所以它天然地把每个维度视为独立贡献。它没有"对角线"这个概念,因此如果在某些场景中维度之间不存在真正的直线连通,用曼哈顿距离反而比欧几里得距离更能刻画真实成本。比如在网格地图的游戏里,角色只能上下左右移动,这时候用欧几里得距离去计算寻路代价,显然和实际移动路径脱节。

2.3 从二维到高维:公式的推广没有想象的那么"自动"

很多开发者习惯把二维的理解直接搬到高维,这是个大坑。在二维空间中,欧几里得距离和曼哈顿距离之间的数值关系是确定的:曼哈顿距离总是大于等于欧几里得距离,满足 ( d_{man} \ge d_{euc} \ge d_{man}/\sqrt{n} )。但在高维空间中,这个关系逐渐失去直觉意义。

高维下,数据点的分布变得稀疏,绝大多数点到原点的欧几里得距离都趋向于相近,这就是所谓的"距离集中"现象。相比之下,曼哈顿距离因为只对各维度绝对差做累加,它对维度的变化更敏感,相对更能保留维度间的差异。这也是在不少高维稀疏特征场景,比如文本TF-IDF向量、稀疏编码特征中,曼哈顿距离反而更稳的原因。后面我会专门用一节来讲这个问题。

2.4 从向量夹角看两种距离的本质区别

欧几里得距离本质上包含了向量之间的"幅度差异"和"方向差异",它会把两个方向一致但长度不同的向量判为有一定距离。而曼哈顿距离在某种意义上更强调每个特征维度上的绝对值差异累计,它对方向不如欧几里得距离敏感,但对每个维度的偏移都有直接的惩罚。

举个例子:三个点 A=(0,0),B=(1,1),C=(0,2)。欧几里得距离中,A到B的距离是 √2≈1.41,A到C的距离是2,所以B和A更近。曼哈顿距离中,A到B是2,A到C也是2,两个点距离相等。如果A、B、C分别代表三个用户在不同商品类目下的购买数量,你更希望哪个距离的判定结果?直觉上,"买两类商品各一件"和"只买一类商品两件"到底哪个更接近"什么都没买",这取决于业务语义,而不是数学定义本身。这也是我后来坚持在项目里对距离度量做业务验证的原因,不能只看坐标系里的几何直观。

3. 六种实战场景下的选型指南:该用哪把尺子量数据

3.1 聚类算法:K-Means为什么默认欧几里得,K-Medoids为什么偏爱曼哈顿

K-Means算法在更新簇中心时,是通过计算簇内所有点的均值来实现的。如果你用欧几里得距离作为样本点到质心的距离度量,质心就是均值向量,这样目标函数——簇内平方误差和——是凸的,迭代优化稳定。如果强行把K-Means的目标函数换成曼哈顿距离,那么最优的簇中心是各维度上的中位数,而不是均值。这导致K-Means算法的收敛性质改变,甚至在更新质心时都不能再用简单求均值的方式。

对应地,K-Medoids(围绕中心点的K-Means变体)选择簇内实际样本点作为中心,因为它的目标是让簇内曼哈顿距离之和最小,中位数比均值更适合作为中心代表。实际项目里我会这样判断:如果特征是连续型数值,且分布接近高斯,用K-Means加欧几里得距离;如果特征带有明显离群点,或者你要的是可解释的"典型样本"而不是"统计均值",不妨试试K-Medoids加曼哈顿距离。

3.2 KNN分类:距离度量如何改变决策边界

K最近邻算法完全依赖距离度量来决定邻居是谁,因此影响直接。在二维平面上,如果特征值经过标准化且所有维度重要性相当,欧几里得距离给出的决策边界更平滑,对旋转不敏感。但如果特征维度中有一个或几个量纲较大,比如年龄和年收入放在一起,欧几里得距离就几乎被收入维度支配,这时候用曼哈顿距离同样存在这个问题,只是程度略有不同。

我的经验是:KNN场景下,特征标准化比距离选择优先级更高。你先把每个特征缩放到均值为0、方差为1的状态,然后再比较两种距离的差异,这时候选择的才是真正意义上的"几何形状差异",而不是被尺度差异蒙蔽下的假象。我在某个用户分群项目里,就是先做MinMax缩放,再对比两种距离,结果KNN的F1值差了两个点,但曼哈顿距离在少数类样本上的召回更稳定。

3.3 地理与网格路径规划:欧几里得距离的"作弊"陷阱

在游戏寻路、机器人路径规划、城市交通路线领域,欧几里得距离常常被用来做启发式估计,但它对网格地图来说并不准确。因为网格地图的移动只能沿格边进行,真实的移动成本是曼哈顿距离(4方向移动)或切比雪夫距离(8方向移动)。如果用欧几里得距离作为A*算法的启发函数,即使在无障碍物的地图上,算法也会展开更多不必要的节点,因为启发值低估了真实代价。

反过来说,如果你在地理信息系统中做的是直线飞行航道分析,或测量两点间的地图直线距离,那欧几里得距离才是准确度量。所以这里的关键不是算得最快,而是先明确你的"移动约束"到底是什么。我自己的做法是,对网格类模型直接默认曼哈顿距离,对有连续运动物理约束的场景才用欧几里得。

3.4 推荐系统的向量召回:Embedding空间的度量偏好

最近几年做向量召回都喜欢把用户和商品映射到同一个低维向量空间,然后用向量相似度做检索。这里很多人习惯用余弦相似度,但有时也会直接使用距离度量。如果你的Embedding是经过L2归一化的,那么欧几里得距离和余弦相似度在排序上是等价的,这是数学上可以推导的结论。但如果Embedding没有归一化,用欧几里得距离会把向量长度差异也算进去,容易让活跃度高的用户向量整体"飘在外圈",召回结果明显偏向这些用户。

曼哈顿距离在Embedding召回里少用,但在部分场景反而有优势:如果你的Embedding存在很多离散的、稀疏的特征维度,那么累加绝对差的方式可以避免因个别维度大波动带来的干扰。我会在这个场景里至少跑一版A/B测试,用召回率和下游业务指标去判断,而不是只看文档里的默认配置。

3.5 异常检测与离群点识别:曼哈顿距离的稳健性优势

异常检测中,我们经常要计算样本点与正常模式的距离。欧几里得距离对离群点非常敏感——因为距离被平方了,稍微离群一点的样本,距离就会被放大。曼哈顿距离没有平方项,所有维度绝对差直接求和,所以它对离群点的惩罚更温和,在高噪声场景中的鲁棒性更好。

在某个金融交易异常检测项目里,我用两种距离分别算孤立森林中样本的异常得分,曼哈顿距离版本在不大幅损失召回的前提下,把正常交易的误报率降低了两成。根本原因就是金融特征里存在不少极端但合理的长尾值,欧几里得距离会因为这些长尾值的平方项放大误差。

3.6 正则化与稀疏性:L1、L2正则化背后的同一个故事

如果你接触过L1正则化和L2正则化,会发现它们和曼哈顿、欧几里得距离概念上高度相关。L1正则化与曼哈顿距离一样,本质是对参数绝对值求和,它的几何意义是让解倾向于稀疏——因为菱形顶点在坐标轴上,很容易把某些参数正好压到0。L2正则化则与欧几里得距离一样,对参数进行平方和开根号,解空间是球体,所以不会促使参数变为0,但会控制参数整体的幅值。

理解这层关系对选距离度量也有启发:如果你的特征本身就偏稀疏,比如文本词袋向量、用户行为布尔向量,用曼哈顿距离往往能匹配这种稀疏结构,不至于因为某些维度的微小非零值导致距离计算失真。反之,如果特征空间是致密连续的,比如图像像素、传感器读数,欧几里得距离通常更符合物理直觉。

下表是一份我平时快速参考的距离度量选型表:

场景默认推荐理由
连续数值、近似高斯分布、K-Means聚类欧几里得距离均值质心优化与平方误差最匹配
高维稀疏特征、文本特征曼哈顿距离对孤立非零维度更敏感,抗稀疏冲击
网格地图寻路(4方向)曼哈顿距离与真实移动路径一致
物理空间直线测量欧几里得距离直线距离符合空间直觉
高噪声数据、异常检测曼哈顿距离平方项会放大离群影响
L2归一化后的向量召回欧几里得距离/余弦相似度两者排序等价,选实现简单的
需要中位数作为簇中心曼哈顿距离中位数是曼哈顿距离的成本最优解

4. 高维数据与特征标准化:被低估的深水区

4.1 维数灾难下的距离集中效应

当你把特征维度从二维提升到几十甚至几百维时,数据点之间的距离会变得越来越"均匀"。原因可以从公式角度理解:在高维空间中,每个维度都贡献一点正的平方差或绝对差,维度越多,距离的累计值越大,而点与点之间的差异相对就变得不明显。更严格的数学结论是,对独立同分布的高维数据,最大距离与最小距离的比值趋近于1,这意味着任何基于距离的算法都会退化成"随机挑选邻居"。

实际项目中,我在处理用户行为特征时动辄有几百个稀疏维度,直接用欧几里得距离算KNN,效果几乎和随机猜测差不多。换用曼哈顿距离后,因为绝对值不像平方那样压制小差异,至少还保留了一点维度间的区分度。当然更根本的解决办法是降维,比如用主成分分析或自编码器压缩特征,但在降维前后,你知道哪种距离保留的信息更多依然很重要。

4.2 标准化能让距离选择更公平

很多人忽略一个前提:距离的计算与特征的量纲强相关。如果特征A取值0~1,特征B取值10000~20000,那么无论欧几里得还是曼哈顿距离,特征B都会彻底主导距离值。这时候讨论哪种距离更合理基本没有意义——真正起作用的只是那个大尺度特征。

所以在对比两种距离之前,务必先做特征标准化。常见的方案是零均值单位方差标准化,或者最小最大缩放。标准化之后,欧几里得距离给每个维度的贡献相当于加权后的平方差,曼哈顿距离则直接给每个维度的绝对差同等权重。注意曼哈顿距离对标准化后的每个维度仍然一视同仁,而欧几里得距离天然会给"大残差"更大的惩罚,这个差异在高维场景会被放大。

4.3 高维下曼哈顿距离的排序稳定性更高

在一个基于图像特征的检索项目中,我把特征从32维扩展到128维,分别用两种距离对同一查询点求Top-10近邻,欧几里得距离的结果发生了大范围重排,而曼哈顿距离的排序结果相对稳定。原因是欧几里得距离中的平方项会对某几个维度的异常大差异赋予极高权重,高维空间中数据点很容易在个别维度出现较大偏移,这种偏移会把排序搅乱。曼哈顿距离没有这种放大机制,因此受少数极端维度影响更小。

这个结论在一些数学文献里也有支撑,即在高维空间中,曼哈顿距离比欧几里得距离展现出更好的相对对比度。所以当你面对高维特征且无法很好的控制维度质量时,曼哈顿距离值得被优先考虑。

4.4 如何在标准化后做快速验证

如果你和我一样没有精力做全量离线测试,我推荐一个低成本验证方法:随机抽取一批样本,任选一个作为查询点,分别计算两种距离下的Top-K重合率。如果重合率很高(比如超过九成),那么选哪个影响不大;如果重合率较低,就要仔细分析差异来自哪些维度,接着定位那几个特别"大"的维度是不是噪声。

5. 工程落地的实现细节与避坑建议

5.1 计算开销:平方根不是唯一成本

欧几里得距离比曼哈顿距离多了一步平方根计算,很多人以为这就是唯一的额外开销。其实不然。对欧几里得距离来说,如果你只需要比较远近而不需要确切距离值,完全可以去掉平方根步骤,直接比较平方和,这在算法优化里几乎成了标准做法。曼哈顿距离则没有类似的简化空间,因为它本来就是各维度绝对差的直接求和。

实际工程里,真正影响性能的不是那步平方根,而是循环内对每个维度做平方运算还是取绝对值。绝对值在整数运算中可以用位操作优化,平方运算必须依赖乘法器,在批量计算大量向量对的时候,曼哈顿距离的整体吞吐量经常能高出欧几里得距离20%到50%。如果你是在写底层CUDA或SIMD代码,这个差异值得纳入选型考量。

5.2 整数溢出与浮点精度问题

高维特征在计算欧几里得距离时,平方和很容易超出32位整数的表示范围。比如某一个维度的差值达到10万,平方后是100亿,已经溢出32位有符号整数。曼哈顿距离在相同条件下累计的是绝对值,虽然数值大,但不容易出现平方级的爆炸增长。这也是我在做嵌入式或边缘端推理时更倾向曼哈顿距离的一个原因,数据尽量用64位整数,避免浮点数精度损失。

浮点精度上,欧几里得距离要先求和再开方,求和阶段如果维度很多,数值跨度大,会损失一些精度;曼哈顿距离的逐维累加同样有累计误差,但因为没有平方和开方的放大,精度整体要稳一点。不过在当前多数场景使用64位浮点数的情况下,这类误差通常可以忽略,只有在极端高维或重复计算大量距离时才需要关注。

5.3 距离度量的语义边界:何时两者一起用

在实际生产系统中,我不会把两种距离视为"只能二选一"的对立选项。有一个经典技巧是把欧几里得距离和曼哈顿距离按比例融合,构成一种加权距离:

[ d_{mixed} = \alpha \cdot d_{manhattan} + (1-\alpha) \cdot d_{euclidean} ]

这里的做法是先分别对两种距离做标准化,让它们的均值和方差对齐,然后通过网格搜索找到最优的加权系数 ( \alpha )。在某些数据分布下,融合距离往往会比单一距离效果更好,因为它同时捕捉了欧几里得距离的方向敏感性和曼哈顿距离的维度独立性。

5.4 我自己踩过的坑:忘掉业务语义只盯数学指标

最后说个印象最深的坑。之前在某推荐项目里,我用离线指标对比两种距离,曼哈顿距离在AUC上略高,于是我直接切到曼哈顿距离线上。结果线上用户点击率掉了一个点。复盘之后发现,是因为离线AUC的评估集和线上真实分布存在偏差,而欧几里得距离在Embedding空间里更贴合余弦相似度的行为,和召回模块的后续排序链路更兼容。

从那以后,我每更换一次距离度量,都会至少做一轮线上小流量对比,而不是只看离线评估。距离度量是一项"牵一发动全身"的底层选择,业务语义、后续算法链路、数据分布三者必须同时考虑,只盯着数学公式看,很难选对。这篇对比写到这里,我其实最希望大家带走的不是一个"谁更好"的结论,而是一套系统性的选型思路:从几何直觉出发,结合高维行为、业务约束和工程效率,最后用数据和业务指标来验证。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询