SVD矩阵奇异值分解
前言
为了使计算机理解实际问题体中目标各项特征,通常使用方阵来储存这些特征值,例如一个人的年龄,身高,体重可以使用 [ 32 , 185 , 75 ] [32,185,75] [32,185,75]进行表示。但是对于有些问题,其特征矩阵是稀疏矩阵,矩阵内部许多向量都为0,例如矩阵 O O O。这即造成储存空间的浪费,同时消耗了计算资源,那能不能即压缩矩阵的大小,且保留矩阵的重要信息呢?这时候可以用到SVD矩阵奇异值分解。
O = [ 0 0 ⋯ 0 0 0 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 0 ] O=\begin{bmatrix} 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 0 \end{bmatrix} O= 00⋮000⋮0⋯⋯⋱⋯00⋮0
SVD矩阵奇异值分解
SVD可以将任意一个矩阵分解为一个正交矩阵、一个对焦矩阵和另外一个对角矩阵的乘积。对角矩阵的对角元称为矩阵的奇异值,可以证明,奇异值总是大于等于0的。当对角矩阵的奇异值按从大到小排列时,SVD分解是唯一的。
特征值与特征向量
理解SVD之前必需搞懂两个概念,特征值与特征向量,假设存在一个 n ∗ n n*n n∗n矩阵 A A A,存在一个 n n n维矩阵 x x x和一个特征值 λ \lambda λ,使得式 ( 1 ) (1) (1)成立。
A x = λ x (1) Ax = \lambda x\tag{1} Ax=λx(1)
则 λ \lambda λ即为 A A A的特征值, x x x为 A A A的特征向量。那如何求取矩阵 A A A的特征值和特征向量呢?计算如下:
A x − λ x = 0 ( A − λ E ) x = 0 \begin{align} Ax-\lambda x = 0\tag{2} \\ (A - \lambda E)x = 0 \tag{3}\\ \end{align} Ax−λx=0(A−λE)x=0(2)(3)
如果 ( 3 ) (3) (3)式成立,即求:
∣ A − λ E ∣ = 0 (4) |A- \lambda E | = 0 \tag{4} ∣A−λE∣=0(4)
即可求出了矩阵 A A A的 n n n个特征值 λ 1 ⩽ λ 2 ⩽ . . . ⩽ λ n − 1 ⩽ λ n \lambda_1 \leqslant \lambda_2 \leqslant ... \leqslant \lambda_{n-1} \leqslant \lambda_n λ1⩽λ2⩽...⩽λn−1⩽λn ,以及这 n n n个特征值所对应的特征向量 x 1 , x 2 , . . . , x n − 1 , x n x_1,x_2,...,x_{n-1},x_n x1,x2,...,xn−1,xn。
最后矩阵 A A A就可以进行SVD分解,用 ( 5 ) (5) (5)式进行表示:
A = W ∑ W − 1 (5) A= W\sum W^{-1} \tag{5} A=W∑W−1(5)
其中 W W W是这 n n n个特征向量所张成的 n × n n×n n×n维矩阵, W = [ x 1 , x 2 , . . . , x n ] W = [x_1,x_2,...,x_n] W=[x1,x2,...,xn],而 ∑ \sum ∑为这 n n n个特征值为主对角线的 n × n n×n n×n维矩阵, O = [ σ 1 0 ⋯ 0 0 σ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ σ n ] O=\begin{bmatrix}\sigma_1 & 0 & \cdots & 0 \\0 & \sigma_2& \cdots & 0 \\\vdots & \vdots & \ddots & \vdots \\0 & 0 & \cdots &\sigma_n\end{bmatrix} O= σ10⋮00σ2⋮0⋯⋯⋱⋯00⋮σn 。
W的这n个特征向量会进行标准化,即满足 ∣ ∣ W i ∣ ∣ 2 = 1 ||W_i||^2=1 ∣∣Wi∣∣2=1 ,或者 w i t w i = 1 w^t_i w_i=1 witwi=1 ,此时W的n个特征向量为标准正交基,满足 W T W = I W^TW = I WTW=I ,即 W T = W − 1 W^T = W^{-1} WT=W−1 ,也就是说W为酉矩阵。
这样我们的特征分解表达式可以写成
A = W ∑ W T (6) A= W\sum W^{T} \tag{6} A=W∑WT(6)
注意到要进行特征分解,矩阵A必须为方阵。那么如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案是可以,此时我们的SVD登场了。
非方阵进行求解
假设 A A A是一个 m ∗ n m*n m∗n的矩阵,那么定义A都SVD分解为式 ( 6 ) (6) (6):
A = U ∑ V T (7) A= U\sum V^{T} \tag{7} A=U∑VT(7)
其中 U U U是一个 m ∗ m* m∗* m m m的矩阵, ∑ \sum ∑是一个 m ∗ m* m∗ n n n的矩阵, V V V是一个 n ∗ n n*n n∗n的矩阵,U*和 V 都是酉矩阵,即满足 U U T = V V T = I UU^T = VV^T = I UUT=VVT=I。那如何求解这三个矩阵呢?
求解矩阵 V V V
如果我们将A的转置和A做矩阵乘法,那么会得到 n × n n×n n×n的一个方阵 A T A A^TA ATA,因为 A T = V ∑ T U T A^{T}= V\sum^{T} U^{T} AT=V∑TUT, U U T = I UU^T = I UUT=I。故 A T A = V U U T ∑ 2 V T = V ∑ 2 V T A^TA =V UU^T \sum^2 V^{T} =V\sum^2 V^{T} ATA=VUUT∑2VT=V∑2VT,求解特征值和特征向量满足下式(8):
( A T A ) x i = λ i x i (8) (A^TA)x_i = \lambda_i x_i \tag{8} (ATA)xi=λixi(8)
所以矩阵 V = [ x 1 , x 2 , . . . , x n ] , σ i = λ i V = [x_1,x_2,...,x_n],\sigma_i = \sqrt{\lambda_i} V=[x1,x2,...,xn],σi=λi .
求解矩阵 U U U
求解矩阵 U U U与求解矩阵V类似,只不过求解 A A T AA^T AAT,不在进行赘述.