GAMES001课程笔记04-奇异值分解与主成分分析
这个系列是GAMES001-图形学中的数学(GAMES 001: Mathematics in Computer Graphics)的同步课程笔记。课程旨在总结归纳图形学学习过程中重要的数学概念、理论和方法,并将以索引的形式在每一章节中穿插讲解该数学专题在图形学中的应用。本课程既可以作为GAMES系列其它课程学习的基础或「手册」,也可以作为站在不一样的视角复习图形学知识的平台。本节主要介绍奇异值分解与主成分分析的相关内容。
奇异值分解
矩阵有很多不同的理解方式。在前面的课程中我们提到过矩阵可以理解为一种线性变换,除此之外矩阵还可以表示一张图片或是点云这种几何数据。因此我们可以从不同的视角来理解矩阵变换的各种意义。

奇异值分解(singular value decomposition, SVD)是一种对矩阵进行分析和处理的重要计算工具,它在数学和整个计算机科学领域都有着大量的应用。

实对称矩阵
我们从实对称矩阵出发。根据线性代数相关理论,实对称矩阵具有如下重要性质:
- 实对称矩阵的特征值都是实数。
- 实对称矩阵不同特征值的特征向量相互正交。

在此基础上我们可以得到实对称矩阵的特征值分解:
其中,特征值
如果
显然它满足
此外,容易验证实对称矩阵的迹等于其特征值之和:

奇异值分解
对于一个更一般的矩阵
显然
两边同时乘以特征向量
接下来定义向量
通过Schmidt正交化可以分别对
这样两组基的关系写成矩阵形式有:
其中,

上面的推导即为矩阵的奇异值分解,其更常见的形式为:
其中,矩阵

矩阵的奇异值分解是线性代数中的重要概念。当矩阵的奇异值分解已知时,我们可以快速地求解矩阵相关的各种问题。

矩阵的逆与SVD
对于一个可逆矩阵

列满秩
对于非方阵的情况,我们可以推广逆阵的概念从而得到矩阵的伪逆。假设矩阵
由于方程数大于未知量的个数,它的解可能是不存在的。此时我们可以转而寻找它在最小二乘意义下的解,这样构造最小二乘的优化目标:

利用SVD可以对优化目标进行变形:
然后通过换元
由于
也即
其中
其中的系数矩阵


除了上面的方法,我们还可以直接对最小二乘的优化目标进行求导来得到伪逆。此时可以得到矩阵方程:
假设
其中的系数矩阵


行满秩
另一种可能出现的情况是矩阵
上式的意义在于寻找满足约束

通过SVD分解,可以得到新的优化目标的解同样是伪逆:

当然,我们同样可以通过优化的方法来求解这个欠定方程组。此时可以得到矩阵

简单总结一下:
- 当矩阵
是列满秩时,其左逆 存在,可以用来求解超定方程。 - 当矩阵
是行满秩时,其右逆 存在,可以用来求解欠定方程。 - 任何情况下,矩阵的伪逆
都一定存在。

几何变换
从几何变换的角度来看,SVD分解说明一个线性变换可以分解为两次旋转加上一次拉伸缩放。

除了SVD外,任意实方阵
极分解可以通过SVD来显式构造得到:

形状匹配
SVD在图形学中的一个经典应用是形状匹配(shape matching),它的目标是寻找一个刚体变换使得形状

这个优化问题可以利用SVD来进行求解。首先假设旋转
取质点集合变形前后的质心分别为

接下来考虑求解旋转
记中心化后的坐标分别为

将上式展开并且只考虑关于旋转
利用矩阵迹的性质继续进行变形:
记求和号内的矩阵为

此时旋转矩阵


总结一下,形状匹配算法的流程如下:
- 计算两组质点的质心并分别进行中心化
、 。 - 构造矩阵
,并对其进行分解 。 - 计算最优旋转
。 - 计算相对位移
。
实际上上述形状匹配算法即为点云匹配中经典的ICP算法。

图像压缩
SVD的一个重要应用是对图像进行压缩。我们可以把一幅图像看作是一个大型稠密矩阵,根据SVD的形式把它写成一系列秩为1的矩阵之和:

对于通常的图像,其奇异值的大小往往只几种在前若干阶上。随着奇异值数量的增加,奇异值的大小一般会显著减少。因此,我们可以只考虑那些奇异值比较大的特征向量来重建原始的图像。这样可以显著减少存储所需要的空间。


实际上前面叙述的对矩阵进行低秩重建的思想在如今火热的大模型领域也有着重要的应用。

SVD求导
除此之外,SVD实际上还是可导的运算。在很多应用中涉及到对SVD进行求导。

然而遗憾的是,SVD的求导一般是比较难处理的。

一般来说,SVD的复杂度还是比较高的。好在目前绝大多数的数值计算库中都有比较好的实现,在实际工程中一般不会需要从头进行编程。

主成分分析
主成分分析(principal component analysis, PCA)是SVD的一个经典应用。PCA的一大作用是对高维的数据进行降维,使得我们可以在相对低维的空间来分析它们。

从几何的角度来看,PCA的目标是寻找到数据分布的主方向
其中
最小化
其中,


显然,方差矩阵
其中,
显然,当

找到主方向并完成投影后,我们可以对剩下的分量继续寻找主方向。实际上这些分量的主方向对应着方差矩阵

总结一下,

应用
我们可以利用PCA来计算点云的法向。此时对于点云中的每个点我们需要提取它和它附近的一些样本点组成数据集,然后在这个数据集上计算三个主方向就能够得到该点的法向。

在人脸识别领域,PCA的一个经典案例是eigenface。我们可以对人脸图像数据使用PCA进行降维,然后提取特征值大的那些特征向量组成人脸数据的特征脸。

在数值模拟中,我们也可以利用PCA来对模型进行降阶从而降低仿真的计算量。

最后需要说明的是PCA本质上是一种线性降维方法,对于非线性的数据PCA可能不会得到特别好的效果。

要处理高度非线性的数据可以考虑kernel PCA或是自编码器这样的方法。
