以上所讲皆为TopK推荐,因为TopK更加接近于满足实际系统的需求,本文再来讲讲评分预测。
评分预测问题就是如何通过已知的用户历史评分记录预测未知的用户评分,如何提高分数的预测精度是要解决的主要问题。评分预测一般使用离线指标RMSE进行评测:
- $r_{ui}$:用户u对物品i的真实评分
- $\hat{r}_{ui}$:用户u对物品i的预测评分
评分预测的目的就是找到最好的模型最小化测试集的RMSE。
平均值
最简单的评分预测算法是利用平均值预测用户对物品的评分
全局平均值
训练集中所有评分记录的评分平均值:
用户评分平均值
用户u在训练集中所有评分的平均值:
物品评分平均值
物品i在训练集中接受的所有评分的平均值:
同类用户对同类物品的平均值
训练集中同类用户对同类物品评分的平均值:
- $\phi (u)$:表示用户u所属的类
- $\varphi (i)$:表示物品i所属的类
值得说明的是,前面的各种求平均评分的方法都可以看做是同类用户对同类物品的平均值的特殊情况。
基于邻域的方法
基于用户的邻域算法
基于用户的邻域算法认为,预测一个用户对一个物品的评分,需要参考和这个用户兴趣相似的用户对该物品的评分:
- $S(u,K)$:与用户u兴趣最相似的K个用户集合
- $\hat{r_u}$:用户u对他评过分的物品的平均评分
用户之间的相似度可以通过皮尔逊系数计算:
基于物品的邻域算法
基于物品的邻域算法在预测用户u对物品i的评分时,会参考用户u对和物品i相似的其他物品的评分:
- $S(i,K)$:和物品i最相似的K个物品的集合
- $\hat{r_i}$:物品i的平均评分
关于如何计算物品的相似度,Badrul Sarwar等在论文里做了详细的研究,文章比较了3种主要的相似度:
- 普通余弦相似度:
- 皮尔逊系数:
- 被修正的余弦相似度:
Sarwar利用MovieLens最小的数据集对3种相似度进行了对比,并将MAE作为评测指标。实验结果表明利用修正后的余弦相似度进行评分预测可以获得最优的MAE。不过需要说明的是,在一个数据集上的实验并不意味着在其他数据集上也能获得相同的结果。
隐语义模型与矩阵分解模型
用户的评分行为可以表示成一个评分矩阵R,其中R[u][i]就是用户u对物品i的评分,但是用户不会对所有物品都评分,所以矩阵中很多元素都是空的,评分预测在某种意义上说就是填空。
SVD
补全一个矩阵的方法有很多,而我们要找的是一种对矩阵扰动最小的补全方法,一般认为如果补全后矩阵的特征值和补全之前矩阵的特征值相差不大,就算是扰动比较小。
给定m个用户和n个物品,和用户对物品的评分矩阵R,SVD方法的步骤:
- 补全缺失值:通过简单方式补全,如用全局平均值或用户/物品平均值
- SVD分解:计算补全后的评分矩阵的奇异值和左右奇异向量
- $S_f$:取最大的f个奇异值组成的“对角矩阵”
SVD分解是早起推荐系统研究中常用的矩阵分解方法,不过该方法具有以下缺点,因此很难在实际系统中应用:
- 巨大的空间需求:推荐系统中的评分矩阵是非常稀疏的,一旦补全,评分矩阵会变成一个稠密矩阵,从而使评分矩阵的存储需要非常大的空间,这种空间的需求在实际系统中是不可能接受的。
- SVD分解计算复杂度很高:特别是在稠密的大规模矩阵上更慢
LFM
2006年Netflix Prize开始后,Simon Funk在博客上公布了一个算法(称为Funk-SVD),一下子引爆了学术界对矩阵分解类方法的关注。而且,Simon Funk的博客也成为了很多学术论文经常引用的对象。Simon Funk提出的矩阵分解方法后来被Netflix Prize的冠军Koren称为Latent Factor Model(简称为LFM)。
LFM在之前介绍过,从矩阵分解的角度说,如果将评分矩阵分解为两个低维矩阵相乘:
- $R$:m×n,R[u][i]表示用户u对物品i的评分
- $P$:k×m,P[k][u]表示用户u对隐类k的兴趣度
- $Q$:k×n,Q[k][i]表示物品i对隐类k的关联度
用户u对物品i的评分预测值,可以表示为:
以上公式通过隐类将用户和物品联系在了一起,但是在实际情况下,系统中包含了某些和用户物品无关的因素,用户中也包含了某些和物品无关的因素,物品也包含了某些和用户无关的因素,因此可以通过三者的偏置来修正以上预测函数:
- $\mu$:训练集中所有记录的评分的全局平均值,不同网站定位不同,网站的整体评分分布也会有所差异
- $b_u$:用户偏置,代表了用户的评分习惯中和物品没有关系的那种因素,初始化为0
- $b_i$:物品偏置,代表了物品接收的评分中和物品没有关系的那种因素,初始化为0
损失函数:
然后用机器学习的方法求解。
SVD++
Koren在Netflix Prize比赛中提出了一个模型,将用户历史评分的物品加入到了LFM模型中,Koren将该模型称为SVD++。
首先将ItemCF设计成一个像LFM那样可以学习的模型:
损失函数:
该模型参数过多,容易造成过拟合,Koren提出应该对w矩阵也进行分解,将参数个数降低到2nF个,模型如下:
进一步,可以将该模型与前面LFM模型相加,同时为了进一步减少参数,可以令x=q:
通过梯度下降法训练以上参数。
加入时间信息
将时间信息应用到基于邻域的模型
Netflix Prize的参赛队伍BigChaos在技术报告中提到了一种融入时间信息的基于邻域的模型,本节将这个模型称为TItemCF。
- $\Delta t=t_{ui}-t{uj}$:用户u对物品i和物品 j评分的时间差
- $f(w_{ij},\Delta t)$:考虑了时间衰减后的相似度函数,随着\Delta t的绝对值增大,f减小,也就是说用户很久以前的行为对预测用户当前评分的影响越来越小
- $\sigma(x)$:sigmoid函数,目的是将相似度压缩到(0,1)区间
将时间信息应用到矩阵分解模型
在SVD++的基础上融入时间信息:
这里,$t_u$ 是用户所有评分的平均时间。period(t)考虑了季节效应,可以定义为时刻t所在的月份。该模型同样可以通过随机梯度下降法进行优化。