(文章有的地方会乱码。。。刷新几遍就行了)
矩阵分解的用途非常广泛,比较常用的有接下来主要讲到的奇异值分解 (Singular Value Decomposition 以下简称 SVD分解),Schur分解,特征值分解(对于可对角化矩阵而言),Jordan分解(对于不可对角化矩阵而言)等等。矩阵分解的目的很明确,一方面是为了“打开”矩阵,使得矩阵的信息更加一目了然,比如将一个矩阵进行SVD分解后我们就能知道了矩阵的秩,范数(2-范数,F-范数等等)和矩阵条件数等等;另一方面是为了方便对矩阵进行计算,比如解线性方程组,线性最小二乘问题等等。接下来我们仔细讲解矩阵的SVD分解。
矩阵的SVD分解定理:对于任意矩阵
![]()
, 存在酉阵
![]()
使得
其中
![]()
,并且
![]()
,
![]()
,
其中
![]()
被称作
![]()
的
奇异值.
注:
无论是
![]()
还是
矩阵奇异值的个数都是是等于其行数。
若所遇到的矩阵是实矩阵,则上述所有矩阵的共轭转置等价为转置,即
![]()
.
若
![]()
,则
![]()
,其中
![]()
.
接下来我们主要讨论
![]()
的情况,其结论可以轻易的推广至
![]()
的情况。
若记
![]()
则
其中
![]()
分别被称为奇异值
![]()
对应的
左奇异向量和右奇异向量或统称为
奇异向量。
几何意义:SVD分解的几何意义是任何一个矩阵
![]()
在一系列旋转和平移下都能转化成一个对角矩阵
![]()
, 其中酉阵
![]()
的几何意义就是一系列旋转和平移的叠加。另外,奇异值的几何意义是:矩阵
![]()
将向量空间
![]()
中的单位球(半径为1),映射为一个椭球体,椭球的每个轴的长度就是每个奇异值的大小。例如,在二维平面
![]()
中:下左图是一个半径为1的球,下右图是椭圆长轴长度是
![]()
, 短轴长度是
![]()
(由于
![]()
是个二维变换,即使说
![]()
, 所以只有两个奇异值)。
此外,我们可以用
![]()
的最大奇异值
![]()
来定义矩阵的2-范数:
![]()
。 也就是说对于任意一个单位向量
![]()
, 在
![]()
的作用下得到的向量
![]()
所能达到的最大长度是
![]()
。
奇异值与特征值之间的关系:矩阵的特征值与奇异值之间存在着千丝万缕的关系,但是两者并不完全相同。
1,只有方矩阵才有特征值与特征向量,但是任意一个矩阵都有奇异值与奇异向量。
2,矩阵的特征值有可能是是复数(即使是实数矩阵,其特征值也有可能是复数),但是矩阵的奇异值一定是非负实数(即使矩阵是复数矩阵,其奇异值也一定是非负实数)。
3,矩阵
![]()
的奇异值
![]()
是
![]()
特征值的算术平方根,同时
![]()
是矩阵
![]()
的所有特征值的算术平方根。
4,对于一个方矩阵
![]()
来说,它的任意一个特征值
![]()
与其奇异值之间有下面关系
5,当矩阵是对称(或Hermite)半正定(或正定)时,矩阵的奇异值和奇异向量就是矩阵的特征值与特征向量。一般情况下,此结论不成立。
等等。。。
稳定性: 在实际使用计算机计算时,SVD分解在数值计算上是很稳定的,这是因为SVD分解是对
![]()
进行一系列正交变换(旋转和平移就是正交变换),而正交变换在实际计算中是很稳定的(这是因为正交矩阵的条件数(酉不变范数下)都是1),例如:对于一个真实数据
![]()
和扰动后的矩阵
![]()
, 其中
![]()
是误差(存储数据和对数据进行计算时都会使真实数据产生误差, 这一误差可以在某种程度上减弱,但很难彻底消除),则有下面的式子成立:
其中,
![]()
是
![]()
奇异值,也就是说,只要误差足够小我们算出的奇异值就会足够靠近真实矩阵的奇异值,而特征值一般是不具有的这么良好的稳定性,也就是说,即使
![]()
很小,
![]()
的特征值有可能和
![]()
的特征值相差很大,例如
不难看出
![]()
的两个特征值都是1,而我们只在
![]()
的左下角的分量添加了一个很小的扰动
![]()
, 但是
![]()
的特征值是 1.223606797749979 和 0.776393202250021,与 1 相差太大,根本达不到一般情况下我们所要求的精度。但是
![]()
两个奇异值是:50000.00002和0.000020
![]()
两个奇异值是:50000.00002和0.000019
几乎相差无几。也正是因为SVD分解的数值稳定性,才使得其有很多广泛的应用。
秩:由于
![]()
均是可逆矩阵(酉阵一定可逆), 所以
![]()
, 所以
![]()
中非零奇异值的个数就是矩阵的秩,这就是计算机判断矩阵秩的常用办法。
我们假设:
![]()
, 即
![]()
, 于是
![]()
, 所以通过矩阵的分块我们有
其中
![]()
是我们在实际生活中经常用到的,被称作
经济型SVD分解。并且不难证明
![]()
的值域等于
![]()
的值域,
![]()
的核空间(零空间)等于
![]()
的值域,即
![]()
。
另外,对于给定的一个矩阵
![]()
,我们想要找一个秩等于(或小于)
![]()
(可以是给定的小于等于
![]()
的正整数)的矩阵
![]()
使得
![]()
和
![]()
“距离”最小,那么我们该如何选取
![]()
?首先我们要明确“距离”这一个概念,刻画矩阵之间的“距离”所用到的工具是范数(可以是任意一种范数),即是当
![]()
很小时,我们认为
![]()
之间的“距离”很小。其次我们有对任意一种酉不变范数
![]()
(常见的有2-范数和F-范数),有下面结论成立
其中
![]()
。
![]()
被称为
![]()
的
最佳值
近似, 如果
![]()
则解
![]()
唯一,若
![]()
,则解
![]()
不唯一。
注意,上述结果仅适用于酉不变范数,而且对于不同的酉不变范数,
也不一定相同等。例如,当上述范数为2-范数时
当上述范数为F-范数时
![]()
.
所以,我们有时可以用
![]()
去近似
![]()
。可以看出
对于一个矩阵
来说,它的主要信息包含在大奇异值和其所对应的左右奇异向量中。
另外,我们也可以看出最小奇异值
![]()
的另一个几何意义:将所有
非列满秩矩阵看做一个集合
![]()
,则
表示的是
到集合
的距离:
![]()
。若
![]()
,则
![]()
不是列满秩矩阵。
范数:利用奇异值我们可以定义更多的矩阵的酉不变范数,例如,定义如下范数
是一类酉不变范数。
当
![]()
时被称为
能量范数, 通常记为
![]()
于是
当
![]()
时就是我们常见的F-范数 ,
当
![]()
时就是我们常见的2-范数 ,
![]()
。
能量范数通常被应用在图能量的计算上。
Moore-Penrose 广义逆:Moore-Penrose 广义逆是对矩阵逆的概念的一种推广,一般来时只有可逆矩阵
![]()
才具有逆矩阵
![]()
,
而对任意矩阵来说都存在Moore-Penrose 广义逆,无论矩阵是否可逆,是否是方矩阵。Moore-Penrose 广义逆定义如下:
Moore-Penrose 广义逆定义:对于一个矩阵
![]()
, 若矩阵
![]()
,满足以下四条:
则称
![]()
是
![]()
的
Moore-Penrose 广义逆, 记做
![]()
。
注:Moore-Penrose 广义逆有时也被称作伪逆。
除了Moore-Penrose 广义逆外,还有其他的矩阵广义逆的定义,例如:如果
![]()
只满足条件
![]()
,则
![]()
被称作1-(广义)逆, 记做
![]()
或
![]()
, 如果
![]()
只满足条件
![]()
,则称之为1,2,4-(广义)逆,记做
![]()
。 诸如此类,我们可以定义更多的矩阵广义逆,但这些广义逆大都不唯一(像前面提到的1-逆,和1,2,4-逆都是不唯一的)。但是,
当且仅当上述四个条件都成立时,
才被称作Moore-Penrose 广义逆,并且一个矩阵的Moore-Penrose 广义逆是唯一的。
利用SVD分解可以很好地定义并计算矩阵的Moore-Penrose广义逆。不难看出:
![]()
是满足上面的四个条件的。由于Moore-Penrose 广义逆的唯一性,所以在实际计算中我们通常利用SVD分解来计算一个矩阵的广义逆。
此外,我们也可以利用SVD分解定义上面所提到的1-逆:
其中
![]()
是任意矩阵,易证上面定义的
![]()
满足条件
![]()
, 下面我们定义1,2,4-逆
易证上面定义的
![]()
满足条件
![]()
。诸如此类,我们可以定义矩阵的其他的广义逆。
极分解:根据矩阵的SVD分解,可以很容易得到矩阵的极分解。
定理:对于任意一个矩阵
![]()
都存在
极分解:
其中
![]()
是酉阵,
![]()
是Hermite 半正定矩阵。
容易看出:
![]()
, 于是,可令
![]()
。
下面简单说一说SVD分解的具体应用。
应用一:截断SVD分解(tSVD): 如果存在
![]()
,使得
![]()
,此时我们认为此
矩阵的奇异值耗散很快,根据最佳值k近似可以看出,此时可以用
![]()
近似
![]()
,将
![]()
和其对应的左右奇异向量扔去, 这一近似的误差和
![]()
是一个量级的。这一过程叫做
截断SVD(tSVD),这一过程保留的原矩阵的大部分信息。甚至有时数据经过这种的处理会变得更好,这是因为很小的奇异值和其左右奇异向量往往对应的是数据的“噪声”,这种tSVD分解的操作反而起到了去噪的作用,使得我们的数据更加“纯洁”。
这一做法只对奇异值耗散很快的矩阵有效,但是如果矩阵的奇异值耗散并不是很快,则tSVD分解的近似并不会很好。
应用二:求插积矩阵特征值与特征向量: 此外我们可以得到:
![]()
, 所以
![]()
恰好是矩阵
![]()
的特征值与特征向量,
![]()
和
![]()
恰好是
![]()
的特征值,
![]()
是其特征向量,其中
![]()
,
![]()
。于是在一些实际情况中我们会遇到求解插积矩阵
![]()
(或
![]()
)的特征值和特征向量时,我们大可不必在计算机上算出矩阵
![]()
,然后再求其特征值与特征向量,这是因为计算机的浮点误差会导致计算得到的
![]()
丢掉一部分信息。例如
如果
![]()
, 则计算机会认为
![]()
是0,即使说计算机会认为
![]()
是一个不可逆矩阵,这其实是不准确的。此外,计算插积矩阵除了会丢失精度外,还会增加不必要的计算和存储量,例如假设
![]()
是一个稀疏矩阵(非零分量占到全部分量的
![]()
以下),但是仅仅计算
![]()
所需要的计算量大概是
![]()
, 而
![]()
也极有可能变成一个稠密矩阵,会占大量的储存量。如果
![]()
的维数又很大(
![]()
很大),那么最终我们所面临的将是求一个大型稠密矩阵的特征值,这一工作量(大概是
![]()
)将会远远大于计算
![]()
的工作量,并且精度不会很高。所以无论从哪一方面看,这一方法都是不可取的。因此,我们只需要对
![]()
进行SVD分解即可,由于只需要
![]()
的特征值与特征向量,所以我们只需要计算
![]()
,而这一工作量大概只有
![]()
,这一工作量大概是计算
![]()
的工作量的两倍多一点,但是我们已经得到了我们想要的特征值与特征向量,并且节约了大量的存储。
SVD分解相关MATLAB代码:
—————————————————分割线——————————————————
以下是提供给具有一定的泛函分析基础(了解 Hilbert 空间和紧自伴算子及其谱分解概念)的读者阅读。。。。
从更广义的观点来看,矩阵
![]()
本质上是一个(有限维)算子(将
![]()
映射到
![]()
),而欧式空间
![]()
可以看做是(有限维)Hilbert 空间。接下来我们就将有限维的SVD分解定理推广到无穷维空间上去。
先交代几个记号:
![]()
是两个Hilbert 空间,
![]()
表示从
![]()
到
![]()
上的所有有界线性算子构成的空间。
Hilbert 空间上的SVD分解:令
![]()
是一个紧算子,
![]()
表示投影到
![]()
的正交投影算子,则存在
奇异值
![]()
和
标准正交系统
![]()
和
![]()
使得对
![]()
有
并且
(
![]()
)被称作
![]()
的
奇异系统。
如果
![]()
,则上面两个式子中的求和只有有限项。对于
![]()
, 我们令
![]()
。
奇异值
![]()
被算子
![]()
唯一决定
![]()
。并且
~~~~~关于矩阵奇异值分解的理论非常丰富,考虑到受众大小,和本人水平有限,就先写到这儿吧。
时间仓促,本人水平有限,难免有不准确之处,望读者批评指正