【数学和算法】SVD奇异值分解原理、以及在PCA中的运用
詳細的介紹請參考這篇博客:SVD奇異值分解
SVD奇異值分解是用來對矩陣進行分解,并不是專門用來求解特征值和特征向量。
而求解特征值和求解特征向量,可以選擇使用SVD算法進行矩陣分解后,再用矩陣分解后的結果得到特征值和特征向量。
我們先回顧一下SVD:
PCA降維需要求解協方差矩陣的特征值和特征向量,而求解協方差矩陣1m?X?XT\color{blue}\frac{1}{m}*X*X^Tm1??X?XT的特征值和特征向量,又可以等價于SVD的其中一種求解矩陣A的三個分解矩陣的方法。
該方法即,利用A?AT\color{blue}A*A^TA?AT和AT?A\color{blue}A^T*AAT?A來求解A的三個分解矩陣。
所以求出了A的三個分解矩陣,就可以從A的分解矩陣中,間接得到A?AT\color{blue}A*A^TA?AT的特征值和特征向量(這是因為A的三個分解矩陣是和A?AT\color{blue}A*A^TA?AT的特征值、特征向量是有關系的),同時也是協方差矩陣1m?X?XT\color{blue}\frac{1}{m}*X*X^Tm1??X?XT的特征值和特征向量。
上面的博客中介紹的SVD奇異值分解的方法中,并沒有用到協方差矩陣,不要誤解為AT?A\color{blue}A^T*AAT?A就是協方差矩陣,因為他們并沒有減去均值的操作。并且該SVD的實現算法有很多種,可以不用先求出矩陣AT?A\color{blue}A^T*AAT?A ,也能求出我們的右奇異矩陣V。
SVD奇異值分解是使用特殊方法來求解出矩陣的左奇異矩陣U和右奇異矩陣V。但是求解U、V的方法有很多種,并非只有使用 AT?A\color{blue}A^T*AAT?A這一個方法,而且計算矩陣AT?A\color{blue}A^T*AAT?A這個方法計算量太大,不合適。該博客是以這種方法為例,所以這一點需要明白。
需要注意的是,是在PCA降維中才使用了協方差矩陣: XT?X\color{blue}X^T*XXT?X ,每個維度都做了減去均值的操作后,得到的協方差矩陣就變為了SVD奇異值分解中用到的那種矩陣轉置*矩陣的形式,請參考博客深入理解PCA與SVD的關系的第三節。這樣,求解的問題就變得一樣了
所以,PCA算法可以不用做特征分解,而是做SVD來完成。這個方法在樣本量很大的時候很有效。
實際上,scikit-learn的PCA算法的背后真正的實現就是用的SVD,而不是我們我們認為的暴力特征分解。
PCA降維的方法有下面幾種:
(1)直接對樣本數據組成的矩陣Xn*n進行求解特征值和特征向量:
這種方式可能是初學者最直接就想到的,他是一種暴力求解方式,當樣本特征維度很大時,求解耗時,還可能是復數解。并且,該方法有個硬傷,必須是方陣,即n?n\color{blue}n*nn?n的矩陣才能求解特征值和特征向量。
(2)計算協方差矩陣,通過變換矩陣轉換來降低維度:
對樣本矩陣Xn?m\color{blue}X_{n*m}Xn?m?進行下面操作:
- 求X的各個維度 均值;
- 將 X的各個維度減去該維度均值,再賦值給X,即in place就地操作;
- 計算X的協方差矩陣 C=1m?X?XT\color{blue}C=\frac{1}{m}*X*X^TC=m1??X?XT;
- 對協方差矩陣 C特征值分解;
- 從大到小排列C的特征值;
- 取前K個特征值對應的特征向量按行組成矩陣即為變換矩陣Pk?n\color{blue}P_{k*n}Pk?n?;
- Y=P?X\color{blue}Y=P*XY=P?X,得到的Y就是降維后的數據。
該方法會因為:
- (1) 特征維度很大而使得協方差矩陣 C=1m?X?XT\color{blue}C=\frac{1}{m}*X*X^TC=m1??X?XT計算量很大;
- (2) 計算出了協方差矩陣后,對協方差矩陣的特征分解的計算效率并不高;
所以也不合適。
(3)將PCA問題轉化為SVD問題求解:
SVD奇異值分解是使用特殊方法來求解出矩陣的左奇異矩陣U和右奇異矩陣V。但是求解U、V的方法有很多種,并非只有使用 AT?A\color{blue}A^T*AAT?A這一個方法,而且計算矩陣AT?A\color{blue}A^T*AAT?A 這個方法計算量太大,不合適。該博客是以這種方法為例,所以這一點需要明白。
SVD的實現算法有很多種,可以不用先求出矩陣 X?XT\color{blue}X*X^TX?XT,也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解,而是做SVD來完成。這個方法在樣本量很大的時候很有效。
實際上,scikit-learn的PCA算法的背后真正的實現就是用的SVD,而不是我們我們認為的暴力特征分解。
所以,在第二種方法的基礎上,我們求協方差矩陣的計算量很大,就把計算協方差矩陣轉化為SVD問題求解,令:
就有:
所以:
- 求X\color{blue}XX的協方差矩陣 C=1m?X?XT\color{blue}C=\frac{1}{m}*X*X^TC=m1??X?XT 的特征分解,等價于求AT?A\color{blue}A^T*AAT?A的特征分解;
- 又因為,AT?A\color{blue}A^T*AAT?A的特征分解可以不用求出AT?A\color{blue}A^T*AAT?A,而是利用SVD的其他迭代方法得到A\color{blue}AA的SVD分解左奇異矩陣U\color{blue}UU、右奇異矩陣V\color{blue}VV和奇異值矩陣Λ\color{blue}\LambdaΛ;
- 通過右奇異矩陣V\color{blue}VV 和奇異值矩陣Λ\color{blue}\LambdaΛ(對角陣),得到AT?A\color{blue}A^T*AAT?A的特征值和特征向量。即每個特征值對應一個奇異值的平方,每個特征向量對應右奇異矩陣V\color{blue}VV的每列向量;
- 求出了特征值和特征向量,取前 k\color{blue}kk 個,就能夠求出第二種方法里面的變換矩陣Pk?n\color{blue}P_{k*n}Pk?n?,然后再計算Y=P?X\color{blue}Y=P*XY=P?X,得到的Y\color{blue}YY就是降維后的數據。
PCA的性質:
可參考:【機器學習】降維——PCA(非常詳細)
PCA是主成分分析,他是用來降低特征維度(把每個樣本的n個特征縮減為主要的k個特征);
用在圖像壓縮時,它降低的特征維度并不是指把圖像長寬縮小,而是把原來的存儲圖像像素矩陣變成存儲(SVD奇異值分解得到的)特征向量和特征值,如下,A是圖像像素矩陣(請參考:奇異值的物理意義是什么):
總結
以上是生活随笔為你收集整理的【数学和算法】SVD奇异值分解原理、以及在PCA中的运用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】36.ubuntu删除vs
- 下一篇: 【数学和算法】最小二乘法,SVD奇异值分