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)及其应用 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,在接下来会谈到,特征值分解和奇异值分解的 ...
随机推荐
- Linux多线程实践(4) --线程特定数据
线程特定数据 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_ ...
- Chipmunk僵尸物理对象的出现和解决(七)
首先判断问题出现在Star的类方法doStickShorterWork中,于是逐步分词注释代码,最后剩下如下代码: +(void)doStickShorterWork:(Stick *)stick{ ...
- Chipmunk僵尸物理对象的出现和解决(三)
首先是触摸移动反弹棒的代码: -(void)touchMoved:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ CGPoint location ...
- 08_Android中的SimpleAdapter的使用
1 目的界面 2.编写Android清单文件 <?xml version="1.0" encoding="utf-8"?> <manif ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(七)
因为我们之前在GameScene中建立的2个数组,分别为player和label的数组.大家可以注意到其中每个元素是一一对应的. 知道了这层关系,我们尝试来更新matchRun方法: CCAction ...
- 通过iframe引入另外一个项目中的html片段到项目中,解决样式,高度,兼容等问题的策略
<!--尾部开始--> <iframe src="http://172.16.24.11:9000/cartoon-web/footer_new" m ...
- PhotoSwipe源码解读系列(二)
作者: 铁锚 日期: 2013年12月19日 说明: 本系列文章为草稿,等待后期完善.源码是jQuery版本的,code.photoswipe-3.0.5.js 1. 代码开头,就是一些版权申明,没什 ...
- 017-封装-OC笔记
学习目标 1.[了解]异常处理 2.[掌握]类方法 3.[掌握]NSString类 4.[掌握]匿名对象 5.[掌握]封装实例变量 6.[掌握]对象之间的关系 一.异常处理 什么是异常? 代码完全符合 ...
- linux上 java 使用 javasqlite
linux上 java 使用 javasqlite http://www.ch-werner.de/javasqlite/ 1) 下载: http://www.ch-werner.de/javasql ...
- 写一个dup2功能相同的函数,不能调用 fcntl 函数,并且要有出错处理
实现的时候用到系统原来的dup函数 // mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function / ...