<div class="htmledit_views">

【转载【https://blog.csdn.net/u011412768/article/details/52972081#commentBox】 因为要用到基于SVD的推荐作为baseline,所以最近学习了一下SVD这个算法,感觉理解了好长时间。首先看的两篇是实验室师兄科学网上翻译的两篇介绍SVD的文章,阅读量很大,翻译得很好。后面在网上又找到一篇专门接受SVD应用到推荐系统的文章,感觉博主写得很不错,感谢两位前辈的知识,让我可以好好学习SVD。

SVD介绍博文两篇:

地址1:奇异值分解(SVD) — 线性变换几何意义

地址2:奇异值分解(SVD) — 几何意义

下面是博主“不是我干的”总结的“SVD在推荐系统中的应用”:

原文地址:SVD在推荐系统中的应用(CSDN上也有博主这篇文章)

下面是第二位博主的正文部分,保存着共自己学习:

作者:不是我干的

参考自: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就是用来将一个大的矩阵以降低维数的方式进行有损地压缩。

降维:(相对于机器学习中的PCA)

下面我们将用一个具体的例子展示svd的具体过程。

首先是A矩阵。

  1. A =
  2. 5 5 0 5
  3. 5 0 3 4
  4. 3 4 0 3
  5. 0 0 5 3
  6. 5 4 4 5
  7. 5 4 5 5
  • 1

(代表上图的评分矩阵)

使用matlab调用svd函数:

  1. [U,S,Vtranspose]=svd(A)
  2. U =
  3. -0.4472 -0.5373 -0.0064 -0.5037 -0.3857 -0.3298
  4. -0.3586 0.2461 0.8622 -0.1458 0.0780 0.2002
  5. -0.2925 -0.4033 -0.2275 -0.1038 0.4360 0.7065
  6. -0.2078 0.6700 -0.3951 -0.5888 0.0260 0.0667
  7. -0.5099 0.0597 -0.1097 0.2869 0.5946 -0.5371
  8. -0.5316 0.1887 -0.1914 0.5341 -0.5485 0.2429
  9. S =
  10. 17.7139 0 0 0
  11. 0 6.3917 0 0
  12. 0 0 3.0980 0
  13. 0 0 0 1.3290
  14. 0 0 0 0
  15. 0 0 0 0
  16. Vtranspose =
  17. -0.5710 -0.2228 0.6749 0.4109
  18. -0.4275 -0.5172 -0.6929 0.2637
  19. -0.3846 0.8246 -0.2532 0.3286
  20. -0.5859 0.0532 0.0140 -0.8085
  • 1

分解矩阵之后我们首先需要明白S的意义。

可以看到S很特别,是个对角线矩阵。

每个元素非负,而且依次减小,从几何意义上来说,此值和特征向量中的特征值的权重有关。

所以可以取S对角线上前k个元素。

当k=2时候即将S(6*4)降维成S(2*2)

同时U(6*6),Vtranspose(4*4)相应地变为 U(6*2),V(4*2)(这里V.transpose应该为2*4)

如下图(图片里的usv矩阵元素值和我自己matlab算出的usv矩阵元素值有些正负不一致,但是本质是相同的):

此时我们用降维后的U,S,V来相乘得到A2

A2=U(1:6,1:2)*S(1:2,1:2)*(V(1:4,1:2))' //matlab语句
  • 1
  • 2
  1. A2 =
  2. 5.2885 5.1627 0.2149 4.4591
  3. 3.2768 1.9021 3.7400 3.8058
  4. 3.5324 3.5479 -0.1332 2.8984
  5. 1.1475 -0.6417 4.9472 2.3846
  6. 5.0727 3.6640 3.7887 5.3130
  7. 5.1086 3.4019 4.6166 5.5822
  • 1

此时我们可以很直观地看出,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最小的用户坐标,可以计算出最相似的用户是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的评分。

最后附上一些其他博主的博文,可以加深理解:

(1)机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

(2)[机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用

(3)矩阵特征值分解与奇异值分解含义解析及应用

感谢前辈们提供的知识~

        </div></div>
  • 1
  • 2
      <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet"></div>

【转】矩阵分解 - SVD相关推荐

  1. 【矩阵论】2. 矩阵分解——SVD

    矩阵论 1. 准备知识--复数域上矩阵,Hermite变换) 1.准备知识--复数域上的内积域正交阵 1.准备知识--Hermite阵,二次型,矩阵合同,正定阵,幂0阵,幂等阵,矩阵的秩 2. 矩阵分 ...

  2. 【转载】推荐系统-矩阵分解-SVD-通俗易懂

    [转载[https://blog.csdn.net/u011412768/article/details/52972081#commentBox] 因为要用到基于SVD的推荐作为baseline,所以 ...

  3. 矩阵分解 SVD分解

    在认识SVD之前,先来学习两个相关的概念:正交矩阵和酉矩阵. 如果,则阶实矩阵称为正交矩阵.而酉矩阵是正交矩阵往复数域上的推广. 判断正交矩阵和酉矩阵的充分必要条件是:.或者说正交矩阵和酉矩阵的共轭转 ...

  4. 矩阵分解SVD和NMF

    矩阵的秩 对于一个M×NM \times NM×N的矩阵A,其秩R(A)为线性无关的行向量(列向量)的数量.在空间中,秩表示矩阵的行向量或列向量所张成的空间的维度. 比如有矩阵并化为行最简矩阵:[12 ...

  5. 协同过滤与隐语义模型推荐系统实例3: 基于矩阵分解(SVD)的推荐

    [ 协同过滤与隐语义模型推荐系统实例1: 数据处理 ] [ 协同过滤与隐语义模型推荐系统实例2: 基于相似度的推荐 ] 隐语义模型推荐 基于矩阵分解(SVD)的推荐 # 先计算歌曲被当前用户播放量/用 ...

  6. 矩阵分解 SVD 和 CUR的区别

    4.1SVD的定义 4.2SVD计算原理 4.2.1计算VV矩阵 对于原始数据矩阵A, A=UΣVTA=UΣVT 由定义可知 ΣΣ 为对角矩阵,即 Σ=ΣTΣ=ΣT ,则有 AT=(UΣVT)T=(V ...

  7. 3-19pytorch与矩阵分解SVD

  8. 基于SVD矩阵分解的用户商品推荐(python实现)

    加粗样式## SVD矩阵分解 SVD奇异值分解 优点:简化数据,去除噪声,提高算法的结果 缺点:数据的转换可能难以理解 适用范围:数值性数据 原始数据data,我们把它分解成3个矩阵. 其中 只有对角 ...

  9. 矩阵分解及其Eigen实现

    主要是用来记录自己的学习过程,内容也主要来自于网上的各种资料,然后自己总结而来,参考的资料都以注明,感谢这些作者的分享.如果内容有误,请大家指点. LU分解1 理论 定义        将矩阵等价为两 ...

最新文章

  1. 同向逆向、多车道线检测
  2. CI Weekly #7 | Instgram/Quora 等大公司如何做持续部署?
  3. EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】
  4. 斜杠青年Ruff:区块链只是分内事
  5. 30分钟快速搭建移动应用直传OSS服务
  6. 实战CGLib系列之proxy:方法拦截MethodInterceptor
  7. Java中高级面试题 -- 数十道题含答案
  8. Python基础知识3: if判断语句
  9. 右侧按钮登录注册html,翻转式用户登录注册界面设计
  10. Reachability from the Capital
  11. shl归纳推理测试题库_SHL(外企笔试常见试题)全攻略
  12. m3u8 TS 解密合并转码mp4,支持在线 ,UC、QQ等本地缓存
  13. ExtJS4 时间在edge中显示为0NaN-NaN-NaN NaN:NaN
  14. 2014联通见习感悟
  15. html进度条倒计时代码,html5+css3进度条倒计时动画特效代码【推荐】_html5教程技巧...
  16. android 跑马灯出现重复跳动、不滚动问题
  17. 如何用OCR文字识别软件将PDF转换成Excel
  18. zipimport.ZipImportError: can't decompress data
  19. WEB:Wife_wife
  20. java微信小程序、APP 西门子PLC通信,java S7-S200、java S7-300、java S7-400,java与PROFINET协议通信 Java与西门子PLC通信

热门文章

  1. sql交叉报表实例(转)
  2. ES2020的新特性解读
  3. Centos7 安装配置 tomcat 并设置自动启动
  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 02 了解大厂面试基本套路及每一轮的重点
  5. Tomcat 8.5 配置 SSL 证书 1
  6. 企业如何实际使用 Docker
  7. DockOne技术分享:十个问题带你了解Windows Docker
  8. 【springboot 踩坑记录】拦截器中无法注入bean
  9. Hibernate 中出现 xxx表 is not mapped xxx的问题
  10. 【软件】OBS无法捕捉显示屏