SVD的理论基础
本文从理论基础的角度梳理对SVD的理解,不涉及SVD的实现算法。若有不准确的地方,请指正。转载请注明出处。
下面是两篇介绍SVD基础的非常不错的文章,本文的一些思路参考了它们:
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
http://www.ams.org/samplings/feature-column/fcarc-svd
一、方矩阵的特征值分解
对于一个 $n$ 阶非奇异方矩阵 $\mathrm A$,存在 $n$ 个特征值 $(\lambda_1, \lambda_2, \dots, \lambda_n)$。如果这些特征值互不相等,则存在 $n$ 个线性无关的特征向量 $(\boldsymbol{p_1}, \boldsymbol{p_2}, \dots, \boldsymbol{p_n})$,其对应关系为:
\begin{equation} \mathrm A p_i = \lambda_i \boldsymbol p_i. \label{ageineq}\end{equation}
把所有这些特征向量组成一个 $n$ 阶矩阵 $\mathrm P$,所有这些特征值组成 $n$ 阶对角矩阵 $\Lambda$,即:
\begin{aligned} P & = (\boldsymbol p_1, \boldsymbol p_2, \dots, \boldsymbol p_n), \\ \Lambda & = \mathrm{diag}(\lambda_1, \lambda_2, \dots, \lambda_n). \end{aligned}
则这 $n$ 个特征方程 \eqref{ageineq} 可以表示为:
\begin{aligned} \mathrm{AP} = \mathrm{P \Lambda}. \end{aligned}
因为 $n$ 个特征向量 $\boldsymbol p_i$ 是线性无关的,则矩阵 $P$ 可逆。由上面的方程即可得到:
\begin{equation} \mathrm A = \mathrm{P \Lambda} \mathrm P^{-1}. \end{equation}
这就是非奇异矩阵的特征值分解。也许写成分量的形式,更能体现出“分解”的含义,我们把 $\mathrm P$ 的逆矩阵写成行向量的形式 $\mathrm P^{-1} = (\boldsymbol{q}_1, \boldsymbol{q}_2, \dots, \boldsymbol{q}_n)^\mathrm T$,行向量 $\boldsymbol{q}_i$ 是矩阵 $\mathrm P^{-1}$ 的低 $i$ 行。这样,上面的方程可以写为:
\begin{eqnarray} \mathrm A = \sum_{i = 1}^{n} \lambda_i \boldsymbol{p}_i \boldsymbol{q}_i^{\mathrm T}. \end{eqnarray}
这样,矩阵 $\mathrm A$ 被分解成了向量 $\boldsymbol p_i$ 与 $\boldsymbol q_i^{\mathrm T}$ 的乘积的和,对应的特征值 $\lambda_i$ 是每一项的系数。对于矩阵 $\mathrm A$ 是对称矩阵的情况,其特征向量是正交的,所以 $\mathrm P$ 是正交矩阵,有 $\mathrm P^{-1} = \mathrm P^\mathrm T$,这样上式中的 $\boldsymbol q_i = \boldsymbol p_i$ 。所以对称矩阵可以由它的特征向量来分解。
二、奇异值分解
非方阵没有特征值和特征向量,不存在上面那样的特征值分解,但是可以做类似的奇异值分解。
一个$m\times n$阶矩阵 $A$ 可以看做对空间的一种线性变换,$\boldsymbol{Aa = b}$,把一个 $n$ 维空间中的向量 $A$ 变换成M维空间的向量 $\boldsymbol b$。从变换前后的两个空间的正交基矢可以方便看出变换的效果。变换A在某些方向上的变换最强,在另一些方向上的变换最弱,我们选择这样的方向作为基矢。后面可以看到,这些基矢正是 $A^{\mathrm T} A$ 的特征向量。
1、奇异值与奇异向量
矩阵 $A^{\mathrm T} A$ 是 $n$ 阶的,记其 $n$ 个特征值(假设不相同)为 $(\sigma^2_1, \sigma^2_2, \dots, \sigma^2_n)$。因为 $A^{\mathrm T} A$ 是对称矩阵,假设这些特征值各不相同,则存在 $n$ 个互相正交的特征向量 $(\boldsymbol v_1, \boldsymbol v_2, \dots, \boldsymbol v_n)$,
\begin{equation} (A^{\boldsymbol T}{A}) \boldsymbol v_i = \sigma_i^2 \boldsymbol v_i. \label{AAu2u} \end{equation}
我们将这些特征向量取为单位长度,则它们可以当做原 $n$ 维空间中的一组正交基,满足下面的正交归一关系:
\begin{aligned} \boldsymbol v_i \cdot \boldsymbol v_j = \delta_{ij}. \end{aligned}
将它们经过矩阵 $A$ 变换后在 $m$ 维像空间中对应的向量记为 $(\boldsymbol u_1, \boldsymbol u_2, \dots, \boldsymbol u_n)$,即
\begin{equation} \boldsymbol {A v}_i = \lambda_i \boldsymbol{u}_i. \label{Au2v} \end{equation}
其中已经把 $n$ 个向量 $\boldsymbol u_i$ 都取为单位长度。这样,$\lambda_i$ 表示向量 $\boldsymbol v_i$ 变换后的长度,$\boldsymbol u_i$ 表示变换后的方向。下面证明向量 $\boldsymbol u_i$ 的正交特性和 $\lambda_i = \sigma_i$:
\begin{aligned} \boldsymbol{u}_i \cdot \boldsymbol{u}_j & = \frac{1}{\lambda_i \lambda_j} (\boldsymbol{Av}_i)^\mathrm T (\boldsymbol{Av}_j) \\ & = \frac{1}{\lambda_i \lambda_j} \boldsymbol v_i^{\mathrm T} (A^{\mathrm T} \boldsymbol{Av}_j) \\ & = \frac{1}{\lambda_i \lambda_j} \boldsymbol v_i^{\mathrm T} \sigma_j^2 \boldsymbol v_j \\ & = \frac{\sigma_j^2}{\lambda_i \lambda_j} \boldsymbol v_i \cdot \boldsymbol v_j \\ & = \frac{\sigma_j^2}{\lambda_i \lambda_j} \delta_{ij}. \end{aligned}
当 $i \neq j$ 时,上式等于0。当 $i = j$ 时,因为 $\boldsymbol u_i$ 是单位向量,所以上式等于1。这样我们同时得到:
\begin{aligned} \boldsymbol u_i \cdot \boldsymbol u_j & = \delta_{ij}, \\ \lambda_i & = \sigma_i. \end{aligned}
可以看出,向量 $\boldsymbol u_i$ 与 $\boldsymbol v_i$ 具有相同的正交特性。
在方程 \eqref{Au2v} 的两端同左乘 $A^{\mathrm T}$,利用方程 \eqref{AAu2u} 容易得到下面的关系:
\begin{aligned} A^{\mathrm T} \boldsymbol u_i = \sigma_i \boldsymbol v_i. \label{av2u} \end{aligned}
再在这个方程两端左乘 $A$,结合方程 \eqref{Au2v} 得到:
\begin{aligned} (\boldsymbol{AA}^{\boldsymbol T}) \boldsymbol u_i = \sigma_i^2 \boldsymbol u_i. \end{aligned}
可以看出,矩阵 $A$ 和 $A^{\mathrm T}$ 是两个互逆的变换。在这两种变换的作用下,向量 $\boldsymbol v_i$ 与 $\boldsymbol u_i$ 互为像向量。我们把这几个方程写到一起:
\begin{eqnarray} \left\{ \begin{array} \,\,\, (A^{\!\boldsymbol T}{A}) \boldsymbol v_i \, = \sigma_i^2 \boldsymbol v_i, \\ (\boldsymbol{AA}^{\!\boldsymbol T}) \boldsymbol u_i = \sigma_i^2 \boldsymbol u_i, \\ \boldsymbol {A v}_i \,\,\, = \sigma_i \boldsymbol{u}_i, \\ A^{\mathrm T} \boldsymbol u_i = \sigma_i \boldsymbol v_i, \\ \boldsymbol v_i \cdot \boldsymbol v_j = \delta_{ij}, \\ \boldsymbol u_i \cdot \boldsymbol u_j = \delta_{ij}. \end{array} \right. \label{group} \end{eqnarray}
按照定义,$\boldsymbol v_i$ 是矩阵 $A$ 的奇异向量,$\sigma_i$ 是对应的奇异值,表征这个奇异向量经过矩阵$A$变换后的长度。对应的,$\boldsymbol u_i$ 是矩阵 $A^{\mathrm T}$ 的奇异向量,是对应的奇异值也是$\sigma_i$。
二、奇异值分解
根据前面的讨论,$m \times n$ 矩阵 $A$的作用空间是 $n$ 维的,向量组 $(\boldsymbol v_1, \boldsymbol v_2, \dots, \boldsymbol v_n)$ 可以作为这个空间的正交归一基底。这个空间中的任意向量 $\boldsymbol f$ 可以用这组基底展开:
\begin{aligned} \boldsymbol f = \sum_{i = 1}^n (\boldsymbol v_i \cdot \boldsymbol f) \boldsymbol v_i. \end{aligned}
结合上面的结果 \eqref{group},矩阵 $A$ 对向量 $\boldsymbol f$ 的作用可以写为:
\begin{aligned} \boldsymbol{Af} & = \sum_i (\boldsymbol v_i \cdot \boldsymbol f) \boldsymbol{Av}_i \\& = \sum_i (\sigma_i \boldsymbol u_i) (\boldsymbol v_i^{\mathrm T} \boldsymbol f) \\ & = (\sum_i \sigma_i \boldsymbol u_i \boldsymbol v_i^{\mathrm T}) \boldsymbol f. \end{aligned}
因为向量 $\boldsymbol f$ 是任意的,从上面的结果可以得到
\begin{aligned} A = \sum_{i = 1}^n \sigma_i \boldsymbol u_i \boldsymbol v_i^{\mathrm T}. \end{aligned}
这就是矩阵的奇异值分解,把 $A$ 分解成 $n$ 个 $\boldsymbol u_i \boldsymbol v_i^{\mathrm T}$ 的和,每一项的系数是对应的奇异值 $\sigma_i$。这个结果可以代入方程 (6) 验证。
从这个分解可以看出,那些奇异值较小的项,对矩阵 $A$ 的贡献较小,在一定精度上可以省略掉。我们把 $n$ 个奇异值 $\sigma_i$ 按降序排列,在上面的分解方程中只保留前 $r$ 个:
\begin{equation} A = \sum_{i = 1}^r \boldsymbol u_i \sigma_i \boldsymbol v_i^{\mathrm T}. \end{equation}
我们定义 $m \times r$ 阶矩阵 $\boldsymbol U$、$n \times r$ 阶矩阵 $V$ 和 $r$ 阶对角矩阵 $\Sigma$:
\begin{aligned} \boldsymbol U & = (\boldsymbol u_1, \boldsymbol u_2, \dots, \boldsymbol u_r), \\ \boldsymbol V & = (\boldsymbol v_1, \boldsymbol v_2, \dots, \boldsymbol v_r), \\ \boldsymbol \Sigma & = \mathrm{diag} (\sigma_1, \sigma2, \dots, \sigma_r). \end{aligned}
这样矩阵 $A$ 就可以写为三个矩阵相乘:
\begin{equation} A = \boldsymbol{U\Sigma V}^{\mathrm T}. \end{equation}
SVD算法的任务,就是计算出奇异值和两个矩阵 $\boldsymbol U$、$\boldsymbol V^{\mathrm T}$。