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)及其应用 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,在接下来会谈到,特征值分解和奇异值分解的 ...
随机推荐
- shell中的wait
cat test1 | uniq > newtest1 & cat test2 | uniq > newtest2 & wait diff newtest1 newtest ...
- Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局
Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...
- Leetcode_101_Symmetric Tree
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42087039 Given a binary tree, c ...
- 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...
- GDAL库调试(包括跨语言调试)
很多时候都需要调试GDAL库,尤其是像学习GDAL库中的某些算法是如何实现的时候,调试就必不可少了. 首先说明用C++的调试.以VS2008为例进行说明. 编译DEBUG版本的GDAL库,这个可以参考 ...
- leetcode【67】-Bulb Switcher
题目描述: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ...
- Java进阶(五十三)屡试不爽之正则表达式
Java进阶(五十三)屡试不爽之正则表达式 在线测试网址: http://tool.oschina.net/regex/# 上面的在线测试网址,含有正则表达式的生成,非常实用.大家共勉之! 匹配中文: ...
- 【一天一道LeetCode】#15 3Sum
一天一道LeetCode系列 (一)题目 Given an array S of n integers, are there elements a, b, c in S such that a + b ...
- JavaScript单线程的疑问与解答
问: JavaScript是单线程的,有任务队列,比如使用setTimeou(func,secs)来在secs毫秒后向任务队列添加func.但是,setTimeout后面跟一个死循环,那么死循环导致任 ...
- 内核调试神器SystemTap — 探测点与语法(二)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探测点 SystemTap脚本主要是由探测点和探测点处理函数组成的,来看下 ...