推荐系统中的矩阵分解算法介绍
FunkSVD算法用于推荐,就是本文中的MF算法,解决了SVD传统奇异值矩阵分解时,矩阵中存在未知项需要补全之后再SVD进行预测的情况。
在推荐系统中,最基本的一个数据就是用户-物品的评分矩阵,如下图所示。
其中,U1⋯U5表示的是5个不同的用户,D1⋯D4表示的是4个不同的商品,这样便构成了用户-商品矩阵,在该矩阵中,有用户对每一件商品的打分,其中“-”表示的是用户未对该商品进行打分。现在的目的是把没有评分的预测出来,然后根据预测的评分对用户进行推荐。
矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为Rm×n。可以将其分解成两个或者多个矩阵的乘积,假设分解成两个矩阵Pm×k和Qk×n,我们要使得矩阵Pm×k和Qk×n的乘积能够还原原始的矩阵Rm×n:
其中,矩阵Pm×k表示的是m个用户与k个主题之间的关系,而矩阵Qk×n表示的是k个主题与n个商品之间的关系。
如何求解
、
两个矩阵中的元素
转化成回归问题进行求解
构造损失函数
使用原始评分矩阵与重新构造的评分矩阵之间的误差的平方作为损失函数:
注意:损失函数要对有评分的项进行求和。
最终的损失函数:
使用梯度下降算法实现损失函数求解
求对于要预测的每个变量的梯度
更新要预测的每个变量
其中n的取值是1~K
损失函数加入正则化项
目的:防止过拟合
添加正则化因子之后的损失函数:
求梯度
更新变量
通过不断迭代一直到结果收敛。
PS:开发了新技能,Latex,哈哈。不过这公式是真的难写。
P_{m \times k}
\frac{\partial{e_{ij}^2}}{\partial p_{in}} = -2 \times (r_{ij} - \sum_{n=1}^Kp_{in} \times q_{nj})\times q_{nj} = -2\times e_{ij} \times q_{nj}
温故而知新,以前只是简单的看了算法的基本原理和简单实现,当时面试的时候,问的几个问题都在这篇文章中得到了答案【矩阵分解在协同过滤推荐算法中的应用】https://www.cnblogs.com/pinard/p/6351319.html