4. 协同过滤基础:基于用户的协同过滤(UserCF)原理、相似度计算(余弦相似度、皮尔逊相关系数)
好,咱们今天聊聊协同过滤里最经典的一个流派——基于用户的协同过滤,简称 UserCF。
说实话,我刚入行那会儿,觉得推荐系统特别神秘。后来发现,UserCF 的核心思想其实特别朴素,就一句话:「物以类聚,人以群分」。你想想看,你身边的朋友是不是经常给你推荐好电影、好餐厅?因为他们跟你的口味很像。UserCF 干的就是这事儿——找到跟你品味相似的一群人,然后把他们喜欢的东西推荐给你。
4.1 UserCF 的核心原理
UserCF 的流程,说白了就三步:
- 找相似用户:找到和目标用户兴趣最相似的 K 个用户。
- 收集物品:把这 K 个用户喜欢的物品收集起来。
- 过滤推荐:去掉目标用户已经买过或看过的,剩下的就是推荐候选集。
嗯,这里要注意:第三步里还有个关键操作——排序。你不能把候选集随便扔给用户,得按「预测评分」排个序。评分高的放前面,用户才爱看。
核心公式(预测评分):
用户 u 对物品 i 的预测评分 = 相似用户 v 对物品 i 的评分 × 相似度权重 的加权平均
说白了就是:跟你越像的人,他的意见越重要。
4.2 相似度计算:余弦相似度
找相似用户,总得有个「尺子」吧?最常用的尺子之一就是余弦相似度。
我记得有一次做电商项目,用户行为数据特别稀疏。当时我直接用余弦相似度算,结果发现很多用户之间相似度都是 0。为什么?因为两个用户买的商品完全没有交集。你想想看,一个只买母婴用品,一个只买数码产品,他俩的向量根本不在一个维度上。
余弦相似度的公式长这样:
cosine_similarity(u, v) = (u · v) / (||u|| * ||v||)
其中 u 和 v 是用户对物品的评分向量。举个例子:
| 用户 | 物品A | 物品B | 物品C |
|---|---|---|---|
| 小明 | 5 | 3 | 0 |
| 小红 | 4 | 0 | 0 |
| 小刚 | 0 | 2 | 5 |
小明和小红的向量分别是 [5,3,0] 和 [4,0,0]。算一下余弦相似度:
点积 = 5*4 + 3*0 + 0*0 = 20
模长小明 = sqrt(25+9+0) = 5.83
模长小红 = sqrt(16+0+0) = 4.0
相似度 = 20 / (5.83 * 4.0) ≈ 0.857
嗯,0.857,挺高的。说明小明和小红在「物品A」上口味一致。
我的小技巧: 如果数据特别稀疏,我习惯先做一次「共同评分物品过滤」——只计算那些有共同评分的维度。不然算出来的相似度全是 0,没意义。
4.3 相似度计算:皮尔逊相关系数
余弦相似度有个小毛病:它不考虑用户的「评分习惯」。有的人手松,什么都给高分;有的人手紧,评分普遍偏低。这时候,皮尔逊相关系数就派上用场了。
皮尔逊相关系数,说白了就是「去中心化后的余弦相似度」。它先减去每个用户的平均分,再算余弦。公式如下:
pearson(u, v) = Σ((r_ui - μ_u) * (r_vi - μ_v)) / sqrt(Σ(r_ui - μ_u)² * Σ(r_vi - μ_v)²)
其中 μ_u 是用户 u 的平均评分。
举个例子:
| 用户 | 物品A | 物品B | 物品C | 平均分 |
|---|---|---|---|---|
| 小明 | 5 | 3 | 4 | 4.0 |
| 小红 | 1 | 2 | 3 | 2.0 |
先算差值:
- 小明:物品A 5-4=1,物品B 3-4=-1,物品C 4-4=0
- 小红:物品A 1-2=-1,物品B 2-2=0,物品C 3-2=1
然后算皮尔逊:
分子 = 1*(-1) + (-1)*0 + 0*1 = -1
分母 = sqrt(1²+(-1)²+0²) * sqrt((-1)²+0²+1²) = sqrt(2) * sqrt(2) = 2
相关系数 = -1 / 2 = -0.5
你看,虽然小明和小红对物品A和物品C的评分趋势完全相反,但皮尔逊能捕捉到这种「反向关系」。这在余弦相似度里是看不出来的。
我曾经踩过的坑: 皮尔逊相关系数对「评分数量」很敏感。如果两个用户只有一两个共同评分物品,算出来的相关系数可能非常极端(接近 1 或 -1),但实际上并不可靠。我建议至少要有 5 个以上共同评分物品,再考虑用皮尔逊。
4.4 余弦 vs 皮尔逊:怎么选?
我个人习惯这样选:
| 场景 | 推荐用 | 原因 |
|---|---|---|
| 评分尺度统一(比如都是 1-5 分) | 余弦相似度 | 简单直接,计算快 |
| 用户评分习惯差异大 | 皮尔逊相关系数 | 能消除评分偏差 |
| 数据极度稀疏 | 余弦相似度 | 皮尔逊在稀疏数据下容易不稳定 |
| 需要捕捉负相关 | 皮尔逊相关系数 | 余弦只能反映正相关 |
我的经验: 在实际项目中,我经常两个都算一遍,然后对比结果。如果两个相似度排名差异很大,说明数据里可能有「评分偏差」问题,这时候我会优先用皮尔逊。
4.5 UserCF 的优缺点
聊了这么多原理,咱们也得说说 UserCF 的「脾气」。
优点:
- 直观好理解,业务方也容易接受
- 能发现「跨品类」的惊喜推荐(比如买奶粉的用户也可能喜欢某款游戏机)
- 冷启动阶段,对新物品友好(只要有人喜欢它,就能被推荐出去)
缺点:
- 用户数量大时,计算量爆炸。你想想看,几千万用户两两算相似度,那得算到猴年马月去?
- 用户兴趣变化快。今天喜欢这个,明天喜欢那个,相似用户关系得频繁更新。
- 稀疏性问题。用户-物品矩阵太稀疏,相似度算出来不靠谱。
避坑指南: 我曾经在一个千万级用户的电商平台硬上 UserCF,结果离线计算跑了 12 个小时还没跑完。后来我改用「物品协同过滤(ItemCF)」才把问题解决。所以,如果你的用户量超过 100 万,我建议你先考虑 ItemCF 或者矩阵分解。
4.6 小结
好,咱们今天把 UserCF 的核心原理和两种相似度计算方法都捋了一遍。总结一下:
- UserCF 的核心是「找相似的人,推荐他们喜欢的东西」
- 余弦相似度适合评分尺度统一的场景,计算简单
- 皮尔逊相关系数能消除评分偏差,适合用户习惯差异大的情况
- 实际项目中,记得考虑数据稀疏性和计算效率
下一章,咱们聊聊 UserCF 的「兄弟」——基于物品的协同过滤(ItemCF)。到时候你会发现,它俩的思路正好反过来,但各有各的妙用。
公众号:蓝海资料掘金营,微信deep3321