奇异分解(SVD)理论介绍

一、前言

奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,主要应用如下:

信息检索(LSA:隐性语义索引,LSA:隐性语义分析),分解后的奇异值代表了文章的主题或者概念,信息检索的时候同义词,或者说同一主题下的词会映射为同一主题,这样就可以提高搜索效率

数据压缩:通过奇异值分解,选择能量较大的前N个奇异值来代替所有的数据信息,这样可以降低噪声,节省空间。

推荐系统:主要是降噪,矩阵变换至低维空间(分解后还原的矩阵元素值作为原本缺失值的一种近似),方便计算(目前没有意识到它对推荐精确度的提升有什么具体作用)。

二、奇异值与特征值基础知识:

特征值分解的方法比较简单,有趣的是探究什么样的矩阵可以进行特征值分解以及矩阵进行特征值分解之后展现出的矩阵有意思的性质。特征向量矩阵S 是一个正交矩阵,一般写作 Q,也就是实对称矩阵的特征值分解可以写作:

首先,要明确的是,一个矩阵其实相当于一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:

这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。

特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。我们看到的大部分矩阵都不是方阵,故引入了以下的奇异分解

三、奇异分解

综述:SVD又称奇异值分解,是线性代数中一种矩阵分解的技术,它能够将任意一个m*n的矩阵A分解成为U、S、V,U是m*m的正交矩阵,S是m*n的矩阵,V是n*n的正交矩阵(分解成为U、S、V,U是m*k的正交矩阵,S是k*k的矩阵,V是k*n的正交矩阵,k为),且A=U*S*V。通过SVD方式将矩阵A分解后,如果只保留前k个最大的奇异值,就实现了对矩阵降维的目的。我们之所以能够通过保留前k个最大的奇异值来实现降维,是因为在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。尽管我们能够通过降维来减少运算量,但是k值的选取是我们需要面对的重要问题。如果k值选的过大,那么降维的意义就不大;如果k值选的过小,那么降维之后就有可能丢失重要信息。下面通过一个例子来具体说明SVD算法在推荐系统中的应用。

奇异值:

如图一所示假设有 m×n的矩阵 A ,那么 SVD 就是要找到如下式的这么一个分解,将 A 分解为 3 个矩阵的乘积:

其中,Σ就是一个非负实对角矩阵。U 和 V都是正交矩阵 (Orthogonal Matrix),在复数域内的话就是酉矩阵(Unitary Matrix),即

换句话说,就是说 U 的转置等于 U 的逆,V 的转置等于 V的逆:

具体证明:

另外,为了简化计算,可以将上图做进一步调整,如下所示:

这里我们取的是 m 和 n 维标准正交基来构成矩阵 U 和 V ,此外根据取值数量的不同,还有紧奇异值分解与截断奇异值分解,分别表示只取 r 组(矩阵的秩)以及前 k 大的奇异值。这是用于压缩的关键。如上面两个图所示。

满秩奇异值分解的另一种解读:

四、奇异值的计算

U 和 V 的列分别叫做 A的 左奇异向量(left-singular vectors)和 右奇异向量(right-singular vectors),Σ的对角线上的值叫做 A 的奇异值(singular values)。

其实整个求解 SVD 的过程就是求解这 3 个矩阵的过程,而求解这 3 个矩阵的过程就是求解特征值和特征向量的过程,问题就在于 求谁的特征值和特征向量。

但奇异值的计算是一个难题,是一个O(N^3)的算法。在单机的情况下当然是没问题的,matlab在一秒钟内就可以算出1000 * 1000的矩阵的所有奇异值,但是当矩阵的规模增长的时候,计算的复杂度呈3次方增长,就需要并行计算参与了。Google的吴军老师在数学之美系列谈到SVD的时候,说起Google实现了SVD的并行化算法,说这是对人类的一个贡献,但是也没有给出具体的计算规模,也没有给出太多有价值的信息。

其实SVD还是可以用并行的方式去实现的,在解大规模的矩阵的时候,一般使用迭代的方法,当矩阵的规模很大(比如说上亿)的时候,迭代的次数也可能会上亿次,如果使用Map-Reduce框架去解,则每次Map-Reduce完成的时候,都会涉及到写文件、读文件的操作。个人猜测Google云计算体系中除了Map-Reduce以外应该还有类似于MPI的计算模型,也就是节点之间是保持通信,数据是常驻在内存中的,这种计算模型比Map-Reduce在解决迭代次数非常多的时候,要快了很多倍。

Lanczos迭代就是一种解对称方阵部分特征值的方法(之前谈到了,解A‘* A得到的对称方阵的特征值就是解A的右奇异向量),是将一个对称的方程化为一个三对角矩阵再进行求解。按网上的一些文献来看,Google应该是用这种方法去做的奇异值分解的。请见Wikipedia上面的一些引用的论文,如果理解了那些论文,也"几乎"可以做出一个SVD了。

由于奇异值的计算是一个很枯燥,纯数学的过程,而且前人的研究成果(论文中)几乎已经把整个程序的流程图给出来了。更多的关于奇异值计算的部分,将在后面的参考文献中给出,这里不再深入,我还是focus在奇异值的应用中去。

五、降维示例应用:

此时,我们选取k=2来对U,S,V进行降维,k=2即表示我们默认该数据集含有两个隐形因子:

此时我们通过降维后的U、S、V相乘来得到A‘:

通过矩阵A和A‘的比较,我们可以很直观的看出这两个矩阵十分相似。

文章参考:

https://zhuanlan.zhihu.com/p/69540876 --基本思路

https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html --基本思路

https://blog.csdn.net/zhongkejingwang/article/details/43053513 --满秩分解的说明

https://www.cnblogs.com/pinard/p/6251584.html#!comments --较详细的说明

https://www.cnblogs.com/xiaohuahua108/p/6137783.html --SVD案例分析

原文地址:https://www.cnblogs.com/yifanrensheng/p/11832374.html

时间: 2024-10-09 00:19:53

奇异分解(SVD)理论介绍的相关文章

奇异分解(SVD) 案例--用户与商家稀疏矩阵

? ? ? ? 一.稀疏矩阵(sparse matrix): 1.1 介绍: 矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵.因此本文中的数字为50*200=10000,有效数据应该在10000*0.05=500. 1.2 数据构建: 本文模拟50位用户对200名用户进行评价,评价数量只有500个(满足稀疏性要求). 评价分数:使用随机函数,取值从1-5随机. 500样本数由来:

CloudStack(一)简介及相关理论介绍

简介 CloudStack(cloudstack.apache.org)是IaaS类型云计算的一种开源解决方案,同类的解决方案有OpenStack.OpenNebula等,CloudStack是以java语言所研发并具有高可用性.可扩展性.丰富的UI功能.Hypervisor 的多样性等等..(更多请见http://www.cloudstack-china.org/2013/11/2702.html),它可以帮助用户利用自己的硬件提供类似于Amazon EC2那样的公共云服务.CloudStac

实例学习SSIS(五)--理论介绍SSIS

原文:实例学习SSIS(五)--理论介绍SSIS 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SSIS(四)--使用日志记录和错误流重定向 实例学习SSIS(五)--理论介绍SSIS    一.概述 Integration Services 是用于生成高性能数据集成和工作流解决方案(包括针对数据仓库的提取.转换和加载 (ETL) 操作)的平台. Integration Services 包括: a)生

Tomcat理论介绍

在介绍Tomcat之前我们再来好好回顾一下Servlet和JSP Servlet是一种CGI技术,能实现让Java开发动态的Web资源,并通过CGI技术与前端的Web服务器进行通信,但其对HTML文档的定义都要有JAVA程序来实现,任何静态资源以发生修改都要重新编译整个Java页面程序,非常的麻烦,并且Java程序员必须了解前端HTML的展示方式 servlet也可以被认为是服务器端的applet.servlet被Web服务器加载和执行,就如同applet被浏览器加载和执行一样.servlet从

iOS开发多线程理论介绍

前言 线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B.为了同时执行两个任务,产生了多线程. 就我们日常生活的例子来说: (1)我打开一个视频软件,我开辟一个线程A让它执行下载任务,我开辟一个线程B,用来播放视频.我开辟两个线程后,这两个任务能同时执行,如果我开辟一个线程,只有下载任务完成,才能去执行播放任务. (2)线程相当于店里的服务员,一个服务员同时只能做一件事情,多顾几个服务员,就能同时做很多事情. 在了解多线程之前我们先来介绍一下进程和线程 进程 进程是操作系统中运行的程序专

(转)shiro权限框架详解02-权限理论介绍

http://blog.csdn.net/facekbook/article/details/54893042 权限管理解决方案 本文主要介绍权限管理的解决方法: 粗颗粒度和细颗粒度 基于url拦截 使用权限管理框架 粗颗粒度和细颗粒度 什么是粗颗粒度和细颗粒度 在上一文中提到粗颗粒度和细颗粒度,但是没有细讲. 对资源类型的管理称为粗颗粒度权限管理,既只控制到菜单.按钮.方法,粗颗粒度的例子比如:用户具有用户管理的权限,具有导出订单的权限.对资源实例的控制称为细颗粒度权限管理,既控制到数据级别,

数据挖掘—关联规则理论介绍与R实现

Apriori algorithm是关联规则里一项基本算法.是由Rakesh Agrawal和Ramakrishnan Srikant两位博士在1994年提出的关联规则挖掘算法.关联规则的目的就是在一个数据集中找出项与项之间的关系,也被称为购物蓝分析 (Market Basket analysis),因为"购物蓝分析"很贴切的表达了适用该算法情景中的一个子集. 关于这个算法有一个非常有名的故事:"尿布和啤酒".故事是这样的:美国的妇女们经常会嘱咐她们的丈夫下班后为孩

OSPF理论介绍

OSPF协议Open Shortest Path First是链路状态协议.RIP和EIGRP是距离矢量协议只知道邻居,但链路状态可知道全网信息,因此天然免疫环路.距离矢量协议和链路状态协议最大的区别就是后者对全网了解的更多.同样有邻居表,拓扑表,路由表.OSPF传递的并不是路由,而是传递LSA,最终路由表是从LSA中获取全网信息后通过SPF算法计算得出的,存放LSA的地方就是LSDB.处于同一区域的路由器内的LSDB都是一样的. 先大致描述一下:OSPF是链路状态协议,能知道全网的信息.是IG

算法学习笔记:knn理论介绍

阅读对象:了解指示函数,了解训练集.测试集的概念. 1.简介 knn算法是监督学习中分类方法的一种.所谓监督学习与非监督学习,是指训练数据是否有标注类别,若有则为监督学习,若否则为非监督学习.所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类(加权),就把该输入实例分类到这个类中. 最初的近邻法是由Cover和Hart于1968年提出的,随后得到理论上深入的分析与研究,是非参数法中最重要的方法之一,它在论文Nearest