推荐算法学习(十一):基于邻域的协同过滤

协同过滤是推荐系统的经典算法之一。基于邻域的协同过滤有两类:UserCF,给用户推荐和他兴趣相似的其他用户喜欢的物品;ItemCF,给用户推荐和他之前喜欢的物品相似的物品。基于用户相似度与基于物品相似度的区别在于基于用户相似度是基于评分矩阵中的行向量相似度求解,而基于项目相似度计算式基于评分矩阵中列向量相似度求解。

基于用户的协同过滤UserCF

UserCF是利用行为的相似度计算用户的相似度,其主要步骤有:

  1. 找到和目标用户兴趣相似的用户集合

    • Jaccard相似度:0,N(u),N(v)分别代表用户u和用户v有过正反馈的物品集合

    • 余弦相似度:0

    • 改进的相似度:0,基于流行度进行改进,通过0惩罚了热门物品对相似度的影响力

  2. 用户u对物品i的兴趣度,等价于K个邻居对物品i的兴趣度

    0

    S(u,K)表示和用户u兴趣最接近的K个用户,N(i)表示对物品i有过行为的用户集合, $w_{uv}$表示用户u和v的兴趣相似度,$r_{vi}$表示用户v对物品i的兴趣。

  3. 为用户u生成推荐列表:把和用户兴趣相同的k个邻居,喜欢的物品进行汇总,去掉用户u已经喜欢过的物品,剩下按照从大到小进行推荐。

基于物品的协同过滤ItemCF

ItemCF是利用行为的相似度计算物品的相似度,其主要步骤有:

  1. 计算物品之间相似度

    0

    0

    N(i)表示喜欢物品i的用户数,若N(j)过大,说明j是热门物品很多人都喜欢,需要对N(j)进行惩罚,避免推荐热门物品。

  2. 用户u对物品i的兴趣度,等价于物品i的K个邻居物品,受到用户u的兴趣度

    0

    S(i,K)表示和物品i最相似的K个物品集合,N(u)表示用户u喜欢的物品集合,$w_{ij}$表示物品i和j的相似度,$r_{uj}$表示用户u对物品j的兴趣。

  3. 用户u生成推荐列表:和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名,预测用户u对物品的兴趣度,去掉用户u已经喜欢过的物品,剩下按照从大到小进行推荐。

UserCF与ItemCF

当用户数远大于物品数时,使用采用ItemCF;用户数少于物品数时,使用UserCF更准确。如果物品列表经常变换,那么采用UserCF更准确;如果物品列表相对于用户更稳定,那么采用ItemCF。在冷启动阶段,UserCF对于新加入的物品能很快进入推荐列表,ItemCF对新加入的用户可以很快进行推荐。

基于邻域的协同过滤方法容易实现,可解释性好,还可在离线预先计算近邻,通过预先计算好的相似矩阵找出k近邻后就可以对item评分进行预测,推荐过程的实时性强。当用户数和item数巨大时,保存所有的相似度需要大量的存储空间,可以提前进行过滤,去掉不重要的相似度信息(Top-N过滤,阈值过滤,负值过滤)。邻居数K是重要参数,k可以通过交叉验证来选择,通常k的取值在20到50之间。但当遇到冷启动问题时,新的user和item找k近邻还需要借助其他方法。另外,当评分矩阵很稀疏时,两个用户共同评分的项会很少,预测结果偏差会比较大。

相关工具

  • Surprise工具:https://surprise.readthedocs.io/en/stable/prediction_algorithms_package.html,实现了多种基于邻域的协同过滤算法:

    0

实例:使用基于邻域的协同过滤对MovieLens数据集进行协同过滤(ItemCF)

  • 数据集:movielens,ratings.csv
  • 使用surprise工具中的 KNNBaseline模型进行训练,采用k折交叉验证(k=3),输出每次计算的RMSE, MAE,预测uid、iid结果

代码:https://github.com/Alice1214/RS/tree/master/RS08/knn-cf