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

  

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

  (1)PureSvd

  矩阵分解的核心是将一个非常稀疏的评分矩阵分解为两个矩阵,一个表示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,只是在中间用了矩阵分解的方法降维降低了计算的时间复杂度。

 

  CF里的矩阵分解思想是来自于IR领域的Latent Semantic Analysis(LSA)。不过
,矩阵分解的过程相当于一个软聚类的过程,得到的每一个factor相当于每一个

聚类后的分组,只是我们没有一个通用的方法来为这些分组命名。

  矩阵分解的思路是把评分矩阵通过分解,用一个低秩的矩阵来逼近原来的评分矩

阵,逼近的目标就是让预测的矩阵和原来的矩阵之间的误差平方最小。(矩阵分

解一般不用数学上直接分解的办法,尽管分解出来的精度很高,但是效率实在太

低!矩阵分解往往会转化为一个优化问题,通过迭代求局部最优解。)
  但是有个问题是,原来的评分矩阵的稀疏度太大,分解很容易产生overfitting

(过度拟合,意思就是为了迁就一些错误的偏僻的值导致整个模型错误)的问题

。所以现在的方法是在目标函数中增加一项regularization(正则化),来避免

overfitting问题。

  其中,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的值可不相同。

  http://sina2sohu.diandian.com/post/2012-08-17/40035658104

时间: 2024-10-25 10:55:37

再谈矩阵分解在推荐系统中的应用的相关文章

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

推荐系统是当下越来越热的一个研究问题,无论在学术界还是在工业界都有很多优秀的人才参与其中.近几年举办的推荐系统比赛更是一次又一次地把推荐系统的研究推向了高潮,比如几年前的Neflix百万大奖赛,KDD CUP 2011的音乐推荐比赛,去年的百度电影推荐竞赛,还有最近的阿里巴巴大数据竞赛.这些比赛对推荐系统的发展都起到了很大的推动作用,使我们有机会接触到真实的工业界数据.我们利用这些数据可以更好地学习掌握推荐系统,这些数据网上很多,大家可以到网上下载. 推荐系统在工业领域中取得了巨大的成功,尤其是

[译]再谈如何安全地在 Android 中存储令牌

本文讲的是[译]再谈如何安全地在 Android 中存储令牌, 原文地址:A follow-up on how to store tokens securely in Android 原文作者:Enrique López Mañas 译文出自:掘金翻译计划 译者: lovexiaov 校对者:luoqiuyu hackerkevin 作为本文的序言,我想对读者做一个简短的声明.下面的引言对本文的后续内容而言十分重要. 没有绝对的安全.所谓的安全是指利用一系列措施的堆积和组合,来试图延缓必然发生的

再谈Finalizer对象--大型App中内存与性能的隐性杀手

    在上一篇<提升Android下内存的使用意识和排查能力>的文章中,多次提到了Finalizer对象.也可以看到该对象的清理至少是需要两次GC才能完成,而在Android5.0,尤其是6.0以后的系统中,对于该对象的回收变得更加的慢.我们在开发的时候往往关注内存的分配.泄漏,却容易忽视Finalizer对象,其实在大型App中,该对象是引起内存和性能问题的一个不可忽视的元凶.在类似于双十一会场的界面中,在使用一段时间后,设备会变得越来越慢,内存使用量也不断攀升,甚至容易引发OOM,这个有

推荐系统-基于矩阵分解的LFM模型

这里我想给大家介绍另外一种推荐系统,这种算法叫做潜在因子(Latent Factor)算法.这种算法是在NetFlix(没错,就是用大数据捧火<纸牌屋>的那家公司)的推荐算法竞赛中获奖的算法,最早被应用于电影推荐中.这种算法在实际应用中比现在排名第一的 @邰原朗 所介绍的算法误差(RMSE)会小不少,效率更高.我下面仅利用基础的矩阵知识来介绍下这种算法. 这种算法的思想是这样:每个用户(user)都有自己的偏好,比如A喜欢带有小清新的.吉他伴奏的.王菲等元素(latent factor),如果

用户交互设计:再谈人机交互中的设计隐喻

文章描述:再谈人机交互中的设计隐喻. 上篇文章<人机交互中的设计隐喻-由Mac的文件替换引出来的话题>发出来以后收到了各种各样的反馈,我索性再写一篇续文,算是集中答复吧. 用户习惯 在所有的反馈中,"用户觉得Windows的做法更好用,所以理应这样设计"的说法可谓最多.那么我们就来看一下,为什么有人会觉得Windows的做法更"好用". 我们来看两个例子. 银行里面用的系统-就是柜台后面业务人员用的那个-基本上还是字符界面,没有漂亮的图标和窗口,甚至可能

再谈Javascript中的基本类型和引用类型(推荐)_javascript技巧

一.基本类型和引用类型概述 js中数据类型的值包括:基本类型值和引用类型值 基本数据类型:undefined;null;boolean;number;string 引用类型值:保存在内存中,js不允许直接访问内存位置,因此时操作引用而不是实际对象 二.如何检测数据类型 1.基本数据类型的检测:使用typeof var s = "AAA"; alert(typeof s); //返回string 2.引用类型(对象类型)检测:使用instanceof alert(person insta

[译] 再谈 CSS 中的代码味道

本文讲的是[译] 再谈 CSS 中的代码味道, 原文地址:Code Smells in CSS Revisited 原文作者:Harry 译文出自:掘金翻译计划 译者:IridescentMia 校对者:rccoder, Germxu 再谈 CSS 中的代码味道 回到 2012 年,我写了一篇关于潜在 CSS 反模式的文章 CSS中的代码味道.回看那篇文章,尽管四年过去了,我依然认同里面的全部内容,但是我有一些新的东西加到列表中.再次说明,这些内容并不一定总是坏的东西,因此把它们称为代码味道:在

自然语言处理技术(NLP)在推荐系统中的应用

个性化推荐是大数据时代不可或缺的技术,在电商.信息分发.计算广告.互联网金融等领域都起着重要的作用.具体来讲,个性化推荐在流量高效利用.信息高效分发.提升用户体验.长尾物品挖掘等方面均起着核心作用.在推荐系统中经常需要处理各种文本类数据,例如商品描述.新闻资讯.用户留言等等.具体来讲,我们需要使用文本数据完成以下任务: 候选商品召回.候选商品召回是推荐流程的第一步,用来生成待推荐的物品集合.这部分的核心操作是根据各种不同的推荐算法来获取到对应的物品集合.而文本类数据就是很重要的一类召回算法,具有

跟我一起数据挖掘(13)——矩阵分解

矩阵分解 (decomposition, factorization)是将矩阵拆解为数个矩阵的乘积,可分为三角分解.满秩分解.QR分解.Jordan分解和SVD(奇异值)分解等,常见的有三种:1)三角分解法 (Triangular Factorization),2)QR 分解法 (QR Factorization),3)奇异值分解法 (Singular Value Decompostion). 三角分解法 三角分解法是将原正方 (square) 矩阵分解成一个上三角形矩阵 或是排列(permut