svd 理解

来源:互联网 发布:众筹平台源码 编辑:程序博客网 时间:2024/05/17 07:30

 

看了不少论文,总结起来用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-%E7%9F%A9%E9%98%B5%E5%88%86%E8%A7%A3-%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95-kobeshow

 

 


本文作者:linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/45250831

0 0
原创粉丝点击