SVD

推荐系统笔记之五——基于学习的协同过滤(数学中的SVD、机器学习中SVD、推荐系统中的SVD系列)

    SVD(single value Decomposition,奇异值分解)在机器学习中经常出现,是一类用来降维的方法,在图像处理方面,是一类用来降噪降秩的方法,在推荐系统中,发展成为一系列基于矩阵分解类模型。

  笔者经历尚浅,暂时认为降维降秩和推荐系统中的一系列算法在应用上不应该混为一谈。

 

数学中的SVD

  SVD是应用广泛 的数学方法,属于 矩阵分析 的范畴,它代表一种矩阵分解的方式——一个m*n的矩阵分解成两个酉矩阵和一个对角线矩阵(酉矩阵即即满足   矩阵的转置*矩阵== I单位矩阵)。

  直观的看,SVD分解就是下图中的步骤:

SVD_第1张图片

 

  SVD分解的详细证明过程可见 《矩阵分析(第四版)》P84。

刘建平的博客中有SVD计算的例子:https://www.cnblogs.com/pinard/p/6251584.html

-------------------------------------------------------------------------------------------------------------------------------------

图像处理中的SVD——降秩降噪

SVD方法本质上只是将一个矩阵分解成了三个矩阵,而要做到降噪降秩则是利用了SVD的一些性质:

首先我们要知道,SVD分解出来的三个矩阵,分别代表了什么。

SVD_第2张图片

设A为原矩阵,U、∑、VT为分解出来的三个矩阵。

        U实质上是A*AT的特征向量的堆叠,V是AT*A这个矩阵的特征向量的堆叠,∑的对角线上则是特征值。

SVD有这样一条性质:∑对角线上的特征值所对应特征向量包含的能量,从左上往右下是一个递减过程,而且还是跨度极大的递减。一般前面很少几个特征值能能量总和就包含了整体能量的百分之九十。

  有了这条性质,我们就知道降噪降秩是怎么玩的了——将前面那些包含大部分能量的拿出来用,其他的舍弃掉。

降秩降噪

  将原本的三个矩阵U_{m*m} \Sigma _{m*n}V^T_{n*n}(下标代表矩阵的shape)裁剪成U_{m*k} \Sigma _{k*k}V^T_{k*n}

  由裁剪后的U_{m*k} \Sigma _{k*k}V^T_{k*n}乘起来得到的结果与A矩阵不同,但是保留了A矩阵百分之九十(九十是自己算的,求∑矩阵里面的元素平方占所有对角线元素的百分比)的能量,去除了许多无用的信息,这就是用于图片降噪的原理(当然前提是我们知道图片可以用矩阵来表示)。

  有一点值得注意,也是我一直误解的地方,当初想当然的认为U_{m*k} \Sigma _{k*k}V^T_{k*n}得到的结果与原矩阵A相比维度降低了,但是仔细看一下,其实它的结果矩阵与矩阵A,两者shape是一样的,这个操作是降噪降秩,并没有降维。

-------------------------------------------------------------------------------------------------------------------------------------

 

机器学习中的SVD

  机器学习降维方法中的SVD应该称之为 截断SVD(Truncated Single Value Decomposition),事实上,sikit-learn中就是这么命名的。 

  我们已经知道了三个矩阵各自怎么来的,大概了解代表了怎么样的意义,并且知道它如何做到了降噪,那么降维,也不难理解。

降维

 

截断svd只是使用U矩阵和 ∑矩阵 的一部分相乘得到的。
即 结果 = U_{m*k} \Sigma _{k*k},这样求得的矩阵显然是将列维度降到了k。

如果需要压缩样本数量,同样可以使用 ∑矩阵右乘VT矩阵,不使用U矩阵,即 \Sigma _{k*k}V^T_{k*n}

至于为什么可以用U_{m*k} \Sigma _{k*k}来近似结果而舍弃V,我暂时的理解是U和V都是A和AT的特征向量矩阵,其代表的信息是相同的,只取一边即可,深一点的原因暂时没有了解到。

-------------------------------------------------------------------------------------------------------------------------------------

推荐系统中的SVD

   重点来了,推荐系统的SVD系列算法,这个系列的算法来自于NLP领域的隐语义模型LFM的LSI算法,虽然是叫着SVD,但是用起来一点儿也感觉不到矩阵分解的存在,真的(网上也找不到这个问题的答案,有过路大佬还望指点)。

 首先提一下在《机器学习实战》中,提出的推荐系统中SVD的用法还是最原始的用法,大概是这样的:

     对用户-物品的评分矩阵进行SVD,将物品映射到低维空间,然后计算相似度,无论是用户相似度还是物品相似度,只要有了,就可以推荐了。

    但是,这种做法一般是没有什么意义的,因为一般(绝大部分)推荐系统中的用户-物品评分矩阵都是极其极其稀疏的,简单地仅仅使用很少的已知信息很容易导致过拟合。而我们又没有好的方法去填充缺失值的部分。

 

Funk SVD

  就是从它开始,让我对这个名字产生了怀疑。

  funk SVD原理是这样的: 将原本的用户-物品评分矩阵 用 两个矩阵 Q 和 P的乘积来近似,如何近似?用梯度下降之类的优化算法。

  公式来表示:  A \approx Q P,  Q和P的shape分别了m*f、f*n,f为超参,代表了隐含主题数(如电影推荐系统,Q中每一行代表用户u对喜剧、恐怖等元素的喜爱程度,而P中每一行代表了电影i含有的喜剧、恐怖等元素的比例)。

  用A矩阵中的每一个评分来表示:r_{ui} \approx r_{ui} ^- = \sum ^F_{f=1}P_{uf}Q_{fi}

  解释一下:一个评分的预测的根据是 该用户对各种主题元素的喜爱程度以及该电影拥有的这些主题元素的比例。

  可以发现,整个P矩阵和Q矩阵都是需要拟合的参数,下一步该考虑的就是怎么拟合,怎么创造出这两个矩阵?

   回到机器学习的套路中来,损失函数闪亮登场:

                                    Loss = r_{ui}-r_{ui}^-, 即Loss = r_{ui}-\sum ^F_{f=1}P_{uf}Q_{fi}.

  通过最小化损失函数来求解,一般LFM使用SGD和交替最小二乘法来迭代参数。

 随机梯度下降SGD计算如下:

  p_{uf}^` = p_{uf}-\alpha\frac{\partial Loss}{\partial p_{uf}},\frac{\partial Loss}{\partial p_{uf}}=-p_{uf}(r_{ui}-\sum^F_{f=1}p_{uf}q_{if})

 q_{if}^` = q_{if}-\alpha\frac{\partial Loss}{\partial q_{if}},\frac{\partial Loss}{\partial q_{if}}=-q_{if}(r_{ui}-\sum^F_{f=1}p_{uf}q_{if}), α为超参。

 

Basic SVD

  Basci SVD在Funk SVD之上做了优化,加入了“基准”。

  什么是“基准”?对于一个用户来说,他对物品评分的标准(如一个人最好只给四星,最差只给两星,另一个人却只给五星和一星)。对于一个物品来说,也有基准,是所有评分过的用户对这个物品的平均喜好。

  用\mu来表示整体平均分,用b_u表示用户u所有评分与\mu的偏差,b_i表示物品i所有评分与\mu的偏差,则得到Basic SVD公式:

  r_{ui} \approx r_{ui} ^- = \mu + b_i+b_u+\sum ^F_{f=1}P_{uf}Q_{fi}

 

SVD++

    SVD++在Basic SVD的基础上,又考虑了隐式数据的反馈。

    先上公式:r_{ui} \approx r_{ui} ^- = \mu + b_i+b_u+\sum ^F_{f=1}Q_{fi}(P_{uf}+|R(u)|^{-\frac{1}{2}}\sum _{j\in R(u)}y_j) , R(u)代表用户u已有的隐式反馈数据集合。

    什么是隐式反馈数据? 其实有很多,比如一个电影推荐系统,一个用户虽然没有评论某个电影,但是他搜索过这个电影或者打开过这个电影,这些交互行为并没有显示的告诉我们用户对电影的评价,但是我们可以认为用户对这个电影可能有兴趣。

    上式中的R(u)即可以这样理解:无论用户对该电影评分多少,他都有打开这一电影看的这一行为,那么说明他对这部电影的某种主题或者某些主题感兴趣。SVD++要做的,就是从这种隐式反馈中发现用户感兴趣的元素。

    当然,如果隐式反馈数据不止一种,我们变换公式形式就可以了,如下:

    r_{ui} \approx r_{ui} ^- = \mu + b_i+b_u+\sum ^F_{f=1}Q_{fi}(P_{uf}+|R^1(u)|^{-\frac{1}{2}}\sum _{j\in R^1(u)}y_j^{(1)}+|R^2(u)|^{-\frac{1}{2}}\sum _{j\in R^2(u)}y_j^{(2)})

 

阅读更多 收藏

})()

    

基于协同过滤SVD推荐系统

10-20 阅读数 3323

参考论文:UsingSingularValueDecompositionApproximationForCollaborativeFiltering背景:m-n矩阵是一个打分矩阵,m是用户的数量,n为... 博文 来自: 哆啦咪~fo

		



		

基于协同过滤SVD推荐系统 - 哆啦咪~fo - CSDN博客

12-19

来自: 机器笨猫 SVD在推荐系统中的应用 05-18 ...说参考也不准确,准确地说应该是半翻译半学习笔记。...我们需要一个数学模型来模拟用户给电影打分的场景,...

机器学习之路(五)协同过滤SVD算法 - asd2479745295的..._CSDN博客

1-7

基于SVD协同过滤算法实现的电影推荐系统 06-11 807...前言: SVD作为一个很基本的算法,在很多机器学习算法...这是本人在学习人工智能时的学习笔记,加深理解 推荐...

		



		


      
小迷妹大米姐关注
小迷妹大米姐

92篇文章

排名:千里之外

SongpingWang关注
SongpingWang

286篇文章

排名:千里之外

Orange先生关注
Orange先生

49篇文章

排名:千里之外

努力是一种幸运关注
努力是一种幸运

61篇文章

排名:千里之外

		



		



		



		



		

		



		



		



		



		

		



		



		



		



			

http://gustavonarea.net/blog/posts/korens-svd-python-implementation/
内含使用…
下载


		



			

基于SVD的协同过滤推荐系统

我的博客地址:
http://blog.csdn.net/jinshengtao/article/details/41387379
下载


		



			

1,movielens 公开实验数据集(推荐系统研究经常用到~)
2,模拟预测评分的python代码(python3.x)

希望对大家学习有所帮助。有问题可以邮箱联系。
下载


		

		



		



		



		



		

最新文章

  • 推荐系统学习笔记之四——相似度计算以及权重的重要性
  • 推荐系统学习笔记之三——(基于邻域的)协同过滤算法的公式化、标准化
  • 推荐系统学习笔记之二——详解几类推荐技术(基于内容的推荐、基于用户的协同过滤、基于物品的协同过滤、基于模型的协同过滤)
  • 推荐系统学习笔记之一——综述
  • 机器学习笔记之二十二——PCA与SVD

个人分类

  • 搭着玩儿 4篇
  • 机器学习 26篇
  • hadoop生态圈 18篇
  • 深度学习 2篇
  • javaweb 3篇
  • ML实战 4篇
  • 算法 3篇
  • 推荐系统 5篇

展开

归档

  • 2019年3月 6篇
  • 2019年2月 12篇
  • 2019年1月 7篇
  • 2018年12月 9篇
  • 2018年11月 16篇
  • 2018年10月 2篇
  • 2018年9月 2篇
  • 2018年8月 1篇
  • 2018年7月 1篇
  • 2018年5月 4篇
  • 2018年4月 3篇
  • 2017年12月 1篇

展开

热门文章

  • 当mybatis逆向工程遇上了数据库字段增加

    阅读数 1346

  • 搭着玩儿 之 接口管理工具rap2本地搭建

    阅读数 893

  • 工作日常之2g内存运行gitla导致内存不足,分配swap

    阅读数 691

  • 机器学习笔记之十九——决策树的损失函数(补充)

    阅读数 525

  • 工作日常之微信助手itchat

    阅读数 356

最新评论

  • 数据挖掘竞赛总结——津南数字制造算...

    Java201314zt:[reply]qq_35946969[/reply] 收到,谢谢博主

  • 数据挖掘竞赛总结——津南数字制造算...

    Java201314zt:[reply]qq_35946969[/reply] 收到,谢谢博主,博主大人真好

  • 数据挖掘竞赛总结——津南数字制造算...

    qq_35946969:[reply]qq_16598547[/reply] 已发

  • 数据挖掘竞赛总结——津南数字制造算...

    qq_35946969:[reply]Java201314zt[/reply] 。。。。。。。。。。。。。。。 发了

  • 数据挖掘竞赛总结——津南数字制造算...

    qq_16598547:博主,求分享数据集[email protected]

	

			

你可能感兴趣的:(SVD)