奇异值分解SVD

奇异值分解SVD原理

特征值和特征向量

特征值和特征向量表示:

\[Ax=\lambda x \]

其中A是一个\(n\times n\)的实对称矩阵,x是一个n维向量,则我们说\(\lambda\)是一个特征值,而x是矩阵A的特征值\(\lambda\)对应的特征向量。有了特征值和特征向量,我们就可以将矩阵分解。假设我们求出了n个特征值\(\lambda_1\le\lambda_2\le...\le\lambda_n\)以及这n个特征值的特征向量\(\{w_1,w_2,...,w_n\}\),如果这n个特征向量线性无关,那么A就可以用下式表示

\[A=W\Sigma W^{-1} \]

其中W是这n个特征向量所形成的\(n\times n\)维矩阵,而\(\Sigma\)为这n个特征值为对角线的\(n\times n\)维矩阵。

一般我们会所W的这n个特征向量标准化,即满足\(\lVert w_i\rVert_2=1\),或者说\(w_i^Tw_i=1\),此时W的n个特征向量为标准正交基,满足\(W^TW=I\)\(W^T=W^{-1}\),也就是说W为酉矩阵。

这样,我们的特征分解表达式可以写为

\[A=W\Sigma W^T \]

此时,A必须为方阵,如果A不是方阵那么就用到了SVD。

SVD定义

SVD进行矩阵分解时不要求矩阵为方阵,假设矩阵A为一个\(m\times n\)的矩阵,那么定义矩阵A的SVD为:

\[A=U\Sigma V^T \]

其中U是一个\(m\times m\)的矩阵;\(\Sigma\)是一个\(m\times n\)的矩阵,除了主对角线外的元素都为0,主对角线上的元素都为奇异值;V是一个\(n\times n\)的矩阵。U和V都是酉矩阵,即满足\(U^TU=I,V^TT=I\)

三个矩阵的求解:

使用A的转置矩阵,假设

\[(A^TA)v_i=\lambda_iv_i \]

这样\(A^TA\)是一个方阵,可得到其n个特征值和对应的特征向量\(v\),将特征向量组成一个\(n\times n\)的矩阵,这里就是我们SVD公式里的V矩阵,一般我们将V中的每个特征向量叫做A的右奇异向量。

如果

\[(AA^T)u_i=\lambda_iu_i \]

得到m个特征值和对应的m个特征向量,组成一个\(m\times m\)的矩阵,这里就是SVD公式里的U矩阵,一般将U中的特征向量叫做A的左奇异向量。

有了U和V后,只需要再求得\(\Sigma\)只需求出每个奇异值\(\sigma\)即可。

\[\begin{align} A&=U\Sigma V^T\\ \Rightarrow AV&=U\Sigma V^TV\\ \Rightarrow AV&=U\Sigma\\ \Rightarrow Av_i&=\sigma_iu_i\\ \Rightarrow\sigma_i&=\frac{Av_i}{u_i} \end{align} \]

这样,我们就可以根据\(A,v,u\)求出所有的奇异值\(\sigma\),进而得到矩阵\(\Sigma\)

另一种方法求解,我们说\(A^TA\)的特征向量矩阵就是我们SVD中的V矩阵,\(AA^T\)的特征向量组成的矩阵是我们SVD中的U矩阵,如何证明

\[\begin{align} A&=U\Sigma V^T\\ \Rightarrow A^T&=V\Sigma^TU^T\\ \Rightarrow A^TA&=V\Sigma^TU^TU\Sigma V^T\\ &=V\Sigma^2V^T \end{align} \]

上式证明用了:\(U^TU=I,\Sigma^T\Sigma=\Sigma^2\),可以看出\(A^TA\)的特征向量组成的矩阵确实是SVD中的V矩阵。

进一步,我们可以看出特征值矩阵等于奇异值矩阵的平方,也就是

\[\sigma_i=\sqrt\lambda_i \]

我们可以不用\(\sigma_i=\frac{Av_i}{u_i}\)来算奇异值,可以直接通过求出\(A^TA\)的特征值,取平方根来找到奇异值。

SVD的性质

奇异值由大到小排列,而且减小特别快,我们可以选择最大的k个奇异值,k比n小的多,这个重要的性质可以用于降维或数据压缩。SVD可以用于PCA降维。

SVD总结

PCA降维时,需要计算协方差矩阵\(X^TX\),有时样本数非常大时,不计算量非常大。SVD的实现可以不先求协方差矩阵\(X^TX\)也能求出右厅异阵V,使用SVD算法进行PCA降维时可以不用做特征分解。

SVD可以实现并行化,加速数据处理。

posted @ 2020-05-13 15:47  hi_heisen  阅读(180)  评论(0编辑  收藏  举报