SVD 分解
1. SVD 分解基础
a. 引入
我们前面介绍了矩阵的对角化分解:
A=XΛX−1
但是这种分解有下面的问题:
- 正交性问题:对角化分解中的特征向量矩阵 X 通常不是正交的(除非 A 是对称矩阵)。这使得计算和几何解释变得复杂。
- 存在性问题:不是所有矩阵都有足够的特征向量来对角化。
- 形状问题:特征值分解只适用于方阵。
而 SVD 分解则不存在这些问题:它适用于任何形状的长方形矩阵、并且分解得到的向量矩阵是正交的。
b. 概述
SVD 实际上是在为矩阵 A 的四个基本子空间寻找最佳的“坐标轴”(基向量)。假设 A 的秩为 r,并且:
-
输入空间的 Rn 的基:v1,…,vr 构成了行空间的标准正交基,vr+1,…,vn 构成了零空间 N(A) 的标准正交基。
-
输出空间 Rm 的基:u1,…,ur 构成了列空间的标准正交基,ur+1,…,um 构成了左零空间 N(AT) 的标准正交基。
则 SVD 分解告诉我们,矩阵 A 的作用是将输入空间的基向量 vi 映射到输出空间的基向量 ui,并进行伸缩:
Avi=σiui
- 对于前 r 个向量:vi 变成了 ui,长度伸缩了 σi 倍。
- 对于剩下的向量(零空间):Avi=0(相当于 σ=0)。
这个式子也可以看作对 A 的积木式拆分:
A=σiuiviT
SVD 把 A 拆分成了 r 个秩一矩阵的和,σi 越大,说明这个秩一矩阵的重要性越大。
这个式子转化为矩阵形式如下:对前 r 个非0奇异值:
A⋅Vr=Ur⋅Σr
其中 Vr 是 n×r 矩阵(r 个行空间基向量), Ur 是 m×r 矩阵(r 个列空间基向量),Σr 是 r×r 的对角矩阵(存放 σ1…σr)。
为了让 U 和 V 变成完美的方形正交矩阵,我们需要把零空间和左零空间的基向量加进去,即进行补零:
- Σ 变成 m×n 的大矩阵,多出来的部分全是 0。
- V 变成 n×n 方阵,U 变成 m×m 方阵。
得:
AV=UΣ
因为 V 是正交矩阵,所以 V−1=VT。方程两侧同乘 V−1:
A=UΣVT
SVD 分解成功找到了两组特殊的正交网格 v 和 u:把 v 网格输入进矩阵 A 后,它输出的恰好是没有任何扭曲、只有拉伸(或压缩)的 u 网格。
c. 证明
我们证明对于任意矩阵 A,都存在 A=UΣVT。
我们从对称矩阵 AAT 入手来进行证明。带入式子得:
ATA=(UΣVT)T(UΣVT)=VΣTIUTUΣVT=V(ΣTΣ)VT
因为 Σ 是对角阵,所以 ΣTΣ=Σ2(对角线元素变成了 σ2),于是:
ATA=VΣ2VT
这正是对称矩阵的对角化公式,其中:
- V 是矩阵 ATA 的特征向量矩阵。因为 ATA 是对称矩阵,所以它的特征向量 V 必然是相互正交的(这是对称矩阵的性质)。
- Σ2 是 ATA 的特征值矩阵,奇异值 σi=λi(ATA)。
下面只需要证明使用 SVD 得到的输出空间向量 u 也是互相垂直的。使用 SVD 分解的定义式解出 u:
Avi=σiui⇒ui=σiAvi
我们计算 u 中任意两向量点积 (ui)Tuj:
(ui)Tuj=(σiAvi)T(σjAvj)=σiσjviTATAvj
由于 vj 是 ATA 的特征向量,所以 ATAvj=σj2vj,于是有:
LHS=σiσjviT(σj2vj)=σiσjσj2(viTvj)
由于 vi 彼此正交,因此上式结果为0,从而证毕。
d. 具体计算
给定:
A=[3405]
按照如下步骤计算其 SVD 分解:
- 计算 ATA:
ATA=[3045][3405]=[25202025]
- 计算特征值:特征值多项式 λ2−trace⋅λ+det=λ2−50λ+225=0,解得:
λ1=45,λ2=5
由前面推导,奇异值是特征值的平方根:
σ1=45=35,σ2=5
- 求右奇异向量 V:求 ATA 对应于 λ1=45 的特征向量:
(ATA−45I)x=0⇒[−202020−20]x=0
得到 x=[11]。标准化后得到 v1=21[11]。
同理,求对应于 λ2=5 的特征向量,得到 v2=21[−11]。
所以矩阵 V=21[11−11]。
- 求左奇异向量 U:直接利用 ui=σiAvi 计算特征向量:计算 u1:
Av1=[3405][2121]=21[39]
u1=σ1Av1=451⋅21[39]=901[39]=3101[39]=101[13]
同理计算可得 u2=101[−31]。所以矩阵 U=101[13−31]。
下面展示两个特殊情况的处理方法:
- 如果特征值为 0,右奇异向量仍然正常计算,左奇异向量需要找一个满足下面要求的向量:
- 与所有非零奇异值对应的 uj 正交
- 与其他 σ=0 对应的 uk 正交(如果有多个零奇异值)
- 是单位向量
例如给定:
A=0000100002000030
容易计算出右奇异矩阵
V=0001001001001000
与前三个特征值不为 0 时的左奇异向量:
- u1=31Av1=31Ae4=31(0030)T=(0010)T
- u2=21Av2=21Ae3=21(0200)T=(0100)T
- u3=1⋅Av3=Av3=Ae2=(1000)T
对于 σ4=0,需要找一个与 u1,u2,u3 正交的单位向量,显然 e4=(0,0,0,1)T 符合条件。
- 如果矩阵不是满秩的,或者是长方形的,我们可能只找到了 r 个 u 和 v。根据前面的,对于剩下的 v:从 A 的零空间里找一组正交基填进去;对于剩下的 u:从 AT 的零空间里找一组正交基填进去。例如给定下面的秩一矩阵:
A=[102000].
有:
ATA=120240000
特征值为σ1=5,σ2=σ3=0。先计算出下面的右奇异向量与左奇异向量:
v1=51120,u1=[10]
矩阵秩为 r=1,但 A 是 2×3,我们需要完整的正交矩阵 V∈R3×3 和 U∈R2×2。对于剩余的向量按规则填充:
- 对剩余的 v,求解 Ax=0:
[102000]x1x2x3=[00]⟹x1+2x2=0.
容易得零空间单位正交基:
v2=51−210,v3=001.
- 对剩余的 u,求解 ATx=0:
AT=120000,ATy=0⟹y12y10=0⇒y1=0.
得:
u2=[01].
于是:
A=UΣVT=[1001][500000]51520−52510001T
2. SVD 分解的另一个理解角度
我们可以从下面这个新的角度来理解 SVD 分解。考虑下面的瑞利商问题:对于对称矩阵 S(如 ATA),我们想找一个向量 x,使得 x 经过 S 变换后“拉伸”得最长。也即最大化下面的式子:
r(x)=xTxxTSx
在微积分中,这个比值的最大值就是 S 的最大特征值 λ1,而对应的 x 就是特征向量 q1。
对应到 SVD,对于矩阵 A,我们要找一个 x(也就是 v),使得 Ax 最长(即 ∣∣Ax∣∣ 最大):
max∣∣x∣∣∣∣Ax∣∣
这等价于最大化 ∣∣x∣∣2∣∣Ax∣∣2=xTxxTATAx。这正是前面 S=ATA 的瑞利商问题。
3. PCA
a. 引入
假设我们有 1000 个数据样本并需要分析它们。我们按照以下步骤进行分析:
- 把数据的平均值减掉、进行中心化。从几何意义上,这将1000 个散点的中心(重心)挪到了坐标原点。
- 假设这一些数据大致排成了一条直线形状,我们希望找到这条直线,该怎么找到呢?
我们可以从下面两个角度来考虑这个问题。首先是最大化方差视角:我们希望沿着能让点的投影最长的那个方向投影,这样投影出来的点拉得最开,保留了点与点之间最大的差异(方差)。更准确地讲,我们希望所有点的投影长度的平方和最大:
Maximizej=1∑n∣ajTu∣2
将这个求和写成矩阵形式:
∑(ajTu)2=∣∣ATu∣∣2=uTAATu
这正是瑞利商问题(由于归一化,向量的长度为 1、没有分母)!这个方向正是 AAT 的最大特征向量,也即 SVD 中 u1。
另一个角度是最小化垂直距离视角。我们通常使用的最小二乘拟合直线是让点到直线的垂直(竖直 y 轴)距离最小。而PCA 是正交回归(Orthogonal Regression)。它找的是让点到直线的**几何垂直距离(最短连线)**最小。
这其实就是对前面的视角的几何描述。
对于每一个数据点 aj,它到原点的距离平方(斜边)是固定的,记为 ∣∣aj∣∣2。我们可以把这个向量分解为两个分量(也即直角三角形的两条直角边):
- 沿直线的投影:∣ajTu1∣2(这就是上面说的“方差”)。
- 垂直于直线的距离:∣ajTu2∣2(这就是“误差”)。
根据勾股定理有:
固定常数∣∣aj∣∣2=投影长度平方∣ajTu1∣2+垂直距离平方∣ajTu2∣2
我们希望垂直距离平方这一项最小,等价于希望投影长度平方这一项最大,这正是 SVD 所做的。我们再一次回到了 SVD。
因此可以说:PCA 其实就是对数据矩阵 A 做 SVD。
b. 相关概念
在 SVD 中有:
A=σ1u1v1T+σ2u2v2T+…
而在 PCA 中,这些项有了新的名字:
- 总方差T:数据的总信息量。等于所有奇异值的平方和 ∑σi2。
- 主成分u:
- u1(第一主成分):这是 S 的最大特征向量,它解释了最大的方差占比 Tσ12。
- u2(第二主成分):垂直于 u1 的方向,解释了次要的方差。
- 有效秩R:如果 σ1 很大,而 σ2 很小(接近 0),说明数据点虽然在二维平面上,但实际上几乎全落在一条线上。这时我们可以说数据的有效秩是 1。我们只需要保留 u1 即可,这样就实现了降维。
同时为了量化数据的分布,我们引入协方差矩阵 S:
S=n−1AAT
S 的元素含义如下:
- 对角线元素 Sii:方差,代表这一行数据自己本身散得有多开。
- 非对角线元素 (Sij):协方差,代表两个变量之间的关系。