特征值分解和奇异值分解

特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景。

奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。

在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic Indexing)

一、特征值与奇异值 

特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,接下来会谈到特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈特征值分解。

1.1 特征值 

如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式子 : Av = λv

这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:A = Q∑Q-1

其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。我这里引用了一些参考文献中的内容来说明一下。

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

它其实对应的线性变换是下面的形式:

因为这个矩阵M乘以一个向量(x,y)的结果是:

上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:

它所描述的变换是下面的样子:

这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。

考虑更一般的非对称矩阵

很遗憾,此时我们再也找不到一组网格,使得矩阵作用在该网格上之后只有拉伸变换(找不到背后的数学原因是对一般非对称矩阵无法保证在实数域上可对角化,不明白也不要在意)。

我们退而求其次,找一组网格,使得矩阵作用在该网格上之后允许有拉伸变换和旋转变换,但要保证变换后的网格依旧互相垂直,这是可以做到的,如下图所示。

简言之,当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。

也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。

下面我们就可以自然过渡到奇异值分解的引入。

1.2 奇异值 

下面谈谈奇异值分解。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,

比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?

奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法: A = UΣVT

假设A是一个N * M的矩阵,那么得到的U是一个N * N的方阵(里面的向量是正交的,U里面的向量称为左奇异向量)

Σ是一个N * M的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值)

V’(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),从图片来反映几个相乘的矩阵的大小可得下面的图片

那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:

这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:

这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:

r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:

右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。

说句大白话,称作「奇异值」可能无法顾名思义迅速理解其本质,那咱们换个说法,称作「主特征值」,你可能就迅速了然了。

而奇异值分解的几何含义为:对于任何的一个矩阵,我们要找到一组两两正交单位向量序列,使得矩阵作用在此向量序列上后得到新的向量序列保持两两正交。

继续拿1.1节的例子进一步阐述,奇异值的几何含义为:这组变换后的新的向量序列的长度。

奇异值的计算是一个难题,是一个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了。

二、奇异值的直观应用 

参考文献 

1 https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html 

2 https://www.zhihu.com/question/22237507 3 We Recommend a Singular Value Decomposition(Feature Column from the AMS)

仅供个人学习使用 转载请注明来源

编辑 ∑Pluto

来源:七月算法

原文地址:https://www.cnblogs.com/jian-gao/p/10781649.html

时间: 2024-11-06 12:15:55

特征值分解和奇异值分解的相关文章

特征值分解,奇异值分解(SVD)

特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法.两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征. 1. 特征值: 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 写成矩阵形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量. 2. 特征分解: 特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,正交矩阵是可逆的.Σ?=?diag(λ1,?λ2,

矩阵的“特征值分解”和“奇异值分解”区别

在信号处理中经常碰到观测值的自相关矩阵,从物理意义上说,如果该观测值是由几个(如 K 个)相互统计独立的源信号线性混合而成,则该相关矩阵的秩或称维数就为 K,由这 K 个统计独立信号构成 K 维的线性空间,可由自相关矩阵最大 K 个特征值所对应的特征向量或观测值矩阵最大 K 个奇异值所对应的左奇异向量展成的子空间表示,通常称信号子空间,它的补空间称噪声子空间,两类子空间相互正交.理论上,由于噪声的存在,自相关矩阵是正定的,但实际应用时,由于样本数量有限,可能发生奇异,矩阵条件数无穷大,造成数值不

矩阵特征值分解与奇异值分解含义解析及应用

此文有一半转载自他出,主要在这进行个整理,具体内容文中都有相关的转载链接. 特征值与特征向量的几何意义 矩阵的乘法是什么,别只告诉我只是"前一个矩阵的行乘以后一个矩阵的列",还会一点的可能还会说"前一个矩阵的列数等于后一个矩阵的行数才能相乘",然而,这里却会和你说--那都是表象. 矩阵乘法真正的含义是变换,我们学<线性代数>一开始就学行变换列变换,那才是线代的核心--别会了点猫腻就忘了本--对,矩阵乘法 就是线性变换,若以其中一个向量A为中心,则B的作用

矩阵的特征值分解和奇异值分解

定理:(奇异值分解)设A为m*n阶复矩阵,则存在m阶酉阵U和n阶酉阵V,使得: A = U*S*V’ 其中S=diag(σi,σ2,……,σr),σi>0 (i=1,…,r),r=rank(A). 推论:设A为m*n阶实矩阵,则存在m阶正交阵U和n阶正交阵V,使得 A = U*S*V’ 其中S=diag(σi,σ2,……,σr),σi>0 (i=1,…,r),r=rank(A). 1.奇异值分解非常有用,对于矩阵A(m*n),存在U(m*m),V(n*n),S(m*n),满足A = U*S*V

【机器学习】从特征分解,奇异值分解到主成分分析

1.理解特征值,特征向量 一个对角阵\(A\),用它做变换时,自然坐标系的坐标轴不会发生旋转变化,而只会发生伸缩,且伸缩的比例就是\(A\)中对角线对应的数值大小. 对于普通矩阵\(A\)来说,是不是也可以找到这样的向量,使得经\(A\)变换后,不改变方向而只伸缩?答案是可以的,这种向量就是\(A\)的特征向量,而对应的伸缩比例就是对应的特征值. 特征值会有复数是为什么? 首先要知道,虚数单位\(i\)对应的是旋转\(90^o\),那么,如果特征值是复数,则对应的特征向量经矩阵\(A\)变换后将

lanczos算法及C++实现(三)实对称三对角阵特征值分解的分治算法

本文属作者原创,转载请注明出处 http://www.cnblogs.com/qxred/p/dcalgorithm.html 本系列目录: lanczos算法及C++实现(一)框架及简单实现 lanczos算法及C++实现(二)实对称阵奇异值分解的QR算法 lanczos算法及C++实现(三)实对称三对角阵特征值分解的分治算法 0. 参考文献 https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm A. Mel

特征值分解和SVD

特征值分解 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量.特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值.我这里引用了一些参考文献中的内容来说明一下.首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换.比如说下面的一个矩阵: 它其实对应的线性变

矩阵分解之奇异值分解

矩阵分解之奇异值分解 引言 首先说矩阵,矩阵是一个难理解的数学描述,不管是在本科阶段的线性代数课上还是在研究生阶段的矩阵分析课上,都没有使我对矩阵产生什么好感,虽然考试也能过关,基本知识也能理解,但就是不知道有卵用.直到接触了机器学习相关算法论述时,发现好多的机器学习算法最终的描述都是通过矩阵分析相关知识推导而来,才知道了矩阵分析是非常有用的,但是到现在为止,还是没有什么好感.然后为什么要讲到奇异值分解,主要是在读<数学之美>中读到了采用奇异值分解解决文本分类问题的巧妙之处.首先在新闻分类中通

机器学习基础篇——矩阵特征值分解含义解析及应用

特征值与特征向量的几何意义: 矩阵的乘法是什么,别只告诉我只是"前一个矩阵的行乘以后一个矩阵的列",还会一点的可能还会说"前一个矩阵的列数等于后一个矩阵的行数才能相乘",然而,这里却会和你说--那都是表象. 矩阵乘法真正的含义是变换,我们学<线性代数>一开始就学行变换列变换,矩阵乘法就是线性变换,若以其中一个向量A为中心,则B的作用主要是使A发生如下变化: 伸缩 clf;     %用来清除图形的命令 A = [0, 1, 1, 0, 0;... 1,