推荐系统协同过滤算法原理
什么是协同过滤?
协同过滤是推荐系统中应用最广泛的技术之一。它的核心思想非常简单:利用集体智慧。算法不关心物品本身是什么,也不需要构建用户的详细画像,而是基于用户过往的行为数据(如评分、购买、点击)来寻找用户或物品之间的相似性,从而生成推荐。
举个通俗的例子:如果你和小明都喜欢《三体》和《流浪地球》,而小明还喜欢《星际穿越》,那么系统就会认为你也可能喜欢《星际穿越》。这就是协同过滤的直观逻辑。
协同过滤主要分为两大类:
- 基于记忆的协同过滤:直接使用用户-物品交互矩阵进行计算,又分为基于用户和基于物品两种。
- 基于模型的协同过滤:利用机器学习模型(如矩阵分解、神经网络)从数据中学习潜在模式。
本章将重点讲解最基础的基于记忆的协同过滤算法原理。
基于用户的协同过滤
基于用户的协同过滤遵循“志趣相投”的假设:喜欢相同物品的用户,品位也相似。它会为你找到与你历史行为最相似的其他用户,然后把他们喜欢而你没接触过的物品推荐给你。
核心步骤
-
构建用户-物品评分矩阵 假设我们有4个用户和5部电影,矩阵中的数值代表用户对电影的评分(1-5分),空白项代表未评分。
电影A 电影B 电影C 电影D 电影E 用户1 5.0 3.0 4.0 - - 用户2 4.0 - 3.0 2.0 - 用户3 - 5.0 4.0 3.0 5.0 用户4 5.0 3.0 4.0 - 3.0 -
寻找相似用户 以用户1为目标。我们需要计算其他用户与用户1的相似度。相似度计算只基于两个用户共同评分过的物品。例如计算用户1和用户2时,只看电影A和电影C的评分。 常用的相似度计算公式有:
- 余弦相似度:将用户评分看作向量,计算向量夹角的余弦值。值越接近1,向量方向越一致,用户越相似。 $$ \text{cosine}(u, v) = \frac{\sum_i r_{ui} \cdot r_{vi}}{\sqrt{\sum_i r_{ui}^2} \cdot \sqrt{\sum_i r_{vi}^2}} $$ 其中 ( i ) 是共同评分的物品,( r ) 是评分。
- 皮尔逊相关系数:在余弦相似度的基础上,减去了用户的平均评分,解决了不同用户评分尺度不一的问题(比如有些人打分整体偏高)。 $$ \text{pearson}(u, v) = \frac{\sum_i (r_{ui} - \bar{r}u)(r{vi} - \bar{r}v)}{\sqrt{\sum_i (r{ui} - \bar{r}u)^2} \cdot \sqrt{\sum_i (r{vi} - \bar{r}_v)^2}} $$
通过计算,我们可以得到用户1的相似邻居。假设用户4与用户1的相似度最高,其次是用户3。
-
生成推荐列表 从最相似的用户(如用户4)已评分但用户1未评分的物品中,筛选出预测评分最高的几个进行推荐。预测评分通常采用加权平均法: $$ \hat{r}{u, i} = \bar{r}u + \frac{\sum{v \in N} \text{sim}(u, v) \cdot (r{vi} - \bar{r}v)}{\sum{v \in N} |\text{sim}(u, v)|} $$ 这里 ( N ) 是用户 ( u ) 的近邻集合,( \text{sim} ) 是相似度。公式本质是用邻居对该物品“偏离自身平均值”的程度来修正目标用户的平均评分。
基于物品的协同过滤
基于物品的协同过滤与基于用户的逻辑非常对称,但角度不同。它的假设是:喜欢物品A的用户,也喜欢和A相似的物品。算法会计算物品之间的相似度,然后根据你历史上喜欢的物品,推荐与之相似的其他物品。
核心步骤
-
计算物品相似度 同样使用上述评分矩阵,但我们现在要计算的是列与列之间的相似度。相似度基于同时喜欢这两个物品的用户的评分。以计算电影A和电影B的相似度为例,我们只看用户1和用户4的共同评分。 注意这里通常使用余弦相似度或修正的余弦相似度(减去用户平均分),而非皮尔逊系数,因为物品的评分尺度通常已经由平台标准化。
-
寻找相似物品 对于目标用户(如用户2)已评分的物品(电影A、C、D),我们分别找出与它们最相似的一些物品。比如:
- 与电影A最相似的有电影B、E。
- 与电影C最相似的有电影A、E。
- 与电影D最相似的有电影C。
-
生成预测评分 对用户未评分的物品(如电影B、E),预测评分。以预测用户2对电影B的评分为例: $$ \hat{r}{u, i} = \frac{\sum{j \in I_u} \text{sim}(i, j) \cdot r_{uj}}{\sum_{j \in I_u} |\text{sim}(i, j)|} $$ 其中 ( I_u ) 是用户 ( u ) 已评分的物品集合。这个公式只考虑用户打过分的物品 ( j ),用它们与目标物品 ( i ) 的相似度作为权重,进行加权平均。
基于用户与基于物品的直观对比
- 性能:基于物品的协同过滤预处理计算密集,但由于物品间的相似度相对稳定,可离线计算并长期使用,在线推荐速度很快。基于用户的方法在用户数庞大时,在线计算邻居的成本极高。
- 可解释性:“因为您喜欢《三体》,所以为您推荐《球形闪电》”比“和您相似的张三也喜欢《球形闪电》”更让用户信服。基于物品的推荐可解释性更强。
- 适用场景:基于用户适用于用户数相对少于物品数的场景(如新闻,用户兴趣变化快,物品太多);基于物品适用于物品数相对少于用户数的场景(如电商、电影网站,物品更稳定)。
常见挑战与应对思路
1. 数据稀疏性问题
现实中的用户-物品矩阵极度稀疏,99%以上的位置为空。两个用户或物品的交集很少,导致计算出的相似度不可靠。 初步缓解方法:
- 在计算相似度时,对共同评分数量设置阈值,低于阈值的相似度直接丢弃。
- 利用物品的内容信息(如电影的类型)计算基础相似度,填充稀疏的交互矩阵,即混合推荐。
2. 冷启动问题
新用户或新物品没有任何交互记录,协同过滤完全失效。 初步解决方向:
- 新用户:提供热门排行榜,或引导用户注册时选择兴趣标签。
- 新物品:利用物品属性信息进行初步推荐,待积累足够行为数据后再转入协同过滤。
3. 流行度偏差
热门物品会与几乎所有物品产生高相似度,导致推荐结果总是集中在头部,缺乏个性化和惊喜度。 初步修正方法:
- 在相似度计算或评分预测时,引入对物品流行度的惩罚因子,比如用物品被交互次数的对数倒数作为权重。
总结
协同过滤是推荐系统的基石,理解它的原理是进入该领域的第一步。
- 基于用户:物以类聚,人以群分。先找到你,再看你所在的群。
- 基于物品:你是什么,你便喜欢什么。先分析你的历史,再推荐“基因”相近的物品。
- 两种方法本质都是在填充稀疏的评分矩阵,用已知推测未知。
掌握了这些核心原理,再去学习更高级的矩阵分解、神经网络协同过滤等模型时,就会发现它们不过是在此基础上的进化与升华。