矩阵分解在协同过滤推荐算法中的应用和理解
原文链接 原Po写的很好,大致描述一下。
矩阵分解要解决的问题
协同过滤所要达到的目的是将整个user-item矩阵中空白的位置来预测出值,矩阵分解可以满足这一要求,将原矩阵分解成两个或者三个子矩阵,然后再相乘得到一个新的矩阵,这个新的矩阵就是最终 要预测的矩阵(个人理解)
SVD矩阵分解
SVD分解要求矩阵是稠密的,而在user-item矩阵中往往比较稀疏,所以不太适用
FunkSVD
FunkSVD是在传统SVD面临计算效率问题时提出来的,既然将一个矩阵做SVD分解成3个矩阵很耗时,同时还面临稀疏的问题,那么我们能不能避开稀疏问题,同时只分解成两个矩阵呢?也就是说,现在期望我们的矩阵M这样进行分解:
Mm×n=PTm×k * Qk×n
我们知道SVD分解已经很成熟了,但是FunkSVD如何将矩阵M分解为P和Q呢?这里采用了线性回归的思想。我们的目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的P和Q。
对于某一个用户评分mij,如果用FunkSVD进行矩阵分解,则对应的表示为qTjpi,采用均方差做为损失函数,则我们期望(mij−qTjpi)2尽可能的小,如果考虑所有的物品和样本的组合,则我们期望最小化下式:
∑i,j(mij−qTjpi)2
只要我们能够最小化上面的式子,并求出极值所对应的pi,qj,则我们最终可以得到矩阵P和Q,那么对于任意矩阵M任意一个空白评分的位置,我们可以通过qTjpi计算预测评分。很漂亮的方法! 接下来就求偏导,求出两个向量。
SVD++用于推荐算法
SVD++进一步做了增强,这里它增加考虑用户的隐式反馈。一个用户对物品的评分=显示打分+隐式反馈。