线性代数学习之对称矩阵与矩阵的SVD分解

完美的对称矩阵:

定义:

在上一次https://www.cnblogs.com/webor2006/p/14395361.html学习了矩阵的特征值和特征向量相关的概念,这次则继续延展上一次的内容,这次则来学习对称矩阵,其标题上加了“完美”俩字,因为对于对称矩阵拥有非常好的性质,使得这次的学习主线就是对称矩阵,借助对称矩阵可以处理任何矩阵,把任何矩阵分解成希望的形式,也就是矩阵的SVD分解,下面就来看一下为啥对称矩阵是“完美”的。

先来看一下对称矩阵的样子:

 

而要注意这里说的对称是指:

并不是看主对角一样就说是对称矩阵哟,再来看几个其它形式的对称矩阵:

 

那上面这个是不是对称矩阵呢?是的!!!对称矩阵要这么看:

 

所以上面所举的例子对于对称矩阵可以抽象为:

用代数来表示就是有如下等式:

为什么说对称矩阵是完美的?

首先要明白一点,对称矩阵一定是方阵,所以就可以求它的特征值和特征向量,但是求特征值时存在两个不那么简单的特征向量:

 

其中多重特征值有可能求出特征空间的维度<重数,这种情况就为矩阵的对角化造成了麻烦,因为就无法找到n个线性无关的特征向量形成矩阵P,但是!!!对于对称矩阵完全不需要担心担心这两种情况,原因如下:

1、对称矩阵的特征值一定是实数!

2、对称矩阵的多重特征值,其对应的特征空间的维度一定等于重数!

对于这种情况其实可以回忆一下上一次举的这个单位矩阵:

因为这个单位矩阵就满足对称矩阵呀,而之前举过这样一个方阵的情况:

显然这个矩阵不是一个对称矩阵,所以就没有特征空间的维度一定等于特征值的个数的特点了。

3、对称矩阵的几何重数等于代数重数!

4、对称矩阵一定有n个线性无关的特征向量。

5、基于第4点,也能知道对称矩阵一定可以被对角化。

很明显它是比较完美的,完美的规避了之前求特征向量的那两种特殊的情况,另外它还有其它的一些优美的性质,继续往下学习。

正交对角化:

在上面谈到对称矩阵的几个特性印证了它的完美,其实它还有更加完美的性质,因为它除了能够被对角化之外,还能够正交对角化, 那啥叫正交对角化呢?先来看一下什么是对角化,其实就是这么一个式子:

分解成这个的含义就是指对于矩阵A将其看成是一个变化的话,这个变化我们在另外一个坐标系观察的话其实就是一个对角矩阵所对应的变化,而对角矩阵非常的简单,为我们研究A这个矩阵所代表的变换提供了一个很好的工具,但是在这里还需要变换一个视角,这个视角由矩阵P来决定,而矩阵P是由所有的线性无关的特征向量排列组成的坐标转换矩阵,换言之,我们要转换到矩阵P所代表的那个坐标系中,但是!!!这个坐标系可能是比较扭屈的一个坐标系,比如说:

其中也就是绿色所示则是矩阵对应的特征向量,很明显这个绿色向量所对应的坐标系是很扭屈的,而我们是比较喜欢正交坐标系,所有的坐标轴都是相互垂直的,这种坐标系处理起来也相对容易,而对于对称矩阵来说又有一个很好的性质:

6、对称矩阵的所有不同的特征值对应的特征向量互相垂直。

如之前学习特征值和特征向量时举过两个例子:

 

对于这两个变换它们所对应的两个特征向量都是互相垂直的,而对于图二来说是一个翻转变换,看它的矩阵是不是就是对称矩阵?所以就能找到相互垂直的特征向量,换句话说把这个矩阵进行对角化得到的矩阵P相应的每一个特征向量都是互相垂直的,矩阵P可以看作是一组正交基,进一步可以把这组基中每一向量都做归一化的处理,得到一组标准正交基,对于图一的投影变换由于木有求出来投影变换所对应的那个矩阵是什么样子,其实这个矩阵也是一个对称矩阵,这就是对称矩阵更加完美的地方,它不仅可以保证对称矩阵一定可以对角化,还保证了它所对应的每一个特征向量一定都是互相垂直的,换句话说,给它进行对角化,对角化后得到的矩阵P,在这个P矩阵所对应的坐标系下观察A这个矩阵本质就是D这个矩阵,P这个矩阵所表示的坐标系还是正交的坐标系,这样进一步研究A这个矩阵就更加的容易了。

下面来证明一下这个结论:

对称矩阵的所有不同的特征值对应的特征向量互相垂直。

证明:

假设矩阵A的两个特征向量v1,v2对应不同的特征值λ1、λ2,而要证明这俩向量垂直则需要证明:

而如果只从v1和v2点乘出发根本用不到λ1、λ2,所以可以加入一下λ1,将式子变为:

 

由于λ1是特征值,所以等于就是把v1这个向量伸缩λ1倍,向量的方向并不会改变,如果v1和v2是互相垂直的话,λ1v1点乘v2的结果也应该为0,而向量的点乘就是各个元素相乘再相加,这里将其转换为两个矩阵的运算,转换的结果其实就变成了:

这是因为向量都是按列排的,如果v1是一个有n个元素的向量,把它可以看成是一个nx1的矩阵,那么(λ1*v1)T转置其实就是一个1xn的矩阵,然后再乘以nx1的v2,两者相乘1x1的矩阵,也就是一个数,而为了表示v1和v2是两个矩阵相乘了,所以故意把它上面的那个小箭头去掉了:

而由于λ1是A的一个特征值,根据相关的定义:

式子就可以变为:

然后对于矩阵的转置又可以变为:

而又已知A是一个对称矩阵,所以它的转置就等于A,所以式子又可以写为:

然后再根据乘法的结合率,先来计算Av2,由于v2是A的一个特征向量,所以:

由于λ2是一个常数,所以将其提前为:

而:

相当于是一个1xn的矩阵点乘nx1的矩阵,而它的本质其实就是v1和v2向量之间的点乘,回忆一下向量之间的点乘法则:

所以式子就可以变化为:

此时都挪到等式左边,就有如下式子:

很显然前面的式子(λ1-λ2)是不可能为0的,只有可能是:

也就是v1向量是垂直于v2的,这样就得证了,一定要注意!!!这个矩阵A是一个对称矩阵,非对称矩阵是木有这个性质的。

既然对称矩阵的所有不同【注意它】的特征值对应的特征向量是互相垂直的,那相同特征值呢?很显然此时几何重数=代数重数,k重相同特征值的特征空间为k维,在一个k维的特征空间中很显然找到k个互相垂直的特征向量,所以:我们可以找到n个互相垂直的特征向量,可见对于对角矩阵是多么的完美~~

说了这么多下面再来总结一下对角矩阵的完美性:

1、对称矩阵一定可以被对角化,也就是有如下式子:

2、如果A是对称矩阵,对于上面对角化的式子又可以变为:

为啥可以用Q来表示呢?可以回忆一下https://www.cnblogs.com/webor2006/p/14376460.html

也就是字母Q可以表示一个标准正交矩阵,也就是这个矩阵按列看所有的向量都是互相垂直,与此同时它的模为1,而要让向量的模为1只需要将每一个特征向量标准化既可,这是因为在对角化的时候,其实对矩阵P(也就是矩阵Q)其实只关注它的方向,因为我们是把这个矩阵看作是一个坐标系,在这个坐标系下观察A矩阵和对角矩阵D是等同的,所以将P转换成标准坐标系Q是更加方便的,而根据标准正交的特性:

此时式子:

 

就不需要求矩阵的逆了,而是只要求它的转置既可,如下:

此时这个式子就叫正交对角化,其实正交对角化就是在对角化的基础上:

还保证了对角化后矩阵P它是一个标准正交矩阵Q,也就是对称矩阵是可以被正交对角化的,那么接下来证明这么一个结论:

对称矩阵一定可以被正交对角化:

其实也可以证明如果A可以被正交对角化,则A一定是对称矩阵

此时还是从这个式子出发证明:

对A进行转置:

再转变:

又可以变为:

很显然A的转置等于A说明A就是对称矩阵。所以如下等式就成立:

什么是奇异值【重点】:

在之前我们讨论的一切,都是基于方阵的,比如特征值、特征向量、相似型、对角化、对称矩阵、正交对角化。但是!!!实际很多时候处理的都是一个非方阵,就如上面所说到的对称矩阵它有如此完美的性质,再完美它所要求的条件也太苛刻了,不可能我们要处理的矩阵刚好是方阵还又是对称矩阵,那。。我们学了这么多完美的性质一切都是空谈,其实不是这样的,我们研究了对称矩阵这么多完美的特性,恰恰是因为对于每一个非方阵的矩阵我们都可以找到一个对称矩阵和它对应,那这个对称矩阵是如何构造的呢?看下面一个结论:

若A是一个m*n的矩阵,则:

是一个n*n的方阵,这是为啥呢?因为A的转置是n*m的矩阵,然后再和m*n,当然就是n*n的方阵喽,与此同时,该n*n的方阵还对称,也就是对称矩阵,那下面来看一下为啥它还对称呢?

对于这个矩阵:

第i行j列元素:就是从A的转置矩阵中的第i行点乘A的第j列,其实它就是A矩阵的第i列点乘A第j列。

第j行i列元素:A的转置矩阵中的第j行点乘A第j列,其实它就是A矩阵的第j列点乘A第i列。

由于向量的点乘具有交换律的,所以A矩阵的第i列点乘A第j列=A矩阵的第j列点乘A第i列,也就是说对于这个矩阵:

它的第i行j列元素是等于第j行i列元素的,所以就论证了该矩阵是对称的。

这样我们之前学习的所有关于对称矩阵的优美的性质在

这个矩阵上都是适用的,这就意味着它是可以被正交对角化的,拥有n个实数特征值:

n个互相垂直的标准特征向量:

也就是每一个向量的模为1,但是从这里开始,这里讨论的特征值和特征向量不再是矩阵A的了,因为现在讨论的A是一个一般的矩阵了(不一定是方阵),它不一定能求出特征值和特征向量,但是!!!

它是一个对称方阵,所以讨论的也都是这个方阵的特征值和特征向量,明白了这个之后,就要开始进行推导啦:

也就是求A矩阵和vi向量点乘的模的平方,其中要注意它:

它是指:

这个矩阵中的第i个特征向量。那为啥要看这么个平方呢?关于这块之后再说,总之是有意义的,那来看一下这个式子的演变,最终会有个神奇的式子:

然后将其转换成矩阵,如之前的:

关于这块不清楚的可以回忆上面的有详细说明,接下来再进行变换:

然后又用结合率:

而由于λi是(A的转置*A)的一个特征值,根据相关定义又可以变换为:

再继续往下变:

而由于vi是一个nx1的矩阵,所以vi的转置就是1xn的矩阵,再乘以nx1的矩阵,也就是1x1的矩阵是一个数,其实它就是:

而之前的已知前提条件为:

其中vi向量都是标准特征向量,它的模的平方很显然等于1,最后发现:

是不是很神奇~~

而:

 

本身是

的特征值和特征向量,但是这两者和A矩阵存在着这样的联系:A的转置乘以A,这个对称矩阵它的特征值可以写成是A的转置乘以A相应的那个特征向量被A去乘得到的结果向量它的模的平方就是这个λi,接下来就可以分析这个式子得出这么一个结论:

 

所以:

正因为λi是>=0了,此时终于可以绕回到这个小主题上来了,此时对于这个特征值进行开根号,可以表示为:

其中“σ”读“sigma西格马”,它就叫奇异值(Singular Value),那有啥意义呢?下面再来看一下:

 

奇异值的几何意义:

对于上面谈到的奇异值说实话有点云里雾里的,先来回忆一下关键点:

那为啥要研究:

因为这个向量本身是有意义的,它的意义为:

而由于:

而对于:

 

而基是不可能还有零向量的,因为一旦有零向量那么这组向量一定是线性相关的,也就不可能是正交基了,所以此时这句话还得增加一个条件:

换句话说就是矩阵A*所有对称矩阵的非0特征值所对应的那个特性向量相乘得到了一组向量,这组向量就可以用于描述A矩阵所描述的列空间。对于上面这句话分以下两个层面进行证明:

1、先来证明一下正交性:

其实也就是要证明:

为0,将其转换成矩阵:

再变:

此时又将矩阵转回到向量,如下:

而vi和vj是标准特征向量,而对称矩阵的特征向量是互相垂直的,所以:

此时就说明这两个向量是正交的。

2、再来证明:

由于:

所以vi这一组向量是两两互相垂直的标准正交基,而这组标准正交基有n个,所以有:

换言之,在空间中任意拿出一个向量x,都能表示出这组基的线性组合,如下:

而我们研究的是A的列空间,假设A的列空间的向量为y,就有:

其中A矩阵是mxn的,而x向量是有n个元素,两者是可以相乘的,得到的结果向量是m维的向量,就是y向量,而由于:

所以式子又可以变为:

而k都是实数,将其提前为:

其中要注意Avi这一组向量它们不一定两两线性无关的,关键在于有一些Avi的模有可能为0,因为当vi这个特征向量λi为0时:

如果把这些有可能为0的向量给刨去的话,剩下的Avi一定是两两线性无关的,因为这些向量是两两正交两两垂直的,当然是线性无关喽,所以为了严谨起见,下面再假设一下,假设:

 这个矩阵的所有的特征值中,有r个非0的特征值,这些为0的特征值对应的avi一定是等于零向量,因为:

所以可以进一步变换为:

对于λi!=0的那些Avi,它们的线性组合就可以表示A这个列空间的任意一个向量y,所以这也就证明了:

这里一下强调λi不能为0,其中也就是奇异值为0,回忆一下:

所以如果A的r个不为零的奇异值的话【注意奇异值是跟矩阵A对应的,而λi是跟对应的】,也可以说如果有r个不为零的特征值,那么:

进一步的可以说明:

而奇异值本身就是Avi这个向量对应的长度,所以:

对于这一组向量其实也把σi=0的奇异值给扔掉了,所以通常在做这个处理时求出矩阵A所对应的奇异值后,会先把奇异值从大到小排序一下,这样排序之后所有等于0的奇异值自然就在最后了,把后面的尾巴给扔掉就好了,前面有r个奇异值,对于这r个奇异值都对应的一个Avi这个向量,所以:

而通常又记作ui向量:

奇异值的SVD分解:

有了前面的铺垫之后,就可以学习线性代数大名鼎鼎的SVD分解(Singular Value Decomposition奇异值分解)了,那为啥SVD这么有名呢?这是因为它对任意形状的矩阵都适用,回忆一个之前学过的LU分解和QR分解,这些分解方式都是有一些限制的,那什么是SVD分解呢?

其中∑读作sigma(西格马)。

也就是把任意一个矩阵A分解成了三部分,关于这三部分从下面三个层面来理解:

矩阵的形状:

如果A是m*n的矩阵,按照SVD分解的情况就是:

U是m*m的矩阵;∑是m*n的矩阵;V是n*n的矩阵;

而U*∑*V的转置就是m*n的A矩阵的样子,

三部分的含义:

V是的特征向量矩阵进行标准化,也就是标准正交矩阵,而在SVD中的V是取它的转置其实就是V的逆;

U是m*m的矩阵,如下:

 

前r个u,注意:

这里要注意了,这里只有r个u,这个r数字一定是小于等于m,也小于等于n的,因为矩阵A是一个m*n的矩阵,这是为啥呢?这是因为前r个u都不是零向量,它们就组成了A的列空间的一组标准正交基,也就是r这个数是矩阵A的秩,当然这个小r一定是<=m和<=n的,因为一个矩阵中的秩个数一定是小于等于矩阵行列的最小值,这里只要知道r<=m既可,那将这m个u都放到U矩阵的最前面,而对于ui向量它是有多少个元素呢?答案是它有m个元素,这是因为:

而A矩阵是m*n的,所以两者相乘就是ui向量是含有m个元素,但是!!!我们只有r个u,虽说它是A的列空间的一组基,但是肯定不是m维空间的一组基,因为r的个数要比m小,换言之A的列空间是A的子空间,那对于U怎么来做这么一个方阵呢?因为U是m*m的矩阵,其实也很简单,此时就需要使用之前https://www.cnblogs.com/webor2006/p/14376460.html学习的Gram-Schmidt过程,回忆一下:

就可以不断求和这r个向量也互相垂直的标准向量,得到r+1个向量,再求和r+1个向量也垂直的正交向量,得到r+2个向量,以此类推,直到提到这m维的一组标准正交基,得到m个u,然后将其填充到U这个矩阵上,这要就构建出来m*m的标准正交矩阵U了。不过对于m-r个u向量在后面可以发现其实没有作用的,不过现在不用管这么多,知道怎么构造U矩阵既可。

所以U和V都是标准正交矩阵。

最后看一下∑,它是m*n的矩阵,其实形态是:

由于有r个奇异值,可能矩阵塞不满则填0:

也就是左上角的就是对角矩阵,其对角元素都是矩阵A所对应的r个非0的奇异值,是一个rxr的奇异矩阵,当然和前面码放U矩阵一样每一个ui相对应的。

证明:

接下来就是来证明为啥这等式成立:

其实跟之前https://www.cnblogs.com/webor2006/p/14395361.html证明矩阵的对角化一样:

将V的转置也化简一下,由于“V是的特征向量矩阵进行标准化,也就是标准正交矩阵”,所以V的转置其实也就是V的逆,所以就可以变为:

也就是只要证明上面这个等式成立既可,由于:

所以等式左边就为:

而由于:

所以:

由于这里只有r个u,这个r数字一定是小于等于m,也小于等于n的,所以结尾都是0。

接下来看一下等号右侧的式子变形:

这里可以用矩阵乘法的列视角:

前面矩阵取出一列,后面矩阵取出一行,得到的结果其实就是等号左侧的转换结果:

所以:

就得证了,它一得证,它也就得证了:

算法求解过程:

接下来则来看一下,如果给了一个矩阵A,如何求解它的SVD分解:

1、求解的特征值和特征向量。

2、得到非零的特征值开根后(奇异值)得到m*n的,其中码的时候是按奇异值从大到小排序,这样就把0的奇异值就放到了最后。

3、接下来将特征向量标准化后得到n*n的V【标准正交矩阵】,其中按列码的顺序要和奇异值的顺序是相对应的,因为每一个奇异值对应了一个特征值,而每一个特征值对应着一个特征向量。

4、准备U如下:

其中每一个u向量为:

由于只有r个奇异值,最后则需要再经过Gram-Schmidt过程扩展得到m*m的U。

5、最后再来计算如下式子,整个SVD分解就搞定:

注意:V矩阵是要取它的转置的。

实践Scipy中的SVD分解:

接下来则回到Python的世界中来实现SVD的分解,同样是用numpy库来实现,其中Scipy库就可以满足咱们的要求。

新建文件:

用例一:

接下来使用库来实现SVD相当之容易,直接调用个函数既可,如下:

因为这个s是一个包含了所有奇异值的向量,并没有给咱们封装成像这样的矩阵的样子:

这个矩阵通过奇异值也比较好转换。下面来验证一下该分解是否是正确的,直接进行乘法既可,首先先来封装一下奇异值矩阵:

接下来用这个式子来验证一下咱们求解SVD分解是否正确:

SVD分解的应用:

目前已经对于SVD分解的求解过程了解了,那SVD学了实际有啥用处呢? 接下来就以应用的角度再来加深对SVD的认知,由于矩阵的SVD分解应用非常之广泛,这里只推导SVD分解的两个应用。 

把矩阵A看作是一个变换:

如果把矩阵A看成是一个变换的话,对于分成三部分有啥意义呢?在这里如果A是一个m*n的矩阵,其实A是一个n维向量做变换,根据矩阵x向量的法则,因为A是n列,所以它只有乘以n维的向量,而得到的结果是一个m维的向量,简言之,A这个矩阵就是把一个n维的向量转换成m维的向量。

而V矩阵是n维空间的一个标准正交基,这是因为V这个矩阵本身就 是的特征向量矩阵进行标准化,也就是标准正交矩阵,这个矩阵的n个向量一定是互相垂直的,所以它是n维空间的一个标准正交基,这样一来,我们在n维空间中的任何一个向量x都可以写成:

然后将它整体成矩阵相乘的形式就为:

这里来看一下,如果A是一个变换,任何一个x向量通过A的变换之后得到的结果就是:

然后SVD的等式就可以变化为:

 

而:

所以式子又可以变为:

而V的转置乘以V就等于单位矩阵,所以式子进一步变为:

其中∑它是一个类似于对角矩阵:

所以式子又可以化为:

将它跟这个式子放一起总结特点:

非常的像呀,区别在哪呢?

好,总结了两者的区别之后,接下来就可以这样解读了:

经过A转换之后,我们可以这样看待A转换后的x向量:

此时就可以用这样的视角来看待A这个变换,这个视角其实是非常简单的,如果只用矩阵的乘法的视角来看这个变换是个极其扭曲的变换,但是其实从U坐标系的视角来看的话,它的本质就是在U这个坐标系下,相应的每一个维度的值是原来在V坐标系下每一个维度的值再拉伸σ奇异值倍,这也是当把A看成一个变换之后的一个应用,用图来更形象的理解的话:

这个A是一个2x2的矩阵,原来在看待x所有的向量都是在V这个坐标系下看待的,假设有一系列的点,最终形成了一个圆,而A这个变换经过了SVD分解之后,这个圆就变成了一个椭圆:

 

而这个椭圆的长轴和短轴和原来不一样了:

其实这个椭圆的长轴和短轴是新的u的方向,与此同时这个长轴和短轴的长度是多少呢?其实这个长度就是被奇异值所表示的,也就是A这个变换被放到了u坐标系下看,与此同时每个坐标系下维度的值是在原来v这个坐标系下维度的值再拉伸奇异值这么多倍,这就是用SVD的视角可以更加简单的来看A这个变换的一种方式。

把矩阵A看作是一片数据:

这个是在机器学习领域更常用, 在这里如果A是一个m*n的矩阵,对于SVD的式子展开:

 

而U∑又可以化为:

又根据矩阵乘法的列视角可以化为:

其中等式右边的u和v都是二维的矩阵,u是mx1的矩阵,而v是nx1的矩阵,所以它的转置就是1xn的矩阵,所以标红的两者相乘就是一个mxn的矩阵,所以对于矩阵A:

可以看成是r个mxn的矩阵相加的结果,由于在奇异值分解时已经将奇异值按从大到小进行排列了:

所以可以理解这些奇异值是一些权值,也就是把矩阵A可以看成是一系列mxn的矩阵相加 ,每一个mxn的矩阵都有一个不同的权值,第一个权值σ1最大,第二个权值σ2其次,以此类推,最后一个mxn的权值由σr来表示,当然之后还有mxn的矩阵,但是呢它们的权值都为0所以被消去了,好,从这个视角看,很自然地就可以想像,是不是不仅可以把奇异值为0的mxn的矩阵给拿掉,也可以把那些奇异值比较小的矩阵也给拿掉,相应的对于A数据来说它的改动并不是很大,这样一来,其实从某种层度上来看就做到了对A 这个数据进行压缩、去噪、降维【因为A是一个二维的数据,拿掉更多的项就可以理解为对A这片数据进行的降维】,这就是SVD的另一个应用的代表。

这个应用可以非常好的直接应用于图像领域, 如果A这个矩阵表示的是一个高为m,宽为n的图像的话,经过对A进行SVD分解之后,再把分解结果的奇异值比较小的项给扔掉的话,剩下的这些项依然可以比较好的表达图像的意义【也就是从肉眼角度还是能看懂图像的意思是什么】,但是表征这个图像所对应的数据量存储空间都变低了, 这是SVD分解的一个非常酷的应用。 

其它应用:

其实SVD分解还有更多的应用,这里简述一下:

  • 定义伪逆:
    我们知道逆矩阵只有方阵才能满足,但是!!!对于非方阵来说可以定义一个伪逆,所谓的伪逆就是它的性质和逆非常的像,在非方阵的基础上我们可以用伪逆来代替逆,而伪逆的数学定义的依据也是跟矩阵的SVD分解有关的。
  • 推荐系统
  • 自然语言处理
  • 搜索引擎
  • ....
原文地址:https://www.cnblogs.com/webor2006/p/14406014.html