SVD的概念以及应用
第十四章 利用SVD简化数据
一.引言
SVD的全称是奇异值分解,SVD的作用是它能够将高维的数据空间映射到低维的数据空间,实现数据约减和去除噪声的功能。
SVD的特点主要有以下几个方面:
1.它的优点:去除噪声,简化数据,提高算法的结果
2.它的缺点:数据的转化难以理解
3.它适用的数据:数值型数据
二.SVD的作用
SVD经常用于信息检索领域,在信息检索中我们将使用了SVD方法的数据文档数据处理方式称之为隐性语义索引。隐性语义索引,它将一个文档分解为了词和词频,能够利用然后分解得到的矩阵进行奇异值分解从而或者文档的主题与概念。同时它还能够实现同义词的概念映射。
SVD也常常用于推荐系统,通过SVD对数据的约减将原始数据进行空间映射,进行降维,得到的数据可以被定义为另一种概念,可以看做是一种概念抽象的过程。
三.矩阵分解
SVD将一个矩阵(m*n)分解成三个矩阵的乘积,第一个矩阵是m*m,第二个矩阵是m*n(它是一个对角矩阵,只有对角线的元素才可能为非零,并且它的值是按照从到排列的),第三个矩阵是n*n;其中的第二个矩阵就是所说的奇异值。奇异值它能够在一定的程度上表现数据的特征,这一点和PCA中所说的特征值的概念很像,实际上奇异值和特征值也确实存在着联系。Data*dataT的特征值的开方就是data的奇异值。我们按照从大到小的顺序对奇异值进行排序,那么有可能出现奇异值为0的情况,那么这时候就说明该行的特征是多余的,我们在计算的时候就可以忽略它,这样就能够实现特征约减。
四.利用python实现SVD
利用Python事项SVD非常的简单,因为Python中的numpy中有现成的库可以调用svd.
以下是python代码:

利用我们在知道奇异值之后,对于保留多少个奇异值,有很多种方法。第一种方法是比较常用的,也就是将所有的奇异值进行平方,然后依次把它们加起来知道它们的和达到总值的百分之九十,那么这些奇异值就是我们想要保留的奇异值,这种方法称之为90%energy save。另一种更加直观的方法是我们保留前若干个特征值,比如我们有一万条数据那么我们就保留前2000到三千个特征值。
五.基于协同过滤的推荐引擎
所谓的协同过滤就是利用用户和其他用户进行对比实现推荐。这个对比我们就需要用到相似度的概念,比如两个人喜欢的电影的相似度很高,那么其中一个人看过的电影就可以推荐给另一个没看过该电影的人看。
相似度的度量方式有三种:一种是1/(1+距离),第二种是皮尔逊相关系数,但是皮尔逊相关系数的值是-1到1,要对它进行0到1的归一化,那么就变成了1/2+1/2*皮尔逊相关系数值。第三种方式是余弦相似度。
以下我们用pytnon了解这三种度量方式的代码实现:

在计算相似度的时候,我们将行向量之间的相似度称之为用户相似度,将列向量之间的额相似度称之为物品相似度,具体使用用户相似度还是物品相似度取决于那个的数量更少。对于一般的推荐系统来说,商品的数量会明显的更少,所以我们倾向于选择使用商品相似度。
六.构建一个食物的推荐系统
要构建一个食物的推荐系统,要分成两步:1.首先我们需要根据相似度用户对于还未吃过的食物的评分; 2.我们选出未评分的食物中,评分靠前的前几个作为我们的推荐。
以下是具体的代码:第一个步骤:

第二个步骤:

通过以上两个步骤,我们就可以得到推荐的食物的编号,和用户对它的可能评分。
这个算法还存在着一些不足,首先在实际中并不需要在每次计算得分的时候计算一次SVD;其次在计算物体相似度的时候,有很多结果是重复的,因此我们可以在计算的时候保存计算的结果,以便下一次直接调用;最后就是它可能遇到冷启动的问题。所谓的冷启动,指的是当我们新加入一个物品时,因为之前没有任何人为他评过分,因此没有物品和它相似,所以就没有办法让这个物品成为有效的物品推荐给可能喜欢它的用户。解决冷启动的问题很难,我们现在可以用基于内容的推荐来规避这个问题。
六.总结
SVD是一种去除噪声和降维的实用方法,我们可以通过SVD获取数据中的重要特征,通过保留矩阵百分之八十到百分之九十的能量,我们就可以保存重要的特征和去除噪声。SVD可以用于搜索引擎,它能够基于用户和行为数据进行协同过滤。协同过滤的核心是相似度计算,相似度的度量方式有很多种,这里列举了常用的三种。
在大数据中应用SVD技术有点困难,我们可以使用离线处理的方式,在本地先进行SVD计算,然后再应用它。
SVD的概念以及应用的更多相关文章
- 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理
0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...
- 数据科学中需要知道的5个关于奇异值分解(SVD)的应用
介绍 "Another day has passed, and I still haven't used y = mx + b." 这听起来是不是很熟悉?我经常听到我大学的熟人抱怨 ...
- Notes About Singular Value Decomposition
A brief summary of SVD: An original matrix Amn is represented as a muliplication of three matrices: ...
- SVD奇异值分解的基本原理和运用
SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...
- Matrix Factorization SVD 矩阵分解
Today we have learned the Matrix Factorization, and I want to record my study notes. Some kownledge ...
- PCA本质和SVD
一.一些概念 线性相关:其中一个向量可以由其他向量线性表出. 线性无关:其中一个向量不可以由其他向量线性表出,或者另一种说法是找不到一个X不等于0,能够使得AX=0.如果对于一个矩阵A来说它的列是线性 ...
- 数值分析之奇异值分解(SVD)篇
在很多线性代数问题中,如果我们首先思考若做SVD,情况将会怎样,那么问题可能会得到更好的理解[1]. --Lloyd N. ...
- 强大的矩阵奇异值分解(SVD)及其应用
版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...
- 利用奇异值分解(SVD)简化数据
特征值与特征向量 下面这部分内容摘自:强大的矩阵奇异值分解(SVD)及其应用 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,在接下来会谈到,特征值分解和奇异值分解的 ...
随机推荐
- Java 8新特性探究(一) JEP126特性lambda表达式和默认方法
Lambda语法 函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口.比如Java标准库中的java.la ...
- ios可视化编程 UI高级 UI_13
一.简单的说,IB Xib就是拖控件编程,也可以说是可视化编程(所见即所得),使用Xib编程,相对于纯代码,可以省下大量的敲代码时间,从而提高程序的开发时间,Xcode 4 之后才可以在工程中直接使 ...
- XML引入以及与html的区别
1.1 引入 HTML: 负责网页的结构 CSS: 负责网页的样式(美观) Javascript: 负责在浏览器端与用户进行交互. 负责静态的网页制作的语言 HTML语言特点: 1)由标签组成. &l ...
- 利用HTP工具包开发报表
利用这种方式的优点是不需要跑请求就可以打印报表 工具包中常用程序说明 htp.print 语法 htp.print (cbuf | dbuf | nbuf); 作用 generates a l ...
- hive发杂数据结构的使用,struct,array,map
一个简单介绍http://jimi68.iteye.com/blog/980573 一般的复杂介绍:http://songpo-ath-taobao-com.iteye.com/blog/140513 ...
- VS2008中开发手持终端程序(PDA软件)总结
VS2008中开发手持终端程序(PDA手机软件)的项目总结 1程序结构 程序中包括四个部分: 1.系统配置 这个部分用来配置系统中的相关参数,参数包括数据库信息和串口的配置信息.这部分的主要技术是XM ...
- 如何实现 集群化/Session 复制-doc(cluster-howto.html)
源文档链接: http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 翻译日期: 2014年3月19日 翻译人员: 铁锚 感受: Tomc ...
- 《java入门第一季》之面向对象(方法重写问题)
方法重载的引入:根据一个案例: /* 继承中成员方法的关系: A:子类中的方法和父类中的方法声明不一样,这个太简单. B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢? 通过子类对象调用方法: ...
- LoadRunner压力测试实例
1 LoadRunner 概要介绍... 2 .项目背景介绍... 5 .使用LoadRunner进行负载/ 实施测试... 16 6.1 Memory相关... 22 6.2 Processor相关 ...
- /etc/fstab文件出错,无法进入Linux系统
问题描述 今天复习Linux文件系统管理,在Linux系统上挂载了一块新硬盘之后,然后分区,格式化,一步步走下来,为了能够使该硬盘在系统启动时自动挂载,于是将之写入了/etc/fstab文件,然而在r ...