Dark Dwarf Blog background

SVD 分解

SVD 分解

1. SVD 分解基础

a.a. 引入

我们前面介绍了矩阵的对角化分解:

A=XΛX1A = X\Lambda X^{-1}

但是这种分解有下面的问题:

  1. 正交性问题:对角化分解中的特征向量矩阵 XX 通常不是正交的(除非 AA 是对称矩阵)。这使得计算和几何解释变得复杂。
  2. 存在性问题:不是所有矩阵都有足够的特征向量来对角化。
  3. 形状问题:特征值分解只适用于方阵

而 SVD 分解则不存在这些问题:它适用于任何形状的长方形矩阵、并且分解得到的向量矩阵是正交的。

b.b. 概述

SVD 实际上是在为矩阵 AA 的四个基本子空间寻找最佳的“坐标轴”(基向量)。假设 AA 的秩为 rr,并且:

  • 输入空间的 RnR^n 的基:v1,,vrv_1, \dots, v_r 构成了行空间的标准正交基,vr+1,,vnv_{r+1}, \dots, v_n 构成了零空间 N(A)N(A) 的标准正交基。

  • 输出空间 RmR^m 的基:u1,,uru_1, \dots, u_r 构成了列空间的标准正交基,ur+1,,umu_{r+1}, \dots, u_m 构成了左零空间 N(AT)N(A^T) 的标准正交基。

则 SVD 分解告诉我们,矩阵 AA 的作用是将输入空间的基向量 viv_i 映射到输出空间的基向量 uiu_i,并进行伸缩

Avi=σiuiA v_i = \sigma_i u_i
  • 对于前 rr 个向量:viv_i 变成了 uiu_i,长度伸缩了 σi\sigma_i 倍。
  • 对于剩下的向量(零空间):Avi=0A v_i = 0(相当于 σ=0\sigma = 0)。

这个式子也可以看作对 AA 的积木式拆分:

A=σiuiviTA = \sigma_i u_i v_i ^ T

SVD 把 AA 拆分成了 rr 个秩一矩阵的和,σi\sigma_i 越大,说明这个秩一矩阵的重要性越大。

这个式子转化为矩阵形式如下:对前 rr 个非0奇异值:

AVr=UrΣrA \cdot V_r = U_r \cdot \Sigma_r

其中 VrV_rn×rn \times r 矩阵(rr 个行空间基向量), UrU_rm×rm \times r 矩阵(rr 个列空间基向量),Σr\Sigma_rr×rr \times r 的对角矩阵(存放 σ1σr\sigma_1 \dots \sigma_r)。

为了让 UUVV 变成完美的方形正交矩阵,我们需要把零空间和左零空间的基向量加进去,即进行补零:

  • Σ\Sigma 变成 m×nm \times n 的大矩阵,多出来的部分全是 0。
  • VV 变成 n×nn \times n 方阵,UU 变成 m×mm \times m 方阵。

得:

AV=UΣAV = U\Sigma

因为 VV 是正交矩阵,所以 V1=VTV^{-1} = V^T。方程两侧同乘 V1V^{-1}

A=UΣVTA = U \Sigma V^T

SVD 分解成功找到了两组特殊的正交网格 vvuu:把 vv 网格输入进矩阵 AA 后,它输出的恰好是没有任何扭曲、只有拉伸(或压缩)的 uu 网格。

c.c. 证明

我们证明对于任意矩阵 AA,都存在 A=UΣVTA = U \Sigma V^T

我们从对称矩阵 AATAA^T 入手来进行证明。带入式子得:

ATA=(UΣVT)T(UΣVT)=VΣTUTUIΣVT=V(ΣTΣ)VTA^T A = (U \Sigma V^T)^T (U \Sigma V^T) = V \Sigma^T \underbrace{U^T U}_{I} \Sigma V^T = V (\Sigma^T \Sigma) V^T

因为 Σ\Sigma 是对角阵,所以 ΣTΣ=Σ2\Sigma^T \Sigma = \Sigma^2(对角线元素变成了 σ2\sigma^2),于是:

ATA=VΣ2VTA^T A = V \Sigma^2 V^T

这正是对称矩阵的对角化公式,其中:

  • VV 是矩阵 ATAA^T A 的特征向量矩阵。因为 ATAA^T A 是对称矩阵,所以它的特征向量 VV 必然是相互正交的(这是对称矩阵的性质)。
  • Σ2\Sigma^2ATAA^T A 的特征值矩阵,奇异值 σi=λi(ATA)\sigma_i = \sqrt{\lambda_i(A^T A)}

下面只需要证明使用 SVD 得到的输出空间向量 uu 也是互相垂直的。使用 SVD 分解的定义式解出 uu

Avi=σiuiui=AviσiA v_i = \sigma_i u_i \quad \Rightarrow \quad u_i = \frac{A v_i}{\sigma_i}

我们计算 uu 中任意两向量点积 (ui)Tuj(u_i)^T u_j

(ui)Tuj=(Aviσi)T(Avjσj)=viTATAvjσiσj(u_i)^T u_j = \left( \frac{A v_i}{\sigma_i} \right)^T \left( \frac{A v_j}{\sigma_j} \right) = \frac{v_i^T A^T A v_j}{\sigma_i \sigma_j}

由于 vjv_jATAA^T A 的特征向量,所以 ATAvj=σj2vjA^T A v_j = \sigma_j^2 v_j,于是有:

LHS=viT(σj2vj)σiσj=σj2σiσj(viTvj)\text{LHS} = \frac{v_i^T (\sigma_j^2 v_j)}{\sigma_i \sigma_j} = \frac{\sigma_j^2}{\sigma_i \sigma_j} (v_i^T v_j)

由于 viv_i 彼此正交,因此上式结果为0,从而证毕。

d.d. 具体计算

给定:

A=[3045]A = \begin{bmatrix} 3 & 0 \\ 4 & 5 \end{bmatrix}

按照如下步骤计算其 SVD 分解:

  1. 计算 ATAA^TA
ATA=[3405][3045]=[25202025]A^T A = \begin{bmatrix} 3 & 4 \\ 0 & 5 \end{bmatrix} \begin{bmatrix} 3 & 0 \\ 4 & 5 \end{bmatrix} = \begin{bmatrix} 25 & 20 \\ 20 & 25 \end{bmatrix}
  1. 计算特征值:特征值多项式 λ2traceλ+det=λ250λ+225=0\lambda^2 - \text{trace} \cdot \lambda + \det = \lambda^2 - 50\lambda + 225 = 0 ,解得:
λ1=45,λ2=5\lambda_1 = 45, \quad \lambda_2 = 5

由前面推导,奇异值是特征值的平方根:

σ1=45=35,σ2=5\sigma_1 = \sqrt{45} = 3\sqrt{5}, \quad \sigma_2 = \sqrt{5}
  1. 求右奇异向量 VV:求 ATAA^T A 对应于 λ1=45\lambda_1=45 的特征向量:
(ATA45I)x=0[20202020]x=0(A^T A - 45I)x = 0 \Rightarrow \begin{bmatrix} -20 & 20 \\ 20 & -20 \end{bmatrix} x = 0

得到 x=[11]x = \begin{bmatrix} 1 \\ 1 \end{bmatrix}标准化后得到 v1=12[11]v_1 = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 \\ 1 \end{bmatrix}

同理,求对应于 λ2=5\lambda_2=5 的特征向量,得到 v2=12[11]v_2 = \frac{1}{\sqrt{2}} \begin{bmatrix} -1 \\ 1 \end{bmatrix}。 所以矩阵 V=12[1111]V = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & -1 \\ 1 & 1 \end{bmatrix}

  1. 求左奇异向量 UU:直接利用 ui=Aviσiu_i = \frac{A v_i}{\sigma_i} 计算特征向量:计算 u1u_1
Av1=[3045][1212]=12[39]A v_1 = \begin{bmatrix} 3 & 0 \\ 4 & 5 \end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{bmatrix} = \frac{1}{\sqrt{2}} \begin{bmatrix} 3 \\ 9 \end{bmatrix} u1=Av1σ1=14512[39]=190[39]=1310[39]=110[13]u_1 = \frac{A v_1}{\sigma_1} = \frac{1}{\sqrt{45}} \cdot \frac{1}{\sqrt{2}} \begin{bmatrix} 3 \\ 9 \end{bmatrix} = \frac{1}{\sqrt{90}} \begin{bmatrix} 3 \\ 9 \end{bmatrix} = \frac{1}{3\sqrt{10}} \begin{bmatrix} 3 \\ 9 \end{bmatrix} = \frac{1}{\sqrt{10}} \begin{bmatrix} 1 \\ 3 \end{bmatrix}

同理计算可得 u2=110[31]u_2 = \frac{1}{\sqrt{10}} \begin{bmatrix} -3 \\ 1 \end{bmatrix}。所以矩阵 U=110[1331]U = \frac{1}{\sqrt{10}} \begin{bmatrix} 1 & -3 \\ 3 & 1 \end{bmatrix}

下面展示两个特殊情况的处理方法:

  • 如果特征值为 0,右奇异向量仍然正常计算,左奇异向量需要找一个满足下面要求的向量:
    1. 与所有非零奇异值对应的 uju_j 正交
    2. 与其他 σ=0\sigma=0 对应的 uku_k 正交(如果有多个零奇异值)
    3. 是单位向量

例如给定:

A=[0100002000030000]A=\begin{bmatrix} 0 & 1 & 0 & 0\\[4pt] 0 & 0 & 2 & 0\\[4pt] 0 & 0 & 0 & 3\\[4pt] 0 & 0 & 0 & 0 \end{bmatrix}

容易计算出右奇异矩阵

V=[0001001001001000]V = \begin{bmatrix} 0 & 0 & 0 & 1\\ 0 & 0 & 1 & 0\\ 0 & 1 & 0 & 0\\ 1 & 0 & 0 & 0 \end{bmatrix}

与前三个特征值不为 0 时的左奇异向量:

  1. u1=13Av1=13Ae4=13(0030)T=(0010)Tu_1 = \dfrac{1}{3} A v_1 = \dfrac{1}{3} A e_4 = \dfrac{1}{3}\begin{pmatrix}0 & 0 & 3 & 0\end{pmatrix}^T = \begin{pmatrix}0 & 0 & 1 & 0\end{pmatrix}^T
  2. u2=12Av2=12Ae3=12(0200)T=(0100)Tu_2 = \dfrac{1}{2} A v_2 = \dfrac{1}{2} A e_3 = \dfrac{1}{2}\begin{pmatrix}0 & 2 & 0 & 0\end{pmatrix}^T = \begin{pmatrix}0 & 1 & 0 & 0\end{pmatrix}^T
  3. u3=1Av3=Av3=Ae2=(1000)Tu_3 = 1\cdot A v_3 = A v_3 = A e_2 = \begin{pmatrix}1 & 0 & 0 & 0\end{pmatrix}^T

对于 σ4=0\sigma_4=0,需要找一个与 u1u_1u2u_2u3u_3 正交的单位向量,显然 e4=(0,0,0,1)Te_4 = (0,0,0,1)^T 符合条件。

  • 如果矩阵不是满秩的,或者是长方形的,我们可能只找到了 rruuvv。根据前面的,对于剩下的 vv:从 AA 的零空间里找一组正交基填进去;对于剩下的 uu:从 ATA^T 的零空间里找一组正交基填进去。例如给定下面的秩一矩阵:
A=[120000].A=\begin{bmatrix}1 & 2 & 0\\[4pt] 0 & 0 & 0\end{bmatrix}.

有:

ATA=[120240000]A^T A= \begin{bmatrix} 1 & 2 & 0\\[4pt] 2 & 4 & 0\\[4pt] 0 & 0 & 0 \end{bmatrix}

特征值为σ1=5,σ2=σ3=0\sigma_1=\sqrt{5},\quad \sigma_2=\sigma_3=0。先计算出下面的右奇异向量与左奇异向量:

v1=15[120],u1=[10]v_1=\frac{1}{\sqrt{5}}\begin{bmatrix}1\\[4pt]2\\[4pt]0\end{bmatrix},\quad u_1=\begin{bmatrix}1\\[4pt]0\end{bmatrix}

矩阵秩为 r=1r=1,但 AA2×32\times3,我们需要完整的正交矩阵 VR3×3V\in\mathbb R^{3\times3}UR2×2U\in\mathbb R^{2\times2}。对于剩余的向量按规则填充:

  • 对剩余的 vv,求解 Ax=0A x=0
[120000][x1x2x3]=[00]x1+2x2=0.\begin{bmatrix}1 & 2 & 0\\ 0 & 0 & 0\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix} \Longrightarrow x_1+2x_2=0.

容易得零空间单位正交基:

v2=15[210],v3=[001].v_2=\frac{1}{\sqrt5}\begin{bmatrix}-2\\[4pt]1\\[4pt]0\end{bmatrix},\qquad v_3=\begin{bmatrix}0\\[4pt]0\\[4pt]1\end{bmatrix}.
  • 对剩余的 uu,求解 ATx=0A^T x=0
AT=[102000],ATy=0[y12y10]=0y1=0.A^T=\begin{bmatrix}1 & 0\\[4pt]2 & 0\\[4pt]0 & 0\end{bmatrix},\quad A^T y=0 \Longrightarrow \begin{bmatrix}y_1\\2y_1\\0\end{bmatrix}=0 \Rightarrow y_1=0.

得:

u2=[01].u_2=\begin{bmatrix}0\\[4pt]1\end{bmatrix}.

于是:

A=UΣVT=[1001][500000][1525025150001]TA = U\Sigma V^{T} = \begin{bmatrix}1 & 0\\[4pt]0 & 1\end{bmatrix} \begin{bmatrix}\sqrt{5} & 0 & 0\\[4pt]0 & 0 & 0\end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt{5}} & -\frac{2}{\sqrt{5}} & 0\\[6pt] \frac{2}{\sqrt{5}} & \frac{1}{\sqrt{5}} & 0\\[6pt] 0 & 0 & 1 \end{bmatrix}^{T}

2. SVD 分解的另一个理解角度

我们可以从下面这个新的角度来理解 SVD 分解。考虑下面的瑞利商问题:对于对称矩阵 SS(如 ATAA^T A),我们想找一个向量 xx,使得 xx 经过 SS 变换后“拉伸”得最长。也即最大化下面的式子:

r(x)=xTSxxTxr(x) = \frac{x^T S x}{x^T x}

在微积分中,这个比值的最大值就是 SS 的最大特征值 λ1\lambda_1,而对应的 xx 就是特征向量 q1q_1

对应到 SVD,对于矩阵 AA,我们要找一个 xx(也就是 vv),使得 AxAx 最长(即 Ax||Ax|| 最大):

maxAxx\max \frac{||Ax||}{||x||}

这等价于最大化 Ax2x2=xTATAxxTx\frac{||Ax||^2}{||x||^2} = \frac{x^T A^T A x}{x^T x}。这正是前面 S=ATAS = A^T A 的瑞利商问题。

3. PCA

a.a. 引入

假设我们有 1000 个数据样本并需要分析它们。我们按照以下步骤进行分析:

  1. 把数据的平均值减掉、进行中心化。从几何意义上,这将1000 个散点的中心(重心)挪到了坐标原点。
  2. 假设这一些数据大致排成了一条直线形状,我们希望找到这条直线,该怎么找到呢?

我们可以从下面两个角度来考虑这个问题。首先是最大化方差视角:我们希望沿着能让点的投影最长的那个方向投影,这样投影出来的点拉得最开,保留了点与点之间最大的差异(方差)。更准确地讲,我们希望所有点的投影长度的平方和最大

Maximizej=1najTu2\text{Maximize} \sum_{j=1}^n |a_j^T u|^2

将这个求和写成矩阵形式:

(ajTu)2=ATu2=uTAATu\sum (a_j^T u)^2 = ||A^T u||^2 = u^T A A^T u

这正是瑞利商问题(由于归一化,向量的长度为 1、没有分母)!这个方向正是 AATAA^T 的最大特征向量,也即 SVD 中 u1u_1

另一个角度是最小化垂直距离视角。我们通常使用的最小二乘拟合直线是让点到直线的垂直(竖直 yy 轴)距离最小。而PCA 是正交回归(Orthogonal Regression)。它找的是让点到直线的**几何垂直距离(最短连线)**最小。

这其实就是对前面的视角的几何描述。

对于每一个数据点 aja_j,它到原点的距离平方(斜边)是固定的,记为 aj2||a_j||^2。我们可以把这个向量分解为两个分量(也即直角三角形的两条直角边):

  1. 沿直线的投影ajTu12|a_j^T u_1|^2(这就是上面说的“方差”)。
  2. 垂直于直线的距离ajTu22|a_j^T u_2|^2(这就是“误差”)。

根据勾股定理有:

aj2固定常数=ajTu12投影长度平方+ajTu22垂直距离平方\underbrace{||a_j||^2}_{\text{固定常数}} = \underbrace{|a_j^T u_1|^2}_{\text{投影长度平方}} + \underbrace{|a_j^T u_2|^2}_{\text{垂直距离平方}}

我们希望垂直距离平方这一项最小,等价于希望投影长度平方这一项最大,这正是 SVD 所做的。我们再一次回到了 SVD。

因此可以说:PCA 其实就是对数据矩阵 AA 做 SVD

b.b. 相关概念

在 SVD 中有:

A=σ1u1v1T+σ2u2v2T+A = \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \dots

而在 PCA 中,这些项有了新的名字:

  • 总方差TT:数据的总信息量。等于所有奇异值的平方和 σi2\sum \sigma_i^2
  • 主成分uu
    • u1u_1(第一主成分):这是 SS 的最大特征向量,它解释了最大的方差占比 σ12T\frac{\sigma_1^2}{T}
    • u2u_2(第二主成分):垂直于 u1u_1 的方向,解释了次要的方差。
  • 有效秩RR:如果 σ1\sigma_1 很大,而 σ2\sigma_2 很小(接近 0),说明数据点虽然在二维平面上,但实际上几乎全落在一条线上。这时我们可以说数据的有效秩是 1。我们只需要保留 u1u_1 即可,这样就实现了降维。

同时为了量化数据的分布,我们引入协方差矩阵 SS

S=AATn1S = \frac{A A^T}{n-1}

SS 的元素含义如下:

  • 对角线元素 SiiS_{ii}:方差,代表这一行数据自己本身散得有多开。
  • 非对角线元素 (Sij)(S_{ij}):协方差,代表两个变量之间的关系。