SVD分解就是一种矩阵拆解术,它能够把任意矩阵$A \in \mathbb{R}^{m \times n}$拆解成3个矩阵的乘积形式,即:
其中,$U \in \mathbb{R}^{m \times m}$,$V \in \mathbb{R}^{n \times n}$都是正交矩阵,即列向量是正交的单位向量,$\Sigma \in \mathbb{R}^{m \times n}$的对角阵(奇异值)。搬运了来自MIT OpenCourseWare的在线课程并放在了B站,讲解得很清晰。
刚才说了矩阵$U, \Sigma, V$的形式,视频中还提到了这三个矩阵的物理意义,即SVD分解可以理解为:任意矩阵都可以分解为(rotation)*(Stretch)*(rotation)的形式。接下来说明一下这三个矩阵是如何来的。
计算 $A^TA$
可见,$V$正是矩阵$A^TA$的特征向量,而${\Sigma}^T \Sigma $为矩阵$A^TA$的特征值。
计算 $AA^T$
可见,$U$正是矩阵$AA^T$的特征向量,而$\Sigma {\Sigma}^T $为矩阵$AA^T$的特征值。
所以$U, \Sigma, V$都可以通过上述方式来计算。
降维
其中${\sigma}_1 \geq {\sigma}_2 \geq … {\sigma}_k > 0 $,将$\Sigma$中主对角线为0的部分删去,同样的$U,V$对应的部分删去,SVD分解就变成了下图的形式。
实战
数字例子
有矩阵A,对其进行SVD分解,已知:
计算$A^TA$以及$AA^T$:
对以上两式做特征值分解得到:
1 | V = |
奇异值$\Sigma ^T \Sigma = \text{Diag}(238.2878, 37.3715, 12.3407) \Rightarrow \Sigma = \text{Diag}(15.4366, 6.1132, 3.5129)$
这与直接调用svd(A)
结果是一致的(可能差个正负号)。
图像处理
祭上亲爱的Battle Angel Alita。
原始图像尺寸$1440\times 2560 $,我们可以对该图像做SVD分解,然后仅保留奇异值的前10,50,100重构图像,比较重构图像与原始图像的质量差异。可见仅仅保留其前10个奇异值时,图像质量遭到了极大破坏(此时仅保留原始图像信息的58.864%),随着奇异值数量的增多,图像质量也会逐渐提升,可以看到当奇异值个数为100时,基本上已经看不出与原图的差异(此时仅保留原始图像信息的87.37%)。由此,我们实现了图像压缩。
下图是保留的奇异值数量与图像质量的关系图,保留的奇异值越多,图像质量越高,图像压缩效果越不明显;反之,奇异值越少,图像质量越差,图像压缩效果越明显。这只是一种非常简单的图像压缩算法,仅作原理验证使用,在实际中用到的概率不是很大。
代码
1 | %% simple test of using SVD decomposistion |