矩阵分解SVD在推荐系统中的应用
参考自:http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/
其实说参考也不准确,准确地说应该是半翻译半学习笔记。
仔细整理一遍,感觉还是收获很大的。
线性代数相关知识:
任意一个M*N
的矩阵A(M行*N列
,M>N
),可以被写成三个矩阵的乘积:
1. U:(M行M列的列正交矩阵)
2. S:(M*N
的对角线矩阵,矩阵元素非负)
3. V:(N*N
的正交矩阵的倒置)
即 A=U*S*V'
(注意矩阵V需要倒置)
直观地说:
假设我们有一个矩阵,该矩阵每一列代表一个user,每一行代表一个item。
如上图,ben,tom....代表user,season n代表item。
矩阵值代表评分(0代表未评分):
如 ben对season1评分为5,tom对season1 评分为5,tom对season2未评分。
机器学习和信息检索:
机器学习的一个最根本也是最有趣的特性是数据压缩概念的相关性。
如果我们能够从数据中抽取某些有意义的感念,则我们能用更少的比特位来表述这个数据。
从信息论的角度则是数据之间存在相关性,则有可压缩性。
SVD就是用来将一个大的矩阵以降低维数的方式进行有损地压缩。
降维:
下面我们将用一个具体的例子展示svd的具体过程。
首先是A矩阵。
A =5 5 0 55 0 3 43 4 0 30 0 5 35 4 4 55 4 5 5
(代表上图的评分矩阵)
使用matlab调用svd函数:
[U,S,Vtranspose]=svd(A)U =-0.4472 -0.5373 -0.0064 -0.5037 -0.3857 -0.3298-0.3586 0.2461 0.8622 -0.1458 0.0780 0.2002-0.2925 -0.4033 -0.2275 -0.1038 0.4360 0.7065-0.2078 0.6700 -0.3951 -0.5888 0.0260 0.0667-0.5099 0.0597 -0.1097 0.2869 0.5946 -0.5371-0.5316 0.1887 -0.1914 0.5341 -0.5485 0.2429S =17.7139 0 0 00 6.3917 0 00 0 3.0980 00 0 0 1.32900 0 0 00 0 0 0Vtranspose =-0.5710 -0.2228 0.6749 0.4109-0.4275 -0.5172 -0.6929 0.2637-0.3846 0.8246 -0.2532 0.3286-0.5859 0.0532 0.0140 -0.8085
分解矩阵之后我们首先需要明白S的意义。
可以看到S很特别,是个对角线矩阵。
每个元素非负,而且依次减小,具体要讲明白元素值的意思大概和线性代数的特征向量,特征值有关。
但是可以大致理解如下:
在线性空间里,每个向量代表一个方向。
所以特征值是代表该矩阵向着该特征值对应的特征向量的方向的变化权重。
所以可以取S对角线上前k个元素。
当k=2时候即将S(6*4)
降维成S(2*2)
,
同时U(6*6)
,Vtranspose(4*4)
相应地变为 U(6*2)
,Vtranspose(4*2)
.
如下图(图片里的usv矩阵元素值和我自己matlab算出的usv矩阵元素值有些正负不一致,但是本质是相同的):
此时我们用降维后的U,S,V来相乘得到A2
A2=U(1:6,1:2)*S(1:2,1:2)*(V(1:4,1:2))' //matlab语句
A2 =5.2885 5.1627 0.2149 4.45913.2768 1.9021 3.7400 3.80583.5324 3.5479 -0.1332 2.89841.1475 -0.6417 4.9472 2.38465.0727 3.6640 3.7887 5.31305.1086 3.4019 4.6166 5.5822
此时我们可以很直观地看出,A2和A很接近,这就是之前说的降维可以看成一种数据的有损压缩。
接下来我们开始分析该矩阵中数据的相关性。
我们将u的第一列当成x值,第二列当成y值。即u的每一行用一个二维向量表示,同理v的每一行也用一个二维向量表示。
如下图:
从图中可以看出:
Season5,Season6特别靠近。Ben和Fred也特别靠近。
同时我们仔细看一下A矩阵可以发现,A矩阵的第5行向量和第6行向量特别相似,Ben所在的列向量和Fred所在的列向量也特别相似。
所以从直观上我们发现U矩阵和V矩阵可以近似来代表A矩阵,换据话说就是将A矩阵压缩成U矩阵和V矩阵,至于压缩比例得看当时对S矩阵取前k个数的k值是多少。
到这里,我们已经完成了一半。
寻找相似用户:
依然用实例来说明:
我们假设,现在有个名字叫Bob的新用户,并且已知这个用户对season n的评分向量为:[5 5 0 0 0 5]。(此向量为列向量)
我们的任务是要对他做出个性化的推荐。
我们的思路首先是利用新用户的评分向量找出该用户的相似用户。
如上图(图中第二行式子有错误,Bob的转置应为行向量)。
对图中公式不做证明,只需要知道结论,结论是得到一个Bob的二维向量,即知道Bob的坐标。
将Bob坐标添加进原来的图中:
然后从图中找出和Bob最相似的用户。
注意,最相似并不是距离最近的用户,这里的相似用余弦相似度计算。(关于相似度还有很多种计算方法,各有优缺点)
即夹角与Bob最小的用户坐标。
可以计算出最相似的用户是ben。
接下来的推荐策略就完全取决于个人选择了。
这里介绍一个非常简单的推荐策略:
找出最相似的用户,即ben。
观察ben的评分向量为:【5 5 3 0 5 5】。
对比Bob的评分向量:【5 5 0 0 0 5】。
然后找出ben评分过而Bob未评分的item并排序,即【season 5:5,season 3:3】。
即推荐给Bob的item依次为 season5 和 season3。
最后还有一些关于整个推荐思路的可改进的地方:
1.
svd本身就是时间复杂度高的计算过程,如果数据量大的情况恐怕时间消耗无法忍受。 不过可以使用梯度下降等机器学习的相关方法来进行近似计算,以减少时间消耗。
2.
相似度计算方法的选择,有多种相似度计算方法,每种都有对应优缺点,对针对不同场景使用最适合的相似度计算方法。
3.
推荐策略:首先是相似用户可以多个,每个由相似度作为权重来共同影响推荐的item的评分。
矩阵分解SVD在推荐系统中的应用相关推荐
- 【转载】推荐系统-矩阵分解-SVD-通俗易懂
[转载[https://blog.csdn.net/u011412768/article/details/52972081#commentBox] 因为要用到基于SVD的推荐作为baseline,所以 ...
- 【转】矩阵分解 - SVD
<div class="htmledit_views"> [转载[https://blog.csdn.net/u011412768/article/details/52 ...
- 【矩阵论】2. 矩阵分解——SVD
矩阵论 1. 准备知识--复数域上矩阵,Hermite变换) 1.准备知识--复数域上的内积域正交阵 1.准备知识--Hermite阵,二次型,矩阵合同,正定阵,幂0阵,幂等阵,矩阵的秩 2. 矩阵分 ...
- 协同过滤与隐语义模型推荐系统实例3: 基于矩阵分解(SVD)的推荐
[ 协同过滤与隐语义模型推荐系统实例1: 数据处理 ] [ 协同过滤与隐语义模型推荐系统实例2: 基于相似度的推荐 ] 隐语义模型推荐 基于矩阵分解(SVD)的推荐 # 先计算歌曲被当前用户播放量/用 ...
- SVD在推荐系统中的应用详解以及算法推导
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推导已经把SVD的过程讲的很清楚了,本文介 ...
- NMF和SVD在推荐系统中的应用(实战)
本文以NMF和经典SVD为例,讲一讲矩阵分解在推荐系统中的应用. 数据 item\user Ben Tom John Fred item 1 5 5 0 5 item 2 5 0 3 4 item 3 ...
- 《推荐系统笔记(六)》svd在推荐系统中的应用推广(FunkSVD,BiasSVD以及SVD++)及简单实战(surprise库)
前言 奇异值分解(SVD)可以将任意矩阵分解成两个方阵和一个对角矩阵的乘积.借助于SVD,我们可以将推荐系统中的用户-评分矩阵进行分解,通过推广的SVD方法(FunkSVD,BiasSVD和SVD++ ...
- 矩阵分解 SVD分解
在认识SVD之前,先来学习两个相关的概念:正交矩阵和酉矩阵. 如果,则阶实矩阵称为正交矩阵.而酉矩阵是正交矩阵往复数域上的推广. 判断正交矩阵和酉矩阵的充分必要条件是:.或者说正交矩阵和酉矩阵的共轭转 ...
- 矩阵分解SVD和NMF
矩阵的秩 对于一个M×NM \times NM×N的矩阵A,其秩R(A)为线性无关的行向量(列向量)的数量.在空间中,秩表示矩阵的行向量或列向量所张成的空间的维度. 比如有矩阵并化为行最简矩阵:[12 ...
- SVD在推荐系统中的应用
http://yanyiwu.com/work/2012/09/10/SVD-application-in-recsys.html 10 Sep 2012 参考自:http://www.igvita. ...
最新文章
- linux c glib中的hash table
- 首次使用计算机鼠标键盘不能用,解决方案:如何解决无法使用计算机鼠标和键盘的问题?如果启动后无法使用鼠标和键盘该怎么办?...
- 高薪面试系列一.HR
- 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
- matlab 空矩阵耗时,性能 – 更快的方式通过空矩阵乘法初始化数组? (Matlab)
- sshclientCRT连接linux使用技巧
- scrm电商后台管理、公司管理、店铺管理、特卖活动、营销活动、订单管理、优惠券管理、商品管理、会员管理、标签管理、会员卡、签到配置、积分、拼团、砍价、快递配置、短信配置、充值、运营活动
- notice!!!!!!!!!!
- 面试记录:冒泡排序都不会,大哥你会编程吗
- 在构造函数中释放对象本身
- 企业级oracle视频教程,企业级Oracle数据库高可用性(OracleDataGuard)DBA培训视频全集...
- 【LaTex编译遇到问题】!pdfTeX error: pdflatex (file simhei.ttf): cannot open TrueType font file for reading
- 【VISIO2016箭头使用】
- python证件照换底色_python利用opencv实现证件照换底
- 如何调用外部webservice 接口来发送短信
- 5.服务网关:GateWay
- SCONS编译和使用
- 小心做好个人隐私保护!别让笔记本电脑成为隐私泄露的“间谍”
- javascript 时间倒计时
- html标签之列表标签,前端开发资料分享