SVD++总结

  协同过滤(collaborative filtering)是推荐系统的常用方法,一个重要的优点是CF是领域无关,不涉及领域知识就可以完成模型的训练。协同过滤的两个主要领域是邻居方法(neighborhood methods, 如userKNN、 itemKNN、 slopOne等)和隐式因子模型(latent factor models, 也就是矩阵分解模型(matrix factorization),如SVD、SVD++等),本文是对SVD++算法的总结。

基础矩阵分解模型

  矩阵分解模型是将用户和物品映射到 $f$ 维的隐式因子空间(latent factor space),每个用户关联了一个向量$ p{u}$,每个物品关联一个向量$q{i}$,向量因子隐含了兴趣因子。在该空间里,用户对物品的评分化为向量点积,如下所示。

  该模型最关联的是奇异值分解(SVD),但传统的SVD却不适用于模型的训练,因为用户-物品矩阵往往是极度稀疏的。所以这里只使用已有的评分数据,并通过正则模型防止过拟合。为了训练因子向量,基于已知评分数据集极小化正则均方误差:

这里,$K$表示所有的有评分的$(u,i)$对,$\lambda$表示正则化系数。极小化上式的方法有两种:随机梯度下降和交替最小二乘(ALS),这里不再详述。

偏见

  矩阵分解的一个优点是它可以很灵活地加入各种影响评分的因素,这里我们引入‘偏见’因素。从评分数据中显示出,相比于其他用户,有些用户给分就是偏高或偏。相比于其他物品,有些物品就是能得到偏高的评分。
因此,用 $q{i}^Tp{u}$ 来定义完整评分是有缺陷的,我们认为评分=兴趣+偏见。偏见公式、新评分公式和学习公式如下:

这里,$b_i$表示物品偏见,$b_u$表示用户偏见, $\mu$表示全局均值。至此,SVD矩阵分解算法总结完毕。
最后求导:

隐式数据 (implicit data)

  这次加入的因素是隐式数据表达的物品兴趣偏好。我们称呼用户对物品评分这种类型的数据为显式数据(explicit data)。而用户的行为数据,如浏览电影详情页,观看电影等,我们称之为隐式数据。隐式数据反应了用户的兴趣偏好,即隐式反馈。而在现实的推荐系统中,这类数据才是主体数据。于是现在评分变为显示兴趣+偏见+隐式反馈,用户兴趣=显式兴趣+隐式反馈,新的评分公式如下:

在这里,$N(u)$表示用户u的行为物品集,$y_j$表示物品j所表达的隐式反馈。这就是所谓的SVD++,它在SVD的基础上,加入了隐式反馈因素,更细致地表达了用户兴趣。
  这里隐式反馈的归一化项为什么是$ |N(u)|^{-\frac{1}{2}}$而不是$|N(u)|$,论文里没有提到。我猜想是当用户发生越多行为的时候,他的隐式反馈越准确,相应其权重应提升,$ |N(u)|^{-\frac{1}{2}}$满足了这种设定。

实现

基于python实现了svd++,源码地址:https://github.com/lxmly/recsyspy

参考

Factorization meets the neighborhood: a multifaceted collaborative filtering model
Matrix factorization techniques for recommender systems