参考自:http://blog.csdn.net/wjmishuai/article/details/71191945html
http://www.cnblogs.com/Xnice/p/4522671.html算法
基于潜在(隐藏)因子的推荐,常采用SVD或改进的SVD++函数
奇异值分解(SVD):优化
考虑CF中最为常见的用户给电影评分的场景,咱们须要一个数学模型来模拟用户给电影打分的场景,好比对评分进行预测。ui
将评分矩阵U看做是两个矩阵的乘积:spa
其中,uxy 能够看做是user x对电影的隐藏特质y的热衷程度,而iyz能够看做是特质 y 在电影 z中的体现程度。那么上述模型的评分预测公式为:.net
q 和 p 分别对应了电影和用户在各个隐藏特质上的特征向量。htm
以上的模型中,用户和电影都体现得无差异,例如某些用户很是挑剔,老是给予很低的评分;或是某部电影拍得奇烂,恶评如潮。为了模拟以上的状况,须要引入 baseline predictor.blog
其中 μ 为全部评分基准,bi 为电影 i 的评分均值相对μ的偏移,bu 相似。注意,这些均为参数,须要经过训练获得具体数值,不过能够用相应的均值做为初始化时的估计。ip
模型参数bi,bu,qi,pu经过最优化下面这个目标函数得到:
能够用梯度降低方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定pu优化qi,而后固定qi优化pu,交替更新。梯度降低方法中参数的更新式子以下(为了简便,把目标函数中的μ+bi+bu+q⊤ipu总体替换为r^ui):
其中α是更新步长。
SVD++:
某个用户对某个电影进行了评分,那么说明他看过这部电影,那么这样的行为事实上蕴含了必定的信息,所以咱们能够这样来理解问题:评分的行为从侧面反映了用户的喜爱,能够将这样的反映经过隐式参数的形式体如今模型中,从而获得一个更为精细的模型,即是 SVD++.
其中 I(u) 为该用户所评价过的全部电影的集合,yj为隐藏的“评价了电影 j”反映出的我的喜爱偏置。收缩因子取集合大小的根号是一个经验公式,并无理论依据。
模型参数bi,bu,qi,pu,yj经过最优化下面这个目标函数得到:
与SVD方法相似,能够经过梯度降低算法进行求解。
使用用户的历史评价数据做为隐式反馈,算法流程图以下: