本篇文章旨在梳理一下在NetFlix推荐系统中大放异彩的矩阵分解模型,介绍svd模型及其相关变种。
在评分预测问题中,最基本的算法是协同过滤算法,但是协同过滤模型又存在以下几个缺陷:
a.物品间的相关性不会因为维度增加而增加
b.历史评分矩阵过于稀疏,计算结果容易受维度数量影响,计算结果波动较大
这些问题都可以在矩阵分解中得到解答,矩阵分解就是将一个大的矩阵分解成几个小的矩阵相乘,其中最著名的就属svd算法,具体原理可以参考这篇博客。
漫漫成长:奇异值分解(SVD)zhuanlan.zhihu.com评分公式为:
其中k为保留的奇异值的个数,一般k的取值远小于物品数或用户数。若我们需要预测某个缺失的评分结果,只需要计算对应小矩阵的乘积即可。
Funk SVD
但在使用svd时需要对矩阵中的缺失值进行填充,对于一个用户没有发生过行为的物品,使用何种填充算法表达用户偏好是一个难题,这也导致svd在实际的推荐场景中应用并不广泛。
为了解决以上问题,funk svd 应运而生。为简化计算,funk svd仅将矩阵分解成2个矩阵,使用均方差作为损失函数,通过梯度下降更新P、Q矩阵的值,可以理解为在svd中引入了线性回归。
将M矩阵分解成P、Q两个矩阵
预测结果:
添加正则项,定义损失函数:
分别对P、Q矩阵求偏导:
更新:
Bias-SVD
在funk-svd的基础上添加了用户的个性化部分,
bi(物品偏移):表示了物品接受的评分和用户没有多大关系,物品本身质量决定了的偏移。bu(用户偏移):有些用户喜欢打高分,有些用户喜欢打低分,用户决定的偏移
μ(全局平均值偏移):根据网站全局打分设置的偏移,可能和整体用户群和物品质量有相对应的关系。
预测公式:
所以这里最小化的损失函数:
更新:
svd ++
在bias-SVD的基础上引入用户的隐式反馈,引出了svd++算法。对于某个用户u的隐式反馈物品集合为N(u), yi为隐藏的评价了物品j的个人喜好偏置,这里缩放因子取经验值。
预测公式:
更新的参数需要增加,以及更改qi的更新公式: