SVD建模

来源:互联网 发布:nba联盟数据库 编辑:程序博客网 时间:2024/05/16 00:39

以MovieLens电影推荐为例,SVD(Singular Value Decomposition)的想法是根据已有的评分情况,分析出评分者对各个因子的喜好程度以及电影包含各个因子的程度,最后再反过来根据分析结果。

使用SVD对问题进行建模

SVD的想法抽象点来看就是将一个N行M列的评分矩阵R(R[u][i]代表第u个用户对第i个物品的评分),分解成一个N行F列的用户因子矩阵P(P[u][k]表示用户u对因子k的喜好程度)和一个M行F列的物品因子矩阵Q(Q[i][k]表示第i个物品的因子k的程度)。用公式来表示就是
R = P * T(Q) ,其中T(Q)表示Q矩阵的转置

下面是将评分矩阵R分解成用户因子矩阵P与物品因子矩阵Q的一个例子。R的元素数值越大,表示用户越喜欢这部电影。P的元素数值越大,表示用户越喜欢对应的因子。Q的元素数值越大,表示物品对应的因子程度越高。分解完后,就能利用P,Q来预测Zero君对《七夜》的评分了。按照这个例子来看,Zero君应该会给《七夜》较低的分数。因为他不喜欢恐怖片。
这里写图片描述
图: 推荐问题的因式分解建模

实际上,我们给一部电影评分时,除了考虑电影是否合自己口味外,还会受到自己是否是一个严格的评分者和这部电影已有的评分状况影响。例如:一个严格评分者给的分大多数情况下都比一个宽松评分者的低。你看到这部电影的评分大部分较高时,可能也倾向于给较高的分。在SVD中,口味问题已经有因子来表示了,但是剩下两个还没有相关的式子表示。因此有必要加上相关的部分,提高模型的精准度。改进后的SVD的公式如下:
这里写图片描述
其中mu表示所有电影的平均分,bu表示用户评分偏离mu的程度,bi表示电影评分偏离mu的程度,P,Q意思不变。特别注意,这里除了mu之后,其它几个都是向量。其中qi, pu的维度, 就是隐主题的维度。

分解完后,即(1)式中的五个参数都有了正确的数值后,就可以用来预测分数了。假设我们要预测用户u对电影i的评分:

加入了防止过拟合的lambda参数后, 我们的优化函数为:
这里写图片描述
有了这个优化目标函数后, 就可以使用较多的手段来进行优化了。

以下主要使用梯度下降法解优化目标函数。具体的公式推导可参见论文。同时还可以使用ALS算法进行求解(该方法已经融合进mahout,后续会有专门文章对该算法进行介绍并给出实验结果)

最终推导出的求解公式为:
这里写图片描述
在实现时, 设定最大的迭代次数, 以及收敛的误差, 即可经过迭代球接触bu, bi, qi, pu

因式分解CF效果对比

此处就仅给出两组程序直接运行出来的结果及对应参数, 可以看到, 在latent factor的维度为30, 设定gama和lambda后, RMSE就降低至0.903105,效果比较明显。

SVD++ 引入隐式反馈(Implicit Feedback)

在很多时候,使用user对item的显示投票矩阵因式分解是非常直接的, 且能达到较好的效果, 不过显示投票的一个问题是数据比较稀疏,例如Netflix数据中, 99%的数据都是缺失的, 而在百度关键词推荐系统中, 用户的正/负反馈更是寥寥无几;下图为百度关键词推荐系统中正负反馈按钮设计, 当用户点击‘大拇指’图标时, 则表示正反馈,当用户点击‘垃圾桶’图标时, 则表示不喜欢这个词,为负反馈; 在系统中, 每天通过关键词系统提交的词为百万量级, 而正负反馈的数量之和只是千量级,显式反馈数据较为稀疏。
这里写图片描述
此时就有必要使用用户的隐式反馈数据,例如Netflix上,用户租,买电影的历史记录, 或是百度关键词搜索推荐引擎上的关键词提交信息作为隐式反馈。此时可以使用SVD++方式对问题进行建模。
这里写图片描述
其中mu, bi, bu qi, pu的含义与SVD方法一致, R(u)表示被user 投票的item集合, yi为维度为f的向量, f的维度与qi, pu一致, 表示隐主题的维度。 相当于对用户偏好建模的同时, 还加入了用户投票的item的bias来修正用户在隐主题上的偏好。注意: 此处的隐性反馈并没有直观地反映出来用户对该item的喜欢或厌恶程度, 而是仅仅表明该该用户隐性地对该item进行了投票, 表明用户隐性的反馈不是随机的, 而是有一定目的的。使用该信息就能够很大程度上提升系统的效果。

以下为使用梯度下降法求解上式中各参数的过程, 经过多次迭代直到收敛, 或是达到预先设定的迭代次数后停止。
这里写图片描述
在实际系统中,可能会有多种隐性反馈(Imiplict Feedback), 所以可以将多种隐性反馈整合到同一模型中提高模型的效果, 具体的整合方式为:
这里写图片描述
在我们的系统中, 更多地是使用了图关系挖掘及经典的item-based(较容易并行化), 所以并未对SVD++的效果进行验证, 不过该算法已经在Netflix Prizes上成为比较成功的方法, 所以效果按理说应该会不错。 后续我们也会在百度关键词搜索推荐引擎上尝试该方法, 有结果会与大家进行分享。

0 0
原创粉丝点击