推荐算法丨协同过滤

“协同过滤”就是协同⼤家的反馈、评价和意见⼀起对海量的信息进⾏过滤,从中筛选出⽬标⽤户可能感兴趣的信息的推荐过程。

  • 共现矩阵:用横坐标表示物品,纵坐标表示用户,矩阵元素值表示用户对物品的感兴趣程度。

基于用户的协同过滤

基于用户的协同过滤(userCF)向用户推荐相似用户感兴趣的物品。在为一名用户推荐物品时,首先找到与该用户相似度最高的n个用户,根据共现矩阵计算这些用户对每个物品的感兴趣程度,再将各个物品的得分进行排序,选择得分最高的一系列物品进行推荐。

以上总结了userCF的总体逻辑,但关于用户相似度的计算排序的过程需要可量化的方式。以下进行详细介绍。

用户相似度计算

我们可用共现矩阵中的行向量表示相应用户的用户向量(共现矩阵行向量中的每个值表示了该用户对一个物品的感兴趣程度),这样计算用户相似度便转化为了计算向量相似度,两个向量之间常⽤的相似度计算⽅法有如下⼏种。

余弦相似度

余弦相似度衡量了用户向量i和用户向量j之间的夹角大小,夹角越小则相似度越大。

皮尔逊相关系数

皮尔逊相关系数使用用户平均分对各独立评分进行修正,减小用户评分偏置的影响。 其中, 代表⽤户i对物品p的评分。 代表⽤户i对所有物品的平均评分,P代表所有物品的集合。

以上使用的是用户平均分,同理也可引入物品平均分,不再赘述。

最终结果排序

一般利⽤⽤户相似度和相似⽤户的评价的加权平均获得⽬标⽤户的评价预测。 其中 表示用户u和用户s的相似度。

获得用户p对各个物品的评价预测后,将这些得分进行排序即可得到推荐列表。

userCF存在以下缺点:

  • 互联网应用场景下用户数往往非常大,而存储用户相似度矩阵需要n^2的空间复杂度。
  • 用户的历史数据向量往往非常稀疏,对于只有⼏次购买或者点击⾏为的⽤户来说,找到相似⽤户的准确度⾮常低。

基于物品的协同过滤

基于物品的协同过滤(ItemCF)通过计算共现矩阵中物品列向量的相似度得到物品之间的相似矩阵,再找到⽤户的历史正反馈物品的相似物品进⾏进⼀步排序和推荐。

ItemCF的具体步骤如下:

  • 基于历史数据构建共现矩阵(用户为行,物品为列)
  • 计算两两列向量(即物品向量)的相似性,构建物品相似度矩阵
  • 利用物品相似度矩阵,针对目标用户历史正反馈物品查找TOP K个物品
  • 对于相似物品集合中的物品,利用相似度分值进行排序

如果一个物品与多个历史正反馈物品相似,则相似度需要累加: 其中H是目标用户的正反馈物品集合,权重w为物品间相似度,R是用户对物品的已有评分。

Swing模型

Swing模型和ItemCF十分相似,仅在物品相似度的计算上有所不同。Swing模型的相似度计算方式如下: 其中w_1为喜欢物品i_1的用户集合,v为的交集,overlap计算两个用户喜欢的物品交集的大小,α为参数。

这个相似度计算公式下,v越大两个物品的相似度也越大,引入overlap是为了削弱“小圈子”的影响,例如当两个人同属一个微信群,则被转发到该群的所有链接都可能被两个人同时点开,即便这些链接毫不相关。

总结

  • UserCF基于⽤户相似度进⾏推荐,使其具备更强的社交特性。⽤户能够快速得知与⾃⼰兴趣相似的⼈最近喜欢的是什么,即使某个兴趣点以前不在⾃⼰的兴趣范围内,也有可能通过“朋友”的动态快速更新⾃⼰的推荐列表。这样的特点使其⾮常适⽤于新闻推荐场景。

  • ItemCF更适⽤于兴趣变化较为稳定的应⽤,⽤户在⼀个时间段内更倾向于寻找⼀类商品,这时利⽤物品相似度为其推荐相关物品是契合⽤户动机的 ,例如电商和视频推荐。

协同过滤是⼀个⾮常直观、可解释性很强的模型,但它并不具备较强的泛化能⼒。热门的物品具有很强的头部效应,容易跟⼤量物品产⽣相似性;⽽尾部的物品由于特征向量稀疏,很少与其他物品产⽣相似性,导致很少被推荐。

另外,协同过滤仅利⽤⽤户和物品的交互信息,⽆法有效地引⼊⽤户年龄、性别、商品描述、商品分类、当前时间等⼀系列⽤户特征、物品特征和上下⽂特征。