看了不少论文,总结起来用SVD做推荐主要有两种不同的方式。
1 本质上是memory-based,只不过先用SVD对user-item的评分矩阵做降维,得到降维后的user特征和item特征,可以分别做userbased的协同过滤和itembased的协同过滤。
2 本质上是model-based,跟传统数学意义的SVD没有太大关系,只不过借鉴了SVD分解R=U*S*V这个形式,通过最优化方法进行模型拟合,求得R=U*V。
可以参考的论文:
《Applying SVD on Generalized Item-based Filtering 》
《Application of Dimensionality Reduction in Recommender System -- ACase Study》
memory-based的userbased和itembased关键点之一,是user相似度和item相似度的计算。
而相似度的计算依赖于特征。
最原始的做法,一个user的特征就是她对所有item的打分,而一个item的特征就是所有user对她的打分。
在数学意义上,SVD是这样子的,一个M*N矩阵的R可以分解成为三个矩阵相乘的形式,
R=U*S*V
(U是M*M矩阵,S是M*N的对角矩阵,V是N*N的矩阵)。
这是严格相等的。
S的对角元素称之为奇异值。
如果我们减少奇异值的数量,可以得到一个逼近相等的分解。
R约等于U*S*V
(U是M*k矩阵,S是k*k的对角矩阵,V是k*N的矩阵)
于是我们可以拿这个维度减少的U作为user特征,
V作为item特征。
然后拿这些降维后的特征去计算相似度。
然后又有人发现,我们上面的R其实是用0来填补那些未知评分的,感觉这样不太好。因为未知评分可能是高分,可能是低分。直接用0来填补就表示低分了。然后提出了一种填补缺失评分的方法,使得更加合理一些。先用该item的平均打分作为所有没有对item打分user的评分,得到一个填充矩阵,然后对于每个user,该user的对所有item的打分减去该user已知打分的平均值。得到这个矩阵后,再做SVD分解,再利用新特征做相似度计算。
最后再用userbased或者itembased预测评分。
参考资料:
Applying SVD on Generalized Item-basedFiltering
http://www.tmrfindia.org/ijcsa/v3i34.pdf
Application of Dimensionality Reduction inRecommender System -- A Case Study
http://ai.stanford.edu/~ronnyk/WEBKDD2000/papers/sarwar.pdf
A Singular Value Decomposition Approach ForRecommendation Systems
http://blog.csdn.net/yuzhongchun/article/details/40779371
SVD 笔记
http://my.oschina.net/zenglingfan/blog/178906
本文作者:linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/45250805
SVD推荐算法(二)
这次讲解的是model-based的SVD推荐算法。
跟ALS推荐算法一样,都是矩阵分解的推荐算法,只不过求解的方式不同而已。
假如评分矩阵是R,那么我们希望拟合这样一个模型
R=U*M
其中U是user特征,M是item特征。
假如一个user的特征是u,一个item的特征是i,那么这个user对这个item的评分就是
u*i(两个特征的内积)。
损失函数是:
然后我们的目标就是最小化这个E了。
这是SVD矩阵分解预测评分最基本的一种方法。
基于这个思想,各种最优化的方式和损失函数的改造也随之提出来了,来优化这个算法。
最小化损失函数,我们可以用Batch Gradient Descent,Stochastic Gradient Descent等。
损失函数,我们可以加上正则项防止过拟合。
矩阵分解模型上,我们可以加上user评分偏差和item评分偏差。
我用了论文《A Guide to Singular Value Decomposition for Collaborative Filtering
》的一种方法,实现了一个单机版的SVD矩阵分解预测评分。
https://github.com/linger2012/svd-for-recommendation-implemented-by-java
用到的损失函数是
求解用SGD,对于每个已知user-item的评分,都更新一次模型。
1000次遍历训练集,对于测试集的rmse能达到0.96,还是不错的。
用到的数据集是movielens的一个。
代码和数据集都可以在上面我提供的github地址下载到。
参考资料:
A Guide to Singular Value Decomposition forCollaborative Filtering
http://www.csie.ntu.edu.tw/~r95007/thesis/svdnetflix/report/report.pdf
Collaborative Filtering for Netflix
https://classes.soe.ucsc.edu/cmps242/Fall09/proj/mpercy_svd_paper.pdf
在MovieLens数据集上用SVD进行评分预测
http://blog.csdn.net/daer520/article/details/19929523
基于矩阵分解的推荐算法,简单入门 - kobeshow
http://itindex.net/detail/48960-矩阵分解-推荐算法-kobeshow
本文作者:linger 本文链接:http://blog.csdn.net/lingerlanlan/article/details/45250831