资讯动态

从勾股定理到欧氏距离:推荐系统相似度计算的数学基础

发布时间:2026/10/21 18:12:16 来源:尧图企业网站定制
最近在复盘某电商平台的推荐系统时我发现一个挺有意思的现象线上指标波动的原因绕来绕去最后竟然落在了最基础的距离计算上。做推荐算法的人天天把“相似度”挂在嘴边但真正追问下去很多人对最底层的欧氏距离的理解其实是模糊的。而欧氏距离的根恰恰就是中学学过的勾股定理。这篇文章作为推荐算法系列的数学基础篇先把勾股定理和欧氏距离这件事彻底讲透包括公式的来龙去脉、在高维空间里的直觉、在推荐系统里的实际应用场景以及为什么有时候你得放弃欧氏距离改用余弦相似度。如果你是刚入门推荐系统、协同过滤、KNN这类方向或者做了一段时间算法但想回头补一补数学地基这篇文章都适合你。我会尽量用讲故事的方式把数学公式和实际工程串起来保证看完不光会算还知道什么时候该用、什么时候别用。1. 为什么推荐算法要从勾股定理讲起1.1 推荐系统的本质把用户和物品搬进坐标系推荐系统处理的核心问题用一句话说就是判断两个东西有多像。这里的“两个东西”可以是用户和用户、物品和物品也可以是用户和物品。比如某视频平台要判断“喜欢悬疑片的用户是否也会喜欢科幻片”电商平台要判断“买了这款手机的人是否还可能买另一款手机”本质上都是在做相似度度量。那怎么度量第一步是把用户、物品这些抽象概念变成可以计算的东西。这就是向量化。假设我们有三个用户A、B、C他们对两部电影的评分如下用户《流浪地球》评分《星际穿越》评分A5.03.0B4.04.0C2.05.0每个用户现在就变成了二维平面上的一个点A是(5.0, 3.0)B是(4.0, 4.0)C是(2.0, 5.0)。坐标系里的横轴是第一部电影的评分纵轴是第二部电影的评分。有了坐标距离就可以算了相似度就可以度量了。这就是推荐算法的第一步也是欧氏距离发挥作用的前提。1.2 从勾股定理到距离度量只隔了一层窗户纸勾股定理说的是直角三角形两条直角边的平方和等于斜边的平方也就是a² b² c²。在二维平面里如果我们想知道A(5.0, 3.0)和B(4.0, 4.0)两点之间的直线距离完全可以套用这个定理。横坐标差值是5.0 - 4.0 1.0纵坐标差值是3.0 - 4.0 -1.0这两个差值恰好构成直角三角形的两条直角边而两点之间的直线距离就是斜边。所以距离d √(1.0² (-1.0)²) √2 ≈ 1.414。你看勾股定理和距离计算本质上就是同一件事。欧氏距离这个名字听着高大上其实就是勾股定理在n维空间里的推广。换句话说你中学时就会算欧氏距离了只是那时候不知道它在推荐算法里这么有用。2. 欧氏距离从二维平面到高维空间的完整推导2.1 n维空间的距离公式与直觉理解现实中用户不会只对两部电影评分。某视频平台的用户可能要面对几千部电影某电商平台的用户要面对几万个商品。这样一来每个用户的坐标就不是二维的了而是几千维、几万维的向量。二维到三维还能靠想象到了几百维就只能靠公式了。n维空间里两点p (p₁, p₂, ..., pₙ)和q (q₁, q₂, ..., qₙ)之间的欧氏距离定义是d(p, q) √[(p₁ - q₁)² (p₂ - q₂)² ... (pₙ - qₙ)²]写成求和符号就是d(p, q) √[Σᵢ₌₁ⁿ(pᵢ - qᵢ)²]其实就是把每个维度的差值平方相加最后开根号。二维情形的勾股定理是a² b² c²三维情形是a² b² c² d²n维情形就是n个差值平方加在一起再开根号。这个推广逻辑非常顺勾股定理说的是“互相垂直的方向上的距离可以叠加”而向量空间的每个维度天然就是互相独立的所以距离就是所有维度上差值的平方和的平方根。这里有个直觉上的理解方式。想象你在一个巨大的城市里要去地图上的某个目的地。如果你只能沿着南北和东西方向的路走走出的路径长度是曼哈顿距离也就是各个方向差值绝对值求和。但如果你能直接直线飞过去飞行的路径就是欧氏距离。推荐算法里很多时候我们不是真的“沿路走”而是在度量本质上的差异所以沿直线飞的欧氏距离反而更符合直觉。2.2 一个完整的向量距离计算例子光给公式不够我们实际算一遍。假设现在有两位用户对三部电影的评分向量用户X[5.0, 3.0, 4.0] 用户Y[1.0, 2.0, 5.0]计算步骤分三步走第一步逐维度求差值5.0 - 1.0 4.03.0 - 2.0 1.04.0 - 5.0 -1.0。第二步每个差值取平方4.0² 16.01.0² 1.0(-1.0)² 1.0加总得到18.0。第三步开根号√18.0 ≈ 4.243。这就是一个完整的高维欧氏距离计算过程。每一步都不难真正难的是理解这个数值的含义。4.243这个数值本身没有绝对意义它的意义在于对比。如果用户X和另一个用户Z的距离只有0.5那说明Z和X的观影口味更接近如果距离超过10那基本可以判断这两个人的兴趣差异很大。这个“相对的比较”才是推荐算法用距离的核心逻辑。3. 欧氏距离在推荐系统里的实际应用场景3.1 基于用户的协同过滤找口味相似的人协同过滤是推荐系统里最经典的算法家族核心思路就是“物以类聚人以群分”。基于用户的协同过滤User-based Collaborative Filtering做的是这样一件事你想给用户A推荐电影先找出和A口味最接近的一批用户然后把这些人喜欢而A没看过的电影推荐给A。这里的“口味最接近”直接就能用欧氏距离来算。假设用户A的评分向量和用户B、用户C、用户D分别计算出欧氏距离得到的结果是与B的距离为1.2与C的距离为3.5与D的距离为8.0。那就说明B和A的观影偏好高度相似D和A差异巨大。推荐时给B的权重就应该远高于D。实际工程中有一个细节需要注意评分数据往往是稀疏的也就是很多用户只对少数物品打过评分。这时候如果两个用户的评分物品重叠很少直接计算欧氏距离会很不稳定。一种常见做法是只取两个人共同评分过的维度来计算距离。比如A评价过100部电影B评价过120部但重合的只有15部那就用这15个维度算距离。这种做法能缓解稀疏问题但也会因为维度太少导致距离不够可靠需要配合一定的置信度阈值来使用。3.2 基于物品的协同过滤和聚类的应用另一种常见思路是基于物品的协同过滤Item-based Collaborative Filtering计算的是物品之间的相似度。用户在某电商平台看中一双鞋系统需要推荐类似的鞋款。这时候每个物品被所有用户评分或交互过的记录构成它的特征向量物品间的欧氏距离就反映了它们的“接近程度”。欧氏距离还经常出现在聚类算法里。K-Means聚类第一步需要随机选取中心点之后每次迭代都要把每个样本分配到距离最近的中心点所属的簇。这个“距离最近”绝大多数实现默认用的就是欧氏距离。比如某内容平台要把用户分群分群的结果是“二次元爱好者”“健身党”“科技发烧友”等群体。聚类过程中每个用户向量都会被计算到各个中心点的欧氏距离然后归入距离最小的那个簇。3.3 推荐排序中的“距离惩罚”思路还有一个容易被忽略的应用点。有些推荐排序算法会利用欧氏距离做“探索与利用”的平衡推荐的结果不能总是和用户已知偏好“太像”否则容易陷入信息茧房。做法是在计算用户向量和候选物品向量的距离后调整排序得分给距离稍大的候选物品加一点探索权重。这种情况下欧氏距离不只是用来求相似还直接参与了最终的排序打分。这个应用我建议做推荐的朋友多留意一下。很多团队把全部注意力放在模型结构上却忽略了距离度量本身就能带来业务增益。有一次我们在做某资讯类应用的推荐排序实验时仅仅在最后的融合分数里加了一个基于欧氏距离的探索项整体点击率提升了约4%。这就是基础数学知识直接转化为业务价值的典型例子。4. 操作实战用Python实现欧氏距离与性能优化4.1 三种写法从循环到向量化纸上谈兵不过瘾我们把欧氏距离写成代码。假设有用户向量u和v用Python实现欧氏距离可以有三种层次。基础写法用循环逐维度累加import math def euclidean_distance_loop(u, v): if len(u) ! len(v): raise ValueError(向量维度不一致) total 0.0 for i in range(len(u)): diff u[i] - v[i] total diff * diff return math.sqrt(total)这种写法逻辑最清晰适合理解原理但性能较差。如果数据只有几十维、几千条问题不大一旦到了工业级数据规模比如几十万用户、几千维向量循环写法就会成为性能瓶颈。工程上推荐用NumPy向量化实现import numpy as np def euclidean_distance_numpy(u, v): diff np.array(u) - np.array(v) return np.sqrt(np.dot(diff, diff))更简洁的写法def euclidean_distance_np(u, v): return np.linalg.norm(np.array(u) - np.array(v))第三种写法深度依赖NumPy底层实现把循环下沉到C语言层面计算速度比纯Python循环快几个数量级。4.2 实测数据说话向量化到底提升了多少为了让你直观感受差距我实测了一下。随机生成两个1000维的浮点向量用三种方式分别计算10000次距离实现方式耗时10000次相对速度纯Python循环约3.2秒1倍NumPy差分点积约0.18秒约18倍np.linalg.norm约0.15秒约21倍看到差距了没在推荐系统的离线评估环节我们经常要计算用户和用户、用户和物品之间的全量距离矩阵数据量轻松到百万级、千万级。如果不用向量化实现离线任务可能要多跑几个小时。这还只是单机情况如果涉及到分布式计算这个差距会被进一步放大。4.3 高维空间性能瓶颈与近似方案维度特别高的时候精确计算所有距离会变得非常贵。比如特征维度是512或者1024时几十万条样本的两两距离计算就可能撑爆内存。此时业界常用的方案是近似最近邻搜索ANN。典型工具包括基于树的KD-Tree、基于哈希的局部敏感哈希LSH、基于图算法的HNSW等。这些方案牺牲一部分精度换取大幅的速度提升目标是“找到最接近的几个邻居”而不是“精确求出所有距离”。具体到工程选择上我给一个经验性的建议如果数据量在十万级别以下、维度在100以下直接用NumPy暴力计算就够如果数据量到了百万级别或者维度超过256就要认真考虑引入近似方案。做推荐算法的朋友应该主动了解这些工具因为真实业务的数据规模通常不会给你“精确计算一切”的奢侈。5. 踩坑记录为什么很多推荐场景改用余弦相似度5.1 尺度敏感评分习惯不同害死人欧氏距离有个天生的问题就是对数值尺度非常敏感。假设用户A习惯给高分看什么电影都给4到5分用户B很挑剔一般只给2到3分。两个人在兴趣上其实完全一致都喜欢科幻片、悬疑片但A给《流浪地球》5分《星际穿越》4分B给《流浪地球》3分《星际穿越》2分。如果直接算欧氏距离A和B在每个维度上都差2分距离为√(2² 2²) ≈ 2.83。这个距离甚至可能大于A和一个真正兴趣不同但评分风格相似的用户的距离。换句话说评分尺度的差异会淹没真实的兴趣差异。这在推荐场景里是很要命的。余弦相似度就没有这个问题。它只看向量的方向不看向量的长度。把向量归一化到单位长度后A变成(0.53, 0.85)B变成(0.53, 0.85)两者方向完全一致余弦相似度为1完美相似。这就是为什么在很多协同过滤场景中大家默认选择的不是欧氏距离而是余弦相似度。5.2 稀疏向量的“零值陷阱”推荐系统的评分或交互矩阵通常极度稀疏。假设用户A只对两部电影打了分一部5分一部4分其他几百部全部没看。构建向量时没用评分的位置一般会被填成0。这时候A的向量是(5.0, 4.0, 0, 0, 0, ..., 0)这个向量在几百维的空间里几乎就是一条贴着坐标轴的短线。问题来了如果用欧氏距离计算A和其他用户的相似度那些没有评分的维度全是0。两个人在未评分维度上的差异全部被计入了距离而这些维度实际上并不能反映真实偏好。可能A从未看过某部电影不是因为他讨厌只是他根本没机会看到。但欧氏距离会因为他评了0而认为他和给这部电影打了1分的用户有巨大差异。这种“0值就是不喜欢”的错误假设在欧氏距离的计算框架里很难绕开。余弦相似度因为要除以向量的模长对绝对数值不那么敏感再加上实际工程中常配合评分中心化或均值填充来使用在一定程度上减轻了这个陷阱。5.3 离群点的影响一个极端评分能掀翻整个距离欧氏距离对离群值极其敏感因为差值要取平方才累加。一个维度上差5分贡献的平方项是25相当于五个维度各差1分的效果。在实际数据中如果某一个用户对某部电影给出了极端评分比如1分而其他用户普遍给4到5分仅靠这一个维度就可能让这个用户和所有人的距离都被拉大进而干扰整个推荐结果。这个问题在评分数据上尤其明显。用户的评分行为本来就带偶然性可能那天心情不好给某部电影打了1分这个偶然事件不应该在推荐系统里产生那么大的影响。做过推荐的朋友应该都有体会直接拿原始评分算欧氏距离结果经常会被几个异常值带偏。解决办法通常是先做数据清洗把极端值做截断或平滑处理或者直接选用对离群点更鲁棒的相似度度量。6. 常见问题速查与我的实操建议6.1 推荐场景下常见疑问一览我把实际工作中被问到比较多的问题做了一个汇总方便各位对照自查。问题原因解决思路为什么算出来的欧氏距离特别大特征维度高差值平方累加导致距离随维度增大对特征做归一化或标准化或用余弦相似度评分风格差异大的用户算距离不准欧氏距离对数值尺度敏感先对评分做均值中心化或改用余弦相似度稀疏矩阵直接算距离结果不可靠未评分维度填0造成大量伪差异只取共同评分维度或引入隐式反馈建模全量计算距离矩阵太慢数据量大、维度高使用NumPy向量化条件允许时引入ANN方案距离值到底多大算“相似”欧氏距离是相对概念无绝对阈值按分位数或同簇内距离分布设定动态阈值6.2 我个人的几条实操经验第一归一化几乎是必须的。无论你最终选欧氏距离还是余弦相似度强烈建议先对特征做Min-Max归一化或Z-Score标准化。归一化之后欧氏距离和余弦相似度在某些条件下甚至会产生排序上的一致性。归一化成本极低却能让距离计算的稳定性大幅提升。第二先算分布再定阈值。很多初学者拿到距离矩阵就问“阈值设多少合适”这个问题本身就有问题。距离值受维度、特征尺度、稀疏度影响绝对数值在不同业务之间完全没有可比性。正确做法是算完距离后看一眼分位数比如取95分位数作为“异常远”的边界或者用K-Means聚类后的簇内平均距离来辅助判断。第三欧氏距离和余弦相似度并非互斥。真实业务里我经常两个都算然后交给上层模型去融合。欧氏距离捕捉绝对差异余弦相似度捕捉方向一致性两者有互补性。有些团队在特征层直接将距离和余弦值拼接让模型自己学权重效果往往比单独用某一个更好。第四一定要做特征维度的权重衰减。高维稀疏特征在欧氏距离里会淹没低维稠密特征。比如用户向量里既有评分特征又有行为计数特征行为计数通常数值很大会主导整个距离计算。合理做法是对不同来源特征做降权或归一化处理保证每个特征组对距离的贡献在合理范围内。6.3 后续可以怎么进阶这篇文章是推荐算法数学基础的第一篇掌握了欧氏距离之后下一步建议沿着几个方向往外走一是理解其他距离度量特别是曼哈顿距离、切比雪夫距离和闵可夫斯基距离搞清楚它们在不同场景下的适用性二是深入余弦相似度及其与欧氏距离在归一化条件下的等价关系这是协同过滤里最常被问到的知识点三是了解向量检索相关的工程方案包括量化、HNSW、LSH这些近似搜索方法它们都是在大规模推荐场景里真正落地高维距离计算的必要工具。我自己每次讲推荐算法课或者带新人时都一定会让他们先把这部分基础扎扎实实过一遍。因为后面无论是做协同过滤、矩阵分解还是图神经网络推荐底层的“怎么度量用户和物品的关系”这个问题绕来绕去都会回到今天讲的这些数学内容上。表面上看是勾股定理实际上是整个推荐系统逻辑的起点。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑