关注推荐系统ABC

http://zhan.renren.com/recommendersystem?from=template&checked=true

twiiter big learning with graphs

linux命令

关注推荐系统ABC_第1张图片

vim 快捷键

关注推荐系统ABC_第2张图片
vim 快捷键

推荐系统常用算法和优劣比较(From Yehuda)

There are different approaches to music recommendation,including: 

(1)Expert-based approaches that are based on human annotation of music data such as the Music Genome Project,which is used by the Internet music service Pandora,com

(2)Social-based approaches that characterize items based on textual attributes,cultural information,social tags and other kinds of web-based annotations 

(3)Content-based approaches that analyze the audio content for characterizing tracks and establishing item-to-item similarity

(4)Collaborative Filtering(CF) methods that analyze listening patterns(or other sorts of feedback) by many users,in order to establish similarities across users and items

Each of the above approaches comes with distinct disadvantages.An expert-based approach is etremely time consuming and hard to scale.Social tagging is unlikely to provide a complete characterization of music.Content based approaches,even at their best,miss important relations and distinctions humans make between songs;the reader is referred to the interesting piece by Slaney on the topic. The ability to directly model user desires makes CF among the more accurate and serendipitous approaches to recommendation. In addition CF naturally learns popularity trends by observing actual user behavior,which the orher approaches overlook. However,its availability is severely hindered by the need to have a substantial amount of relevant user behavior on record.The approach described in this paper aims at alleviating this central issue of CF.   

Latent factor models constitute one of the leading CF techniques.They characterize both items and users as vectors in a space automatically inferred from observed data patterns. The latent space representation strives to capture the semantics of items and users,which drive their observed interactions.In music,factors might measure obvious dimensions such as genres,tempo or pitch or less well defined dimensions such as the emotions provoked by the song or the social target audience.One of the most successful realizations of latent factor models is based on matrix factorization(MF).These methods have become very popular in recent years by combining good scalability with predictive accuracy.In addition,MF provides a substantial expressive power that allows modeling specific data characteristics such as temporal effects,item taxonomy and attributes,social relations,and 3-way interactions.  

本文摘自Yehuda大神的最新paper《Build your own music recommender by modeling Internet radio streams》

六度分隔 V.s. 四度分隔

六度分隔理论是一个非常有意思的理论。1967年哈佛大学的心理学教授斯坦利·米尔格拉姆(Stanley Milgram,1933年1984年)根据这概念做过一次连锁信实验,尝试证明平均只需六个人就可以联系任何两个互不相识的美国人,即六度分隔理论(Six Degrees of Separation)。【1】

关注推荐系统ABC_第3张图片

微软亚洲研究院(msra)也做了一个六度搜索的web应用,玩起来蛮有意思的。地址是:http://renlifang.msra.cn/6dumap.aspx

 

去年的时候,米兰大学的一项研究成果表明在全球最大的社交网络facebook中用户之间是4.74度空间。【2】

从上图中我们可以直观地看到这个稳步增长的趋势。如图:纵轴:在分隔空间里的平均用户对;横轴:分隔空间。

前段时间我爬了人人网上我所有的好友以及所有好友的所有好友(一共是两层好友的数据),进行构图。图为带权无向图,每个权重都定为1.然后随机取了一部分用户,计算其中任意两个用户的最短路长。做了几组,平均结果是4.56。(下图是我的一层好友网络)

互联网让这个世界越来越小,让这个世界上的人距离也越来越近了。


【1】六度分隔理论 in wikipedia(地址:http://zh.wikipedia.org/wiki/%E5%85%AD%E5%BA%A6%E5%88%86%E9%9A%94%E7%90%86%E8%AE%BA

【2】Facebook is bringing people closer, users now separated by 4.74 degrees(作者:Jon Russell,地址:http://thenextweb.com/Facebook/2011/11/22/Facebook-is-bring-people-closer-users-now-separated-by-4-74-degrees/

做了个新浪微博app,类似于hot or not

最近生活有点无聊,想起来《社交网络》中Mark做的那个facemash(类似于hot or not),正好最近在用php,SAE和新浪微博API,所以索性综合这三样做个APP,练练手。UI完全没做,就是把功能都实现了。地址是http://guessulove.sinaapp.com/ 如果授权成功不了的话,可以直接访问http://guessulove.sinaapp.com/hot.php

1、数据来源

用微博的public_timeline接口,爬了5000个未知用户的头像数据作为初始数据。如果用户希望自己的头像也能参与到这个比赛中,有一个功能add my avatar ,可以将用户的头像数据添加到数据库中。

2、关于图片

初始的两幅图片是随机生成的,当用户点击其中一个图片时,表示他喜欢这张图,觉得它cute,然后系统会自动更换另外一幅图,依次进行下去。

这里,存在个问题。随机生成的新图片需要考虑公平的因素,以前出现过的图片在以后出现的概率会减小,而之前没有出现的图片以后出现的概率要增大。

3、关于算法

这里用的排名算法是国际象棋用的排名算法。在最开始的时候,给定所有的图片同样的初始分数10000,当有用户开始点击图片的时候,就会用下面的算法进行分数计算:

 

                        $k = 30;//常数

$id1_score = $data[0]['score'];//id1的实力值

$id2_score = $data1[0]['score'];//id2的实力值

$delta = $id2_score - $id1_score;//对手的实力值减去自己的实力值

$ex = 1/(1+pow(10,$delta/400));//期望胜率

$id1_score += $k*($value - $ex);//id1新的实力值 

4、功能

功能十分简单。

(1)单击某张图片,表示这个用户喜欢这个图片。

(2)用户可以实时地看到排名在前十的头像。

(3)用户可以添加自己的头像进入数据库。

(4)用户可以查看自己的排名。

 

pagerank做围脖局部影响力计算example

接着上一篇的文章继续写。看了大家在resys china 和 新浪围脖上的评论,启发蛮多的。首先谢谢大家。

这次的example中,只用了转发这一种信息作为权重的衡量标准。一共采集不到1w的用户量,平均每个用户1k的围脖信息。

类似于google 的pagerank一样,用户A转发用户B的一条围脖,则相当于给用户B投了一票,但每个用户所投票的重要性不同,排名高的用户用户投票更有说服力。

 

通过几次迭代计算,用户的rank 值收敛了。结果如下:

http://expertise.sinaapp.com/pagerank/show.php

对比spear算法(一种参考HITS算法的rank算法,具体见http://somemory.com/myblog/?post=48)的结果如下:

http://expertise.sinaapp.com/show.php

取top10列表如下:

 rank  pagerank  spear
 1    
 2    
 3    
 4    
 5    
 6    
 7    
 8    
 9    
 10    

 

从这个表格里可以看出其实排名前10的结果差异不大,除过采集数据的时间差异,可以认为两种算法效果其实差不多的。

几点思考:

(1)在pagerank算法中由于采集的数据不能覆盖到所有的面,总会出现这种情况:一些不是特别牛的号排名比一些看起来牛的号排名靠前很多。原 因是,大号总会转发一些所谓小号的围脖,尤其是薛蛮子老爷子,转发的面儿很广,涉及的人很多,会造成这些小号在局部范围中有“一定的影响力”,即排名靠前 于一些大号。

(2)上面的问题可以用加入一个新的信息维度“是否关注”来减弱。因为即使大号转发了小号的围脖,但也只是偶然现象,大号们并不会关注这些小号,所以加入“是否关注”可以改变图中的权重,从而缓解(1)中的问题。

(3)由于不可能采集太过量的数据,一方面采集速度一定会远远慢于数据的产生速度,另一方面太过量的数据处理起来会涉及到很多非算法方面的问题。所 以做得这些分析只能算作某个“圈子”里的用户影响力rank,并不能代表太宽泛的范围。当然,我们可以采集一些类似于微群这样的group的数据来做分 析,会得到一些比较有意义的结论。

(4)关于pagerank和spear(类似hits)的对比:

  • pagerank基本原则是只向前看,从一个链接到另一个链接(从一个user到另一个user)
  • spear则要从一个权威(authority)网页向后看,看哪些网页指向了它。

 相关的经典paper(点我下载):

1、topic sensitive pagerank  ,Haveliwala,Stanford

围脖局部影响力计算example

最近看了一篇SIGIR 09年的paper,介绍的是如何区分一个用户是expert还是spammer,其实也就是对用户的expertise进行排名。

文中讲到的算法spear,是基于HITS(Hypertext Induced Topic Search)算法改进的,是SPamming-resistant Expertise Analysis and Ranking的缩写。文中的实验数据是用delicious的数据。算法中做了两个基本的假设是

(1)Mutual reinforcement of user expertise and document quality

专家级的用户更加倾向于产生高质量的document,而高质量的document常常由高水平的用户tag

(2)Discoverers v.s. followers

专家级的用户往往是一个“发现者”,也就是说他们更加倾向于第一个bookmark和tag高质量的document,然后将这些好的document带入到用户社区中。这个好比高水平的学者。

spear算法将会给早期发现新信息的discovers更多的credit,具体多少credit将会由一个credit function 计算得到。

 

这幅图介绍了spear算法的具体实现,首先是根据数据集生成一个带权重邻接矩阵和两个分数向量,邻接矩阵中的元素a(i,j)表示第i个用户在第j个document上的credit score。两个向量分别表示用户的expertise score 和 document的quality score。这里score function 是一个可以自己定义的函数,要保证discovers的分数要高于后面followers的分数,但分数的差距又不能差太多。(具体的参数可以参考后面的文献)

然后通过几百次的迭代计算,就可以得到一个收敛的E和Q,也就对user expertise进行了排名。

由于这篇paper是为了证明他们的算法可行,所以不但用了从delicious.com爬下来的真实数据,并且根据user behavior做了六类仿真用户混在真实数据中,以检验算法的效果。

用在我们这里,计算围脖局部影响力的时候,就不必设置仿真用户了。只需要将同一个圈子里的若干users的围脖信息考虑进来做计算就可以了。在选择种子用户的时候,参考了@clickstone的这个结果(http://weibo.com/1641544424/eB2mq72b8ai)。从这个user列表中爬他们关注的user形成整个user圈子,同时爬下他们发布的围脖信息,(围脖的id和timestamp,这里如果是用户原创的围脖则记录该围脖id和该条围脖发布的timestamp;如果这条围脖是用户转发的,则记录被转发的这条原始围脖的id以及该用户转发这条围脖时的timestamp)这样的话,我拿到的数据格式就是(timestamp,userid,weiboid),这里围脖对应着paper中的webpage。然后用spear算法计算得到了下面的结果:

http://expertise.sinaapp.com/show.php

这里是top50的排名。大家可以对比一下一年前@clickstone的计算结果

http://weibo.com/1641544424/eB2mq72b8ai

 

参考文献(点我下载)

1、Telling Experts from Spammers:Expertise Ranking in Folksonomies

2、SPEAR:Spamming-Resistant Expertise Analysis and Ranking in Collaborative Tagging Systems

一些推荐系统包的推荐

下面是一些开源的推荐系统的包,希望对大家有用。

1、http://lenskit.grouplens.org/

2、http://easyrec.org/

3、http://savannah.nongnu.org/

4、http://glaros.dtc.umn.edu/gkhome/software

5、http://mahout.apache.org/

6、http://www.ismll.uni-hildesheim.de/mymedialite/

7、用php实现的slopeone算法,http://code.google.com/p/openslopeone/

8、用php实现的推荐器,http://sourceforge.net/projects/vogoo/

推荐系统领域大神Yehuda Koren的paper推荐(可下载)

经大牛推荐这位Yahoo Research的大神的论文,我在网上搜了一下,放在附件供大家下载学习交流。

他也是Netflix Prize的冠军队成员,是推荐系统领域的大神级人物。

1、《Matrix Factorization Techniques For Recommender Systems》

2、《Factorization Meets the Neighborhood:a Multifaceted Collaborative Filtering Model》

3、《Adaptive Bootstrapping of Recommender Systems Using Decision Trees》

4、《Yahho!Music Recommendations:Modeling Music Ratings with Temporal Dynamics and Item Taxonomy》

5、《Lessons from the Netflix Prize Chanllenge》

6、《Collaborative Filtering with Temporal Dynamics》

7、《Performance of Recommender Algorithms on Top-N Recommendation Tasks》

8、《Factor in the Beighbors:Scalable and Accurate Collaborative Filtering》

【下载地址】

推荐系统几个算法的movielens结果比较

本文用movielens-100k数据包中的5组数据对一些基本的推荐系统算法做了测试,为了节省测试时间,我用了最小的数据集。当然也做了大一些的数据集,但并没有做全部测试,所以只展示小数据集的结果如下:

 (数据包括:1682 items ,943 users,100,000 ratings)

行表示算法,

列表示数据集,

值表示RMSE。

 

   Latent Factor Model  user-based kNN(Cosine)  user-based kNN(Pearson)   user-based kNN(CorrectCosine)  Slope One 
 data1  0.9263  0.9706  1.3620  0.9645  1.2511
 data2  0.9156  0.9589  1.2766  0.9541  1.2780
 data3  0.9141  0.9539  1.3601  0.9519  1.2402
 data4  0.9173  0.9473  1.5162  0.9484  1.2097
 data5  0.9182  0.9507  1.6093  0.9551  1.2369

 

 关于结果的几点说明:

(1)因为这个数据集中的item比943多将近一倍,所以采用了user-based kNN。item-based kNN和user-based kNN算法对于程序实施起来差不多,基本上将user-item matrix转置成item-user就好了。

(2)用Pearson相关法计算用户之间的相似度,得到的结果很差。其实用Pearson相关法计算相似度,需要满足一些基本条件,比如数据之间必须是线性的,残差相互独立。但对于实际的系统,这些条件往往不能被满足。所以结果会差一些。

(3)Latent Factor Model算法中,有几个比较重要的参数。

 

  • 学习速率:关系到迭代的步长,如果过大的话很有可能在沿着梯度方向寻找局部最优解的时候会跨过最优的那个解;如果非常小的话,迭代次数就会非常多,收敛的比较慢。因此,学习速率的初值可以选的稍微大一些,每次迭代缩小一点点,比如让学习速率=学习速率*0.9。我在计算的时候取了0.005.
  • 特征矩阵维度k:矩阵分解的思路是将rating矩阵分解成两个矩阵,一个user的特征矩阵,一个item的特征矩阵。矩阵的特征维度代表了保留信息的多少。k越大保留原矩阵信息越多,但降维的优点就体现不出来了;k越小,保留的信息越少,预测的结果就会越差。所以k也是一个重要参数。我在计算的时候取了100.
  • 正则化因子:为了避免掉过拟合问题,在损失函数中加了一项正则化项,因此这个正则化因子会很影响最后的结果,选择起来也是个麻烦事情。如果你选的太小,正则化效果很差,过拟合问题就会很突出,即使你在某一组数据中计算的非常理想,那么你在其他的数据中也很有可能不会得到比较理想的结果;如果你选的太大,正则化效果出来了,但是欠拟合问题也随之而来了,计算结果会变得非常差。这里,我选择的是0.004.
  • user特征矩阵和item特征矩阵的初值:迭代计算需要一个初值,矩阵分解是个NP问题,所以我们得不到全局最优解,只能从初值开始,沿着梯度向下走,寻找这组初值对应的局部最优解,但初值的选择会影响到你得到的局部最优解的效果,它可能不太优也可能非常优,anyway,谁又知道呢?所以,用一些随机数作为初值,多计算几次做过平均是个比较好的办法,可以尽量地避免掉进不太优的局部最优解中。这里我用的是0.1*rand(0,1)/sqrt(k),这个参数是从别人那里学来的,效果不错 。还有一种思路是用所有用户已知评分的平均值来分配给初值,不过效果不如这个参数。

(4)从结果可以很清晰地看出,矩阵分解的算法效果最好,其次是用修正的余弦公式做相似度计算的knn算法,然后是余弦公式做相似度计算的knn,然后是slope one,最后是可怜的皮尔逊相关法做相似度计算的knn。这几个算法中,矩阵分解的方法最不好解释,有点半透明箱的意思(相对于神经网络那种黑箱);knn算法最好解释,也最好理解,而且中间的很多结果对于实际的系统都非常有意义,比如,用户的相似度矩阵,用户的k个最近邻,都是非常有意义的结果;slope one是一种item-based类型的算法,效果不是很好,我觉得和item多于user有比较大的关系。

(5)在计算的过程中,矩阵分解的算法计算速度最快,不到40次就可以迭代最优结果,而且速度非常快;其次就是slope one,最慢的是knn,因为要计算庞大的相似度矩阵。

(6)计算之前的数据统计分析非常重要,用slope one的时候,在给每个没有值的item寻找有共同评分的item会时我发现了有的item竟然没有任何一个item和它有共同的评分,导致计算失败。所以计算之前,一定要把数据中的bug数据清除掉。在实际的推荐系统算法中,在计算之前要先把一些比较hot的item拿掉,同时也要把一些数据非常非常少的user拿掉(这些user有可能是僵尸哦!!!)否则的话计算的时候就会出现过拟合的情况甚至出现计算中的bug现象。

 

以上我是个人的一些看法,仅供参考,欢迎批评指正。

再谈矩阵分解在推荐系统的应用

最近研究了下Yehuda大神的paper,学习了下矩阵分解方法在推荐系统中如何用。

本文中提到的矩阵分解是一般的分解,即R=M*N的形式。

1、矩阵分解方法的来源

CF里的矩阵分解思想是来自于IR领域的Latent Semantic Analysis(LSA)。google黑板报的《数学之美》中很清楚地讲了SVD分解在IR中的应用。(http://www.google.com.hk/ggblog/googlechinablog/2006/12/blog-post_8935.html)

2、矩阵分解的优劣

优点是:

 

  • 比较容易编程实现
  • 比较低的时间和空间复杂度
  • 预测的精度比较高
  • 非常好的扩展性

缺点是:推荐的结果不具有很好的可解释性。因为把ratings matrix分解成user-factor matrix和item-factor matrix,这里的factor很难用实际意义的概念来解释。不过,矩阵分解的过程相当于一个软聚类的过程,得到的每一个factor相当于每一个聚类后的分组,只是我们没有一个通用的方法来为这些分组命名。

但是在实际的应用中,我们可以提取这些分组中最突出的特点来给这些factor命名。比如,拿新闻资讯类的推荐系统来说,做好分解之后,每个factor都可以看成是一类资讯,可以从这些资讯中提取一些特征来给这个factor命名。

 

3、矩阵分解的模型(Latent Factor Model)

矩阵分解的思路是把评分矩阵通过分解,用一个低秩的矩阵来逼近原来的评分矩阵,逼近的目标就是让预测的矩阵和原来的矩阵之间的误差平方最小。(矩阵分解一般不用数学上直接分解的办法,尽管分解出来的精度很高,但是效率实在太低!矩阵分解往往会转化为一个优化问题,通过迭代求局部最优解。)

但是有个问题是,原来的评分矩阵的稀疏度太大,分解很容易产生overfitting(过度拟合,意思就是为了迁就一些错误的偏僻的值导致整个模型错误)的问题。所以现在的方法是在目标函数中增加一项regularization(正则化),来避免overfitting问题。

所以一般的矩阵分解的目标函数(或者称为loss function)是:

前一项是预测后的矩阵和现有的评分矩阵的误差,这里计算只针对评分矩阵中已经评分的项。

后一项就是正则化项,用来解决过度拟合的问题。

这个优化问题求解的就是分解之后的user-factor,item-factor矩阵的factor向量。(qi是item的factor向量,pu是user的factor向量)

求解这个优化问题常用两种方法,一种是alternative least squares(交叉最小二乘法),另一种是stochastic gradient descent(随机梯度下降法)。

前一种方法会涉及到矩阵的求逆问题,所以计算起来会比较麻烦。

后一种方法,只需要求梯度,就可以迭代计算了,因此会简单很多。

迭代方程如下:

其中,gamma是学习速率,lamda是正则化系数,是两个可选的参数,而且对于最后的结果非常重要。

这里,gamma的大小不仅会影响到训练时间,还会影响到结果的收敛性。gamma太大的话会导致结果发散,一般都会把gamma取得很小,不同的数据集取得值不同,但大概是0.001这个量级。这样的话训练的时间会长一些,但结果会比较好。

lamda的值一般也比较小,大概取0.01这个量级就好了。

迭代开始前,需要对user和item的特征向量赋初值,这个初值很重要,会严重地影响到计算速度。一般的做法是在所有已评分的平均分附近产生一些随机数作为初值。

迭代结束的条件一般是loss function开始增加了,或者loss function的值小于了某一个阈值。

当我们拿到计算出来的user,item的factor向量后,最后预测结果时有两种选择,一种是保留计算出来的小数rating,一种是将这些小数rating四舍五入并裁减到[1,5]这个区间内。

对于实际的推荐系统来说,结果是小数还是整数,没有所谓,因为我们并不会把预测的分数给用户看,而只是返回一个推荐列表。

但对于线下训练参数或者做论文的童鞋来说,不同的处理方法得到的RMSE或者MAE的值可不相同。

我用这个的算法对movielens 100k的小数据做了测试,用很短的时间就可以计算好,不过那些参数的选择需要不断地用RMSE 来计算得出。在其他的信息都没有利用的情况下,也可以得到0.90这个量级的RMSE。

 

4、增加一些扩展项

上面的模型中只简单的用了已知的评分数据,很多的信息都没有考虑进来。

(1)增加biases信息

因为有的user总是趋向于打一个很高的分,而有的user比较严格,总是打一个很低的分,有的item总是被打一个很高的分,而有的item总是被低估。所以我们需要给模型增加biases项,loss function如下:

迭代方程变成了:

同样的方法,只是多了对bu和bi的赋初值。

同样,我用movielens的100k数据计算,得到的RMSE值也在0.90这个量级,但整体要比没有考虑biases结果好。

(2)增加implicit feedback信息

评分是一个显性的反馈方式,然而在很多时候显性的反馈很少很少,而user的很多行为都可以反映出他们对item的态度,所以利用implicit feedback是非常必要的。给模型增加implicit feedback项,预测模型如下:

迭代方程如下:

implicit feedback信息对于商城来说,可能是购买,浏览等等行为,对于Netflix这样的网站来说,可能是浏览,租赁等等。

 

(3)考虑temporal信息

因为用户的兴趣或者对某一个item的态度是和时间有关的,比如说,可能我今年不太喜欢西服这个东西,因为我用不着,所以我不会购买,但可能若干年后我不得不穿西服的时候,我一定会去买,也就是说我给推荐系统留下我喜欢西服这个东西的印象。(即使我真的不喜欢西服。)

动态地考虑user的兴趣或者需求是非常必要的。

 

矩阵分解是当下非常流行的算法,可以考虑将这种算法和传统的KNN结合在一起来做推荐,相信效果会很不错。

 

以上我是个人的一些看法,仅供参考,欢迎批评指正。

google trends

recommendation system

浅谈矩阵分解在推荐系统中的应用

矩阵分解是最近几年比较火的算法,经过kddcup和netflix比赛的多人多次检验,矩阵分解可以带来更好的结果,而且可以充分地考虑各种因素的影响,有非常好的扩展性,因为要考虑多种因素的综合作用,往往需要构造cost function来将矩阵分解问题转化为优化问题,根据要考虑的因素为优化问题添加constraints,然后通过迭代的方法进行矩阵分解,原来评分矩阵中的missing vlaue可以通过分解后得到的矩阵求的。

本文将简单介绍下最近学习到的矩阵分解方法。

(1)PureSvd

怎么评价这种方法呢?开始觉得这种方法很神奇很数学,而且在实际使用的时候也非常好用。

但最近读了Yehuda大神的paper之后,觉得这种方法比较猥琐。

其实,矩阵分解的核心是将一个非常稀疏的评分矩阵分解为两个矩阵,一个表示user的特性,一个表示item的特性,将两个矩阵中各取一行和一列向量做内积就可以得到对应评分。

那么如何将一个矩阵分解为两个矩阵就是唯一的问题了。

说到这里大家就可能想起了在线代和数值分析中学到的各种矩阵分解方法,QR,Jordan,三角分解,SVD。。。

这里说说svd分解。

svd是将一个任意实矩阵分解为三个矩阵U,S,V,其中,U,V是两个正交矩阵,称为左右奇异矩阵,S是个对角阵,称为奇异值矩阵。

其实svd分解的问题可以化解为特征值分解的问题。

评分矩阵A(m*n)=U(m*k)*S(k*k)*V'(k*n)

令B(m*m)=A(m*n)*A'(n*m)

B矩阵就是一个方阵,可以利用各种简单的方法将B进行特征值分解:

Bv=av,

v是方阵B的特征向量,a是特征向量v对应的特征值。

所以奇异值s=sqrt(a),

左奇异向量u=A*v/s

同样的方法可以求得右奇异向量。

这样我们就得到了svd分解后的三个矩阵。(你可以自己写个c程序计算,当然也可以用matlab算算得到)

分解后的三个矩阵都有着各自的意义,

U:每一行表示一个user的特征。

V:每一列表示一个item的特征。

S:表示对应的user和item的相关性。

所以可以考虑用U和V将S吸收进来,形成两个矩阵分别表示user的矩阵和item的矩阵。

得到这个以后后面的事情就好办了。

为什么说这个方法猥琐呢?

因为我觉得,这种方法有着矩阵分解算法的表,却可以非常简单地完成矩阵的分解,然后填充稀疏的评分矩阵。

但它考虑的因素太少了,不过对于简单的推荐系统,这种方法还是非常有意义的,容易实现,而且结果也不会太差。

(2)Latent Factor Model

这是真正的矩阵分解算法,经过实践检验,具有非常高的准确性和易扩展性。

正如上面提到的,实现推荐系统结果的目标是将那个稀疏的评分矩阵分解成两个矩阵,一个表示user的feature,一个表示item的feature,然后做内积得到预测。

当然要实现满足一定约束条件的矩阵分解,可不像上面的PureSVD那样容易,需要构造一个优化问题,用一些复杂的算法求解优化问题。而这些优化问题往往是NP问题,只有局部最优解。

首先构造一个优化目标函数,

考虑到最后的评价指标是预测分值和实际分值之间的误差的平方(RMSE),所以构造的目标函数也是误差的平方的函数。

为什么这样的算法可以得到更优的结果呢?因为算法可以很容易地扩展很多的feature进来,更加出色地考虑了多种影响推荐效果的实实在在的因素。

 

  • Biases

因为有的用户总是会打出比别人高的分,或者说有的用户他的评价尺度比较宽松;同样有的item总是被打高分。这是一个普遍存在的问题,所以在构造目标函数的时候需要增加几项:所有评分的平均值miu,user的偏见分数bu,item的偏见分数bi。

比如:求用户x对电影y的打分,

所有评分电影的评分的平均分是miu=3.5,

电影y比所有评分电影平均分高bi=0.5

但是用户x是个比较严格的用户,评分总是相对偏低,所以bu=-0.3

所以用户x对电影y的打分为3.7

  • Implicit feedback

用户在使用web应用的时候,会产生大量的行为,充分挖掘这部分的价值,将会很好地提升推荐的效果。

利用用户的隐式反馈,相当于充分的利用了评分矩阵中的missing value的价值,用户在页面的停留时间,检索,浏览,点击等等各种行为都可以建模,内含到目标函数中。

这里,可以将简单地用一个Boolean来描述一种行为有还是没有。

不过在使用的时候,需要进行归一化处理。

  • User-associated attributes

基于用户的社会化属性进行推荐也是一种很基本的推荐,当然也可以考虑到目标函数中。

  • Temporal dynamics

用户的兴趣包括长期和短期,动态地考虑一段时间内用户的兴趣是很有必要的。

上面的几个因素中随着时间变化的有,user的bias项bu=bu(t),item的bias项bi=bi(t),以及user的factor向量pu=pu(t),这里可以忽略item的factor向量的变化,因为item是比较稳定的。

  • Confidence level

因为在处理上述的因素的时候,很多都是比较主观的,所以需要给每个因素添加一个置信权重,以平衡整个结果。

 

通过构造出这个目标函数,然后添加相应的约束条件,接下来的问题就是求解这个优化问题。

通常比较好的方法是Stochastic gradient desent。

 

PS:这种方法是现在学术界的主流方法,大家可以参阅Yehuda的神作(http://research.yahoo.com/Yehuda_Koren)以及上海交大在今年kddcup获奖方法的paper以及他们的开源系统(http://apex.sjtu.edu.cn/apex_wiki/svdfeature)

 

(3)NMF(非负矩阵分解)

很多人用这种方法是因为他们觉得只有一个非负的值对于实际的例子才会有意义。

考虑到svd或者latent factor model会得到负的值,所以这种方法的物理意义比较明确。

同样的道理,NMF也是将评分矩阵的转置矩阵分解成两个矩阵。

不同的是这两个矩阵有着和上面的矩阵不同的物理意义。

其中一个是基矩阵W,另一个是投影矩阵H,即R'(n*m)=W(n*r)*H(r*m)

W:每一列包含一个基向量,这组基向量构成一个r维的空间。

H:每一列则近似为原始数据对应的列向量在该r维空间的投影。

做这个分解的方法也是构造一个目标函数和一些约束条件,然后用梯度下降的算法来计算得到一个局部最优解。

这种方法的思路大概是这样的:

 

  • 将评分矩阵转置然后分解成两个矩阵W和H。
  • 根据基矩阵W,可以计算得到目标用户评分向量a对基矩阵W的投影向量h。
  • 计算投影向量h与投影矩阵H各行之间的欧式距离,将其中距离最小的前k个用户组成目标用户a的最近邻集合。
  • 然后用皮尔逊相关法将最近邻集合中的数据进行加权计算,然后排序进行推荐。

可以看出来,这种方法的思路和上面的两种还是很不相同的,主要还是在计算目标用户的最近邻集合,主要思想还是knn,只是在中间用了矩阵分解的方法降维降低了计算的时间复杂度。

 

矩阵分解在学习的时候感觉既没用又麻烦,尤其是线代里面做矩阵的分解计算,无聊的很。

现在看来,矩阵分解非常有意义。

 

以上我是个人的一些看法,仅供参考,欢迎批评指正。

Recommender System

关注推荐系统ABC_第4张图片
Google Trend: “Recommender”
关注推荐系统ABC_第5张图片
Google Trend: “推荐系统”

 大家好,欢迎来到我的小站! 


你可能感兴趣的:(关注推荐系统ABC)