【矩阵分解二】FunkSVD

改进点(跟SVD比):

一句话总结改进点和优化点:改进SVD的计算效率问题、数据稀疏问题;将矩阵R分解为两个低维矩阵,通过重构的低维矩阵预测用户对物品的评分,目标函数中加入正则,控制模型方差。


FunkSVD是在传统SVD面临计算效率问题时提出来的,既然将一个矩阵做SVD分解成3个矩阵很耗时,同时还面临稀疏的问题,那么我们能不能避开稀疏问题,同时只分解成两个矩阵呢?也就是说,现在期望我们的矩阵R这样进行分解:

这种简化的矩阵分解不再是分解为三个矩阵,而是分解为两个低秩的用户和物品矩阵,其实就是把用户和物品都映射到一个 k 维空间中,这个 k 维空间对应着 k 个隐因子,我们认为用户对物品的评分主要是由这些隐因子影响的,所以这些隐因子代表了用户和物品一部分共有的特征,在物品身上表现为属性特征,在用户身上表现为偏好特征。只不过这些隐因子并不具有实际意义,也不一定具有非常好的可解释性,每一个维度也没有确定的标签名字,所以叫做 “隐因子”。

主要思想:

核心思想认为用户的兴趣只受少数几个因素的影响,因此将稀疏且高维的User-Item评分矩阵分解为两个低维矩阵,即通过User、Item评分信息来学习到的用户特征矩阵P和物品特征矩阵Q,通过重构的低维矩阵预测用户对产品的评分。由于用户和物品的特征向量维度比较低,因而可以通过梯度下降(Gradient Descend)的方法高效地求解。

目标函数

FunkSVD如何将矩阵R分解为P和Q呢?这里便用到了到了机器学习算法,实际上是应用线性回归的思想,我们的目标是让用户已有评分和用矩阵乘积得到的评分残差尽可能的小,所以用均方差作为损失函数,来寻找最终的 P 和 Q。即通过 User-Item 评分信息来学习到的用户特征矩阵 P 和物品特征矩阵 Q,通过重构的低维矩阵预测用户对物品的评分。

假设某一用户 𝑢 对物品 𝑖 的评分为 𝑟𝑢𝑖,经过矩阵分解投射到 𝑘 维空间的对应的用户 𝑢 的隐含特征向量为 𝑝𝑢,对应的物品 𝑖 的隐含特征向量为 𝑞𝑖,两个向量中的元素分别表示用户 𝑢 和物品 𝑖 对各项隐因子的符合程度,有正向的也有反向的。可用两个隐含特征向量的点积来近似还原矩阵分解前的原始值,它表达了用户 𝑢 对物品 𝑖 的总体兴趣,表示为:

将 𝑟𝑢𝑖 作为真实评分,将 𝑟̂ 𝑢𝑖 作为预测评分,针对所有已有评分的样本,可得到目标函数:


其中,𝜅 是已有评分的用户和物品对的样本集,𝜆 是正则化系数,是一个超参数.其中P是用户矩阵,Q是item矩阵。

公式中加号前一部分损失函数,控制着模型的偏差,即分解后的矩阵预测分数,要和实际的用户评分之间误差越小越好;加号后一部分是正则化项,控制着模型的方差,即得到的隐因子向量要越简单越好,以免出现过拟合。

求解

梯度下降法求解参数:

将上式分别对 𝑝𝑢、𝑞𝑖 求导我们得到:

在梯度下降法迭代时,𝑝𝑢、𝑞𝑖 的迭代公式为:

通过迭代我们最终可以得到 P 和 Q,进而用于推荐。FunkSVD 算法虽然思想很简单,但在实际应用中效果非常好,这真是验证了大道至简。

其他:

Funk-SVD名字的由来:

Simon Funk在博客上公开发表了一个只考虑已有评分记录的矩阵分解方法,称为Funk-SVD,也就是被Yehuda Koren称为隐语义模型的矩阵分解方法。

 

参考:

1.https://lumingdong.cn/recommendation-algorithm-based-on-matrix-decomposition.html

2.http://freewill.top/2017/03/07/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E7%B3%BB%E5%88%97%EF%BC%8813%EF%BC%89%EF%BC%9A%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%EF%BC%883%EF%BC%89%E2%80%94%E2%80%94%E7%9F%A9%E9%98%B5%E5%88%86%E8%A7%A3%E6%8A%80%E6%9C%AF/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值