4. 协同过滤基础:基于用户的协同过滤(UserCF)原理、相似度计算(余弦相似度、皮尔逊相关系数)

好,咱们今天聊聊协同过滤里最经典的一个流派——基于用户的协同过滤,简称 UserCF。

说实话,我刚入行那会儿,觉得推荐系统特别神秘。后来发现,UserCF 的核心思想其实特别朴素,就一句话:「物以类聚,人以群分」。你想想看,你身边的朋友是不是经常给你推荐好电影、好餐厅?因为他们跟你的口味很像。UserCF 干的就是这事儿——找到跟你品味相似的一群人,然后把他们喜欢的东西推荐给你。

4.1 UserCF 的核心原理

UserCF 的流程,说白了就三步:

  1. 找相似用户:找到和目标用户兴趣最相似的 K 个用户。
  2. 收集物品:把这 K 个用户喜欢的物品收集起来。
  3. 过滤推荐:去掉目标用户已经买过或看过的,剩下的就是推荐候选集。

嗯,这里要注意:第三步里还有个关键操作——排序。你不能把候选集随便扔给用户,得按「预测评分」排个序。评分高的放前面,用户才爱看。

核心公式(预测评分):

用户 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