http://ling0322.info/2013/05/07/recommander-system.html

这个学期Web智能与社会计算的大作业就是完成一个推荐系统参加百度电影推荐算法大赛,成绩按照评测数据给分。老师介绍了N种方法包括基于内容的、以及协同过滤等等,不过他强烈建议使用矩阵奇异值分解的办法来做。也正因为是这个原因,我们一共8组其中6组的模型都是SVD。

这个比赛就是提供给你用户对电影的评分、电影的TAG、用户的社会关系(好友)、用户的观看纪录信息。其中用户对电影的评分满分是5分,大约8k用户、1w电影,然后根据以上的信息预测用户对某些电影的评分。然后评测结果就是跟用户实际评分的RMSE值。

SVD就是一种主成分分析以及降维的方法,大体思路就是一个对称矩阵A可以分解成对角形

A=PTΛP

其中Λ为对角阵,它对角线上的元素就是矩阵A的特征值。特征值对应的特征向量是互相正交的,这个也就是对称矩阵的性质。在这些特征值中大的特征值以及它对应的特征向量对于整个结果(就是乘出来的A)来说比较重要,相比之下比较小的特征特征值对应的特征向量对于结果的影响就比较小,因此将这些小的特征值以及其对应的特征向量去掉,产生结果A′来说,A′仍旧是非常接近于A。这些被去掉的东西可以认为是A中的噪音。因此A′可以写作

A′=UTΛV

但是现实生活中很少有矩阵是对称的,比如上面的用户-电影矩阵。因此就诞生了奇异值分解的方法

A=UTΔV

其中ΔΛ一样是一个对角阵,但是对角线上的元素就不是特征值了而是矩阵A的奇异值(至于为什么叫奇异值我也不知道,这个很奇异吗?)。A的奇异值就等于AAT的特征值的根号。然后经过各种复杂的运算这个分解就完成了。奇异值分解的用途很广,主要是用作降维以及主成分分析。在自然语言中LSA主题模型就是基于奇异值分解,另外计算词与词之间的关系也要用到SVD。

使用SVD做推荐系统也可以看成是主成分分析的过程(此外还有另外一种解释就是将用户和电影投影到同一个向量空间中1),找到用户-电影矩阵中最大的r个奇异值,进行分解构成r行的矩阵U(代表用户)和r列的矩阵V(代表电影),这个就是各个用户对电影打分的主要的影响因素,依据这个就可以对于用户的打分进行预测。

但是这里情况很特殊,用户-电影矩阵十分稀疏,大约只有1%左右的项是有值的,对于这些项全部用0来填这个明显就是表示用户对这些电影打0分,这个是不合逻辑的,用平均值或者随机值填充效果也肯定不好。因此目前使用它的一种近似形式,对于用户-电影矩阵Am×n,找到矩阵Qr×mTr×n使得QTT尽量相似于A。这个可以转化成,对于每个评分rui找到 qu∈Q,ti∈T 使得

∑u,i(rui−qTipu)+λ(∥qi∥2+∥pu∥2)

最小,其中后半部分是防止过拟合而加入的因子。这个很明显可以使用随机梯度下降算法进行求解(关于随机梯度下降算法可以参考斯坦福机器学习第二课)

eui=defrui−qTipu

qi←qi+γ(eui⋅pu−λ⋅qi)
pu←pu+γ(eui⋅qi−λ⋅pu)

其中γ就是迭代的步长,我们使用Go语言实现了以上的迭代过程,以下是一些实验的结果数据

  1. γ=0.001, λ=0.01, iter=100, r=20, RMSE=0.6483
  2. γ=0.001, λ=0.01, iter=1000, r=20, RMSE=0.6618
  3. γ=0.001, λ=0.05, iter=1000, r=20, RMSE=0.6298
  4. γ=0.001, λ=0.1, iter=1000, r=20, RMSE=0.6534
  5. γ=0.001, λ=0.05, iter=1000, r=50, RMSE=0.6298

其中iter表示迭代次数、λ是防过拟合因子的系数、RMSE是在百度平台上跑的结果(越小越好)。其中比较1和2可以很明显的发现λ在取0.01的时候还是出现了过拟合现象,因此在λ=0.05的情况下是所有实验数据中最好的。r是因子的个数,这里对结果影响不大。

γ的取值也非常重要,因为在梯度下降中γ过小会收敛很慢,γ过大会错过最佳的点。其实最好的解决方法就是使得γ的值随着变化率动态改变,本来在代码中实现了这个功能的,但是因为实现之后发现程序太慢了,所以就去掉了。

最后在课程结束Presentation的时候,老师告诉我们其实好的推荐系统应该将TAG、用户社交关系等信息都加进去,这样的数据的结果才能够有大幅度的提升(因为我们都是用SVD做,结果大同小异)。此外,同学将均值以及用户的偏移加进去之后最好的结果是0.625左右(详细情况可以看推荐系统相关算法(1):SVD这篇文章)。

另外推荐一篇论文Matrix Factorization Techniques for Recommender Systems

使用矩阵分解(SVD)实现推荐系统的更多相关文章

  1. 多维数组分解----SVD在推荐系统中的应用-

    http://www.janscon.com/multiarray/rs_used_svd.html [声明]本文主要参考自论文<A SINGULAR VALUE DECOMPOSITION A ...

  2. SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

    1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:

  3. 矩阵的SVD分解

    转自 http://blog.csdn.net/zhongkejingwang/article/details/43053513(实在受不了CSDN的广告) 在网上看到有很多文章介绍SVD的,讲的也都 ...

  4. 推荐系统之矩阵分解及C++实现

    1.引言 矩阵分解(Matrix Factorization, MF)是传统推荐系统最为经典的算法,思想来源于数学中的奇异值分解(SVD), 但是与SVD 还是有些不同,形式就可以看出SVD将原始的评 ...

  5. Matrix Factorization SVD 矩阵分解

    Today we have learned the Matrix Factorization, and I want to record my study notes. Some kownledge ...

  6. 【RS】Matrix Factorization Techniques for Recommender Systems - 推荐系统的矩阵分解技术

    [论文标题]Matrix Factorization Techniques for Recommender Systems(2009,Published by the IEEE Computer So ...

  7. 推荐系统之矩阵分解及其Python代码实现

    有如下R(5,4)的打分矩阵:(“-”表示用户没有打分) 其中打分矩阵R(n,m)是n行和m列,n表示user个数,m行表示item个数 那么,如何根据目前的矩阵R(5,4)如何对未打分的商品进行评分 ...

  8. 推荐系统实践 0x0b 矩阵分解

    前言 推荐系统实践那本书基本上就更新到上一篇了,之后的内容会把各个算法拿来当专题进行讲解.在这一篇,我们将会介绍矩阵分解这一方法.一般来说,协同过滤算法(基于用户.基于物品)会有一个比较严重的问题,那 ...

  9. 矩阵分解(Matrix Factorization)与推荐系统

    转自:http://www.tuicool.com/articles/RV3m6n 对于矩阵分解的梯度下降推导参考如下:

随机推荐

  1. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A. Neverending competitions 水题

    A. Neverending competitions 题目连接: http://codeforces.com/contest/765/problem/A Description There are ...

  2. Codeforces Round #272 (Div. 2) E. Dreamoon and Strings 动态规划

    E. Dreamoon and Strings 题目连接: http://www.codeforces.com/contest/476/problem/E Description Dreamoon h ...

  3. JavaScript学习方法

    首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...

  4. 使用 IntraWeb (19) - 基本控件之 TIWTreeView

    这是个饱受非议的控件; 我通过尝试, 理解了非议, 也能理解作者. 总之向作者的思路靠拢吧, 还是不错的. TIWTreeView 所在单元及继承链: IWCompTreeview.TIWTreeVi ...

  5. 使用 IntraWeb (1) - 先测试如何部署为 Asp.Net 的应用

    IntraWeb 14 可以部署为 Asp.Net 的应用程序, 需要 NET Framework 4.5 和 ASP.NET MVC 4 或之上版本的支持; 这下, 只能用虚拟主机的朋友有福了! 我 ...

  6. Linux进程管理工具 Supervisord 的安装 及 入门教程

    Supervisor是一个进程管理工具,官方的说法: 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了 ...

  7. MySQL是如何利用索引的

    http://fordba.com/spend-10-min-to-understand-how-mysql-use-index.html

  8. kcon 黑客大会 github

    https://github.com/knownsec/KCon https://paper.seebug.org/107/ CISP认证 https://habo.qq.com/ https://g ...

  9. ASP.NET Web API接受AngualrJS的QueryString的两种方式

    ASP.NET Web API如何接受来自AngualrJS的QueryString呢?本篇体验两种方式. 第一种方式:http://localhost:49705/api/products?sear ...

  10. Visual Studio断点调试, 无法监视变量, 提示无法计算表达式

    在使用Visual Studio 2012进行断点调试时,对某个变量添加监视,出现"无法计算表达式"的提示. 解决办法:依次点击菜单栏中的"调试"→" ...