[转]矩阵分解在推荐系统中的应用
矩阵分解是最近几年比较火的算法,经过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
- Implicit feedback
- User-associated attributes
- Temporal dynamics
- Confidence level
(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的最近邻集合。
- 然后用皮尔逊相关法将最近邻集合中的数据进行加权计算,然后排序进行推荐。
最近研究了下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、矩阵分解的优劣
优点是:
- 比较容易编程实现
- 比较低的时间和空间复杂度
- 预测的精度比较高
- 非常好的扩展性
转载于:https://www.cnblogs.com/wn19910213/p/3614658.html
[转]矩阵分解在推荐系统中的应用相关推荐
- 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...
自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...
- 再谈矩阵分解在推荐系统中的应用
本文将简单介绍下最近学习到的矩阵分解方法. (1)PureSvd 矩阵分解的核心是将一个非常稀疏的评分矩阵分解为两个矩阵,一个表示user的特性,一个表示item的特性,将两个矩阵中各取一行和一列向量 ...
- 浅谈矩阵分解在推荐系统中的应用
为了方便介绍,假设推荐系统中有用户集合有6个用户,即U={u1,u2,u3,u4,u5,u6},项目(物品)集合有7个项目,即V={v1,v2,v3,v4,v5,v6,v7},用户对项目的评分结合为R ...
- 【机器学习的数学基础】(七)矩阵分解(Matrix Decomposition)(中)
文章目录 4 矩阵分解(Matrix Decomposition)(中) 4.3 Cholesky分解 4.4 特征分解与对角化 4.5 奇异值分解 4.5.1 几何图解SVD 4.5.2 SVD的构 ...
- 矩阵奇异值分解特征值分解_推荐系统中的奇异值分解与矩阵分解
矩阵奇异值分解特征值分解 Recently, after watching the Recommender Systems class of Prof. Andrew Ng's Machine Lea ...
- 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统
本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷) 论文标题:Matrix factorization techniques for recommend ...
- 矩阵分解java_推荐系统基础:使用PyTorch进行矩阵分解进行动漫的推荐
我们一天会遇到很多次推荐--当我们决定在Netflix/Youtube上看什么,购物网站上的商品推荐,Spotify上的歌曲推荐,Instagram上的朋友推荐,LinkedIn上的工作推荐--列表还 ...
- 矩阵分解 java_使用矩阵分解为推荐系统
矩阵分解假设"潜在因素",例如对用户的意大利食物的偏好和项目食物的意外性与矩阵中的评级有关 . 因此,整个问题类型转变为矩阵重构问题,存在许多不同的解决方案 . 一个简单的,可能很 ...
- 基于矩阵分解的推荐系统
基于矩阵分解的推荐算法 1.概述 基于用户和基于项的协同过滤推荐算法,难以实现大数据量下的实时推荐.这时我们可以使用基于模型的协同过滤算法,矩阵分解(Matrix Factorization,M ...
最新文章
- Markdown here 离线下载安装
- 拥抱Node.js 8.0,N-API入门极简例子
- 如何在Java中检查字符串是否为数字
- HTML游戏黑屏,网页游戏黑屏:游戏进不去解决方案
- Android代码片段:验证数据
- pat 乙级 1026 程序运行时间(C++)
- 第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?
- RX异常点检测算法(马氏距离)
- git出现红字说明什么_怀孕的第一个月会出现什么变化?若有7种表现,说明可能怀上了...
- 使用sp_cycle_errorlog 命令清除sqlserver数据库错误日志
- 解决Mysql数据量大的时候 分页优化(使用limit)的问题
- 微信小程序实现浮动按钮
- 搭建Hadoop集群
- linux中id命令的功能,linux中的id命令
- visio中公式太小_冲压模具设计:冲床吨位计算公式、实例分析,设计师值得一看...
- Java反编译工具XJad使用注意事项
- c 语言百度翻译软件,百度翻译api 实现简易微信翻译小程序
- JetBrain全家桶介绍
- java实现轮播图片_Banner框架实现图片轮播
- 手机上怎么打开md格式的文件_IPHONE手机转为安卓手机,iCloud上的日历迁移方法...
热门文章
- PL/SQL Developer如何连接64位的Oracle图解
- [机器学习]正则化方法 -- Regularization
- Struts2和Struts1.x的全面比较
- 在置信区间下置信值的计算_使用自举计算置信区间
- 我从未看过荒原写作背景_您从未听说过的最佳数据科学认证
- profiler分析器——R语言
- C语言高级编程:结构体中定义数组的“妙用”
- 全民熬夜的时代,如何做到早睡?
- 一场虚拟的鄂尔多斯婚礼 (图)
- java 格式化 布尔型_Java基础篇(1)-格式化