3. 相似度度量方法:欧氏距离、余弦相似度、皮尔逊相关系数、Jaccard相似系数

说到配对选择,核心问题就一个:怎么判断两个人「像不像」?

我刚开始做推荐系统时,总觉得这是个哲学问题。后来发现,数学早就给了我们一套工具箱。今天咱们就把这四个最常用的度量方法掰开揉碎讲清楚。

说白了,相似度度量就是给「像不像」打个分。分数越高,俩人越匹配。但不同的场景,得用不同的尺子。

相似度度量方法 欧氏距离 空间直线距离 余弦相似度 方向夹角余弦 皮尔逊相关系数 线性相关程度 Jaccard相似系数 集合交集/并集 四种度量方法各有适用场景,选对尺子才能量准

3.1 欧氏距离:最直观的「物理距离」

欧氏距离,说白了就是初中几何里两点间的直线距离。在二维平面上,就是勾股定理。在多维空间里,公式稍微扩展一下:

d(x, y) = √[(x₁-y₁)² + (x₂-y₂)² + ... + (xₙ-yₙ)²]

嗯,这里要注意:欧氏距离对数值大小非常敏感。我做过一个用户画像项目,年龄范围是0-100,收入范围是0-100万。如果不做归一化,收入这个维度会完全主导距离计算。结果就是——年龄差不多的两个人,因为收入差了几万块,距离就大得离谱。

避坑指南: 使用欧氏距离前,一定要做特征缩放(归一化或标准化)。我曾经吃过这个亏,模型跑出来全是收入在起作用,其他特征形同虚设。

欧氏距离适合的场景:

  • 特征维度较少(一般不超过几十维)
  • 各特征量纲一致或已归一化
  • 需要衡量「绝对差异」的场景,比如身高、体重等物理量

3.2 余弦相似度:关注方向而非大小

余弦相似度看的是两个向量的夹角。公式是:

cos(θ) = (A·B) / (||A|| × ||B||)

取值范围是[-1, 1]。1表示方向完全一致,-1表示方向完全相反。

你想想看,为什么有时候欧氏距离不好使?举个例子:两个用户对电影的评分,一个用户习惯打高分(4-5分),另一个习惯打低分(1-2分)。如果用欧氏距离,他俩永远「距离很远」。但余弦相似度会告诉你——他俩的评分趋势其实很像,只是评分尺度不同。

我的经验: 在文本匹配、推荐系统中,余弦相似度比欧氏距离好用得多。因为文本向量通常维度很高(几千甚至上万维),而且大家关心的往往是「主题方向」而非「绝对数值」。

余弦相似度的典型应用:

  • 文本相似度计算(TF-IDF向量)
  • 用户兴趣匹配(评分数据)
  • 图像特征匹配

3.3 皮尔逊相关系数:去中心化的余弦相似度

皮尔逊相关系数,其实就是去均值后的余弦相似度。公式长这样:

r = Σ[(xᵢ - x̄)(yᵢ - ȳ)] / √[Σ(xᵢ - x̄)² × Σ(yᵢ - ȳ)²]

取值范围也是[-1, 1]。0表示不相关,正数正相关,负数负相关。

我个人习惯在用户评分数据上优先用皮尔逊。为什么?因为它能消除用户评分习惯的偏差。比如有的人永远打3-4分,有的人喜欢打1-5分极端分。皮尔逊先把每个人的评分减去自己的平均分,再算相似度——这样就能看到真正的「口味相似」了。

小技巧: 如果数据已经做了中心化处理(均值为0),皮尔逊相关系数就等于余弦相似度。所以它俩本质上是同一类方法,只是预处理不同。

皮尔逊相关系数的适用场景:

  • 评分数据(用户对物品的评分)
  • 需要消除个体偏差的场景
  • 数据量较大且分布较均匀时效果更好

3.4 Jaccard相似系数:集合的「重叠度」

Jaccard相似系数,看的是两个集合的交集占并集的比例:

J(A, B) = |A ∩ B| / |A ∪ B|

取值范围[0, 1]。0表示没有共同元素,1表示完全一样。

这个指标特别适合处理二元数据(0/1数据)。比如用户买了哪些商品、用户点击了哪些链接、用户有哪些标签。我做过一个社交推荐项目,用Jaccard算用户之间的共同好友比例,效果出奇的好。

避坑指南: 我曾经在连续型数据上硬套Jaccard,结果惨不忍睹。后来才意识到——Jaccard只适合离散的、二元的特征。连续数据要先做离散化处理。

Jaccard相似系数的典型应用:

  • 用户共同购买商品分析
  • 文本关键词重叠度
  • 社交网络共同好友计算
  • 基因序列相似性分析

3.5 四种方法对比总结

方法 核心思想 取值范围 适用数据类型 对量纲敏感
欧氏距离 空间直线距离 [0, +∞) 连续型数值
余弦相似度 方向夹角余弦 [-1, 1] 连续型数值
皮尔逊相关系数 去中心化的余弦 [-1, 1] 连续型数值
Jaccard相似系数 集合交集/并集 [0, 1] 二元/离散数据 不适用

选哪个?我的建议是:

  • 数据是连续数值且量纲统一 → 欧氏距离
  • 数据是连续数值但量纲不统一 → 余弦相似度或皮尔逊
  • 数据是评分且有个体偏差 → 皮尔逊相关系数
  • 数据是二元/离散特征 → Jaccard相似系数

其实没有绝对的好坏。我在实际项目中经常组合使用多种相似度,然后看哪个在验证集上表现最好。机器学习嘛,最终还是要用数据说话。


专注资料整理