本文将记录学习 刘建平大佬SVD博客的相关内容。
SVD
在特征值和特征向量分解中,一个N*N的矩阵A可以分解为
A
=
W
Σ
W
−
1
A=W\Sigma W^{-1}
A=WΣW−1,其中W矩阵是A矩阵的特征向量组成的标准正交列向量矩阵,
Σ
\Sigma
Σ矩阵是由A矩阵的特征值组成的对角矩阵,由于W矩阵是列向量的标准正交基,则
W
−
1
=
W
T
W_{-1}=W^T
W−1=WT
由于特征值分解需要矩阵A是一个N*N的正方矩阵,对于普通的M*N的矩阵无法得到特征值所以需要奇异值分解。
对于一个MN的矩阵A,可以将该矩阵分解为:
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT
其中矩阵U是一个MM的矩阵,
Σ
\Sigma
Σ矩阵是一个M*N的对角矩阵,V矩阵是一个N*N矩阵,其中
U
T
U
=
E
,
V
T
V
=
E
U^TU=E,V^TV=E
UTU=E,VTV=E。
对于矩阵A的转置和A做矩阵乘法的N*N的矩阵求解得到特征向量,将列向量张成一个N*N的V矩阵,V矩阵中的特征值为矩阵A的右奇异向量:
A
T
A
v
i
=
λ
i
v
i
A^TAv_i=\lambda_i v_i
ATAvi=λivi
对于矩阵A和A的转置做矩阵乘法的M*M的矩阵求解得到特征向量,将列向量张成一个M*M的U矩阵,U矩阵中的特征值为矩阵A的左奇异向量:
A
A
T
u
i
=
λ
i
u
i
AA^T u_i=\lambda_i u_i
AATui=λiui
对于矩阵
Σ
\Sigma
Σ而言是一个只在对角线上有值,其他的位置均为0:
A
=
U
Σ
V
T
A
V
=
U
Σ
V
T
V
A
V
=
U
Σ
A
v
i
=
u
i
σ
i
σ
i
=
A
v
i
/
u
i
A=U\Sigma V^T\\ AV=U\Sigma V^TV\\ AV=U\Sigma\\ Av_i=u_i\sigma_i\\ \sigma_i={Av_i/u_i}
A=UΣVTAV=UΣVTVAV=UΣAvi=uiσiσi=Avi/ui
这样就得到每个奇异值,进而得到奇异值矩阵
Σ
\Sigma
Σ
还有另外一种解法:
A
=
U
Σ
V
T
A
T
=
V
Σ
U
T
A
T
A
=
V
Σ
U
T
U
Σ
V
T
=
V
Σ
2
V
T
A=U\Sigma V^T\\ A^T=V\Sigma U^T\\ A^TA=V\Sigma U^TU\Sigma V^T=V\Sigma^2 V^T
A=UΣVTAT=VΣUTATA=VΣUTUΣVT=VΣ2VT
这样就证明了V矩阵的解法,并且得到
Σ
2
=
λ
V
\Sigma^2=\lambda_V
Σ2=λV,进而得到
σ
i
=
λ
V
i
\sigma_i=\sqrt{\lambda_{Vi}}
σi=λVi,则对于矩阵
Σ
\Sigma
Σ可以通过求解
A
T
A
A^TA
ATA的特征值求解出来。
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:
A
m
×
n
=
U
m
×
m
Σ
m
×
n
V
n
×
n
T
≈
U
m
×
k
Σ
k
×
k
V
k
×
n
T
A_{m \times n} = U_{m \times m}\Sigma_{m \times n} V^T_{n \times n} \approx U_{m \times k}\Sigma_{k \times k} V^T_{k \times n}
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nT
其中k要比n小很多,也就是一个大的矩阵A可以用三个小的矩阵
U
m
×
k
,
Σ
k
×
k
,
V
k
×
n
T
U_{m \times k},\Sigma_{k \times k} ,V^T_{k \times n}
Um×k,Σk×k,Vk×nT来表示
SVD与PCA
在PCA中需要得到样本的协方差矩阵
A
T
A
A^TA
ATA最大的前q个特征向量,用这个前q个向量用来做低维投影降维。在SVD计算中不用做特征分解也可以求解出右奇异值矩阵V,这样做在样本量很大时节省时间。
对于SVD的左奇异值U矩阵,得到
X
X
T
XX^T
XXT最大的前d个特征向量张成的M*D维矩阵,做以下处理:
X
^
d
×
n
=
U
d
×
m
T
X
m
×
n
\hat{X}_{d\times n}=U^T_{d\times m}X_{m\times n}
X^d×n=Ud×mTXm×n
这样就得到一个d*n的矩阵,这个矩阵和原来的矩阵相比行数减少了,这样就完成了对数据的压缩(可以认为是每一维度是一个样本,每个样本是一个特征,对特征就行压缩)