3. 相似度度量方法:欧氏距离、余弦相似度、皮尔逊相关系数、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分极端分。皮尔逊先把每个人的评分减去自己的平均分,再算相似度——这样就能看到真正的「口味相似」了。
皮尔逊相关系数的适用场景:
- 评分数据(用户对物品的评分)
- 需要消除个体偏差的场景
- 数据量较大且分布较均匀时效果更好
3.4 Jaccard相似系数:集合的「重叠度」
Jaccard相似系数,看的是两个集合的交集占并集的比例:
J(A, B) = |A ∩ B| / |A ∪ B|
取值范围[0, 1]。0表示没有共同元素,1表示完全一样。
这个指标特别适合处理二元数据(0/1数据)。比如用户买了哪些商品、用户点击了哪些链接、用户有哪些标签。我做过一个社交推荐项目,用Jaccard算用户之间的共同好友比例,效果出奇的好。
Jaccard相似系数的典型应用:
- 用户共同购买商品分析
- 文本关键词重叠度
- 社交网络共同好友计算
- 基因序列相似性分析
3.5 四种方法对比总结
| 方法 | 核心思想 | 取值范围 | 适用数据类型 | 对量纲敏感 |
|---|---|---|---|---|
| 欧氏距离 | 空间直线距离 | [0, +∞) | 连续型数值 | 是 |
| 余弦相似度 | 方向夹角余弦 | [-1, 1] | 连续型数值 | 否 |
| 皮尔逊相关系数 | 去中心化的余弦 | [-1, 1] | 连续型数值 | 否 |
| Jaccard相似系数 | 集合交集/并集 | [0, 1] | 二元/离散数据 | 不适用 |
选哪个?我的建议是:
- 数据是连续数值且量纲统一 → 欧氏距离
- 数据是连续数值但量纲不统一 → 余弦相似度或皮尔逊
- 数据是评分且有个体偏差 → 皮尔逊相关系数
- 数据是二元/离散特征 → Jaccard相似系数
其实没有绝对的好坏。我在实际项目中经常组合使用多种相似度,然后看哪个在验证集上表现最好。机器学习嘛,最终还是要用数据说话。