SVD(奇異值分解)與在PCA降維中的使用


本文大部分內容轉自:https://www.cnblogs.com/pinard/p/6251584.html

  奇異值分解(Singular Value Decomposition,以下簡稱SVD)是在機器學習領域廣泛應用的算法,它不光可以用於降維算法中的特征分解,還可以用於推薦系統,以及自然語言處理等領域。是很多機器學習算法的基石。

SVD的定義

  SVD也是對矩陣進行分解,但是和特征分解不同,SVD並不要求要分解的矩陣為方陣。假設我們的矩陣A是一個m×n的矩陣,那么我們定義矩陣A的SVD為:A=UΣVT,其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,

除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足UTU=I,VTV=UTU=I,VTV=I。下圖可以很形象的看出上面SVD的定義:

那么我們如何求出SVD分解后的U,Σ,VU,Σ,V這三個矩陣呢?

  如果我們將A的轉置和A做矩陣乘法,那么會得到n×n的一個方陣ATA。既然ATA是方陣,那么我們就可以進行特征分解,得到的特征值和特征向量滿足下式:(ATA)vi=λivi

  這樣我們就可以得到矩陣ATA的n個特征值和對應的n個特征向量v了。將ATA的所有特征向量張成一個n×n的矩陣V,就是我們SVD公式里面的V矩陣了。一般我們將V中的每個特征向量叫做A的右奇異向量。

  如果我們將A和A的轉置做矩陣乘法,那么會得到m×m的一個方陣AAT。既然AAT是方陣,那么我們就可以進行特征分解,得到的特征值和特征向量滿足下式:(AAT)vi=λivi 

  這樣我們就可以得到矩陣AAT的m個特征值和對應的m個特征向量u了。將AAT的所有特征向量張成一個m×m的矩陣U,就是我們SVD公式里面的U矩陣了。一般我們將U中的每個特征向量叫做A的左奇異向量。

  U和V我們都求出來了,現在就剩下奇異值矩陣Σ沒有求出了。由於Σ除了對角線上是奇異值其他位置都是0,那我們只需要求出每個奇異值σ就可以了。

  在式子:A=UΣVTAV=UΣVTVAV=UΣAvi=σiuiσi=Avi/ui中,我們可以求出每個奇異值,進而求出奇異值矩陣Σ。ATA的特征向量組成的就是SVD的V矩陣,而AAT的特征向量組成的就是我們SVD的U矩陣,可以從V矩陣的證明為例:

A=UΣVTAT=VΣTUTATA=VΣTUTUΣVT=VΣ2VT這個式子證明使用了UTU=I,ΣTΣ=Σ2。可以看出ATA的特征向量組成的的確就是我們SVD中的V矩陣。類似的方法可以得到AAT的特征向量組成的就是我們SVD中的U矩陣。

進一步我們還可以看出我們的特征值矩陣等於奇異值矩陣的平方,也就是說特征值和奇異值滿足如下關系:σi=λi-2,這樣也就是說,我們可以不用σi=Avi/uiσi=Avi/ui來計算奇異值,也可以通過求出ATAATA的特征值取平方根來求奇異值。

SVD計算舉例

  這里我們用一個簡單的例子來說明矩陣是如何進行奇異值分解的。我們的矩陣A定義為:

  我們首先求出ATA和AAT

  

  接着求 ATA的特征值和特征向量:
  

  接着求AAT的特征值和特征向量:

  

  利用 Avi=σiui,i=1,2求奇異值:
  

   當然,我們也可以用σi=λi-2直接求出奇異值為3-2和1. 最終得到A的奇異值分解為:

  

SVD的一些性質 

  對於奇異值,它跟我們特征分解中的特征值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。也就是說:Am×n=Um×mΣm×nVTn×nUm×kΣk×kVTk×n其中k要比n小很多,也就是一個大的矩陣A可以用三個小的矩陣Um×k,Σk×k,VTk×n來表示。如下圖所示,現在我們的矩陣A只需要灰色的部分的三個小矩陣就可以近似描述了。

由於這個重要的性質,SVD可以用於PCA降維,來做數據壓縮和去噪。也可以用於推薦算法,將用戶和喜好對應的矩陣做特征分解,進而得到隱含的用戶需求來做推薦。同時也可以用於NLP中的算法,比如潛在語義索引(LSI)。下面我們就對SVD用於PCA降維做一個介紹。

SVD用於PCA

 在主成分分析(PCA)原理總結中,我們講到要用PCA降維,需要找到樣本協方差矩陣XTXXTX的最大的d個特征向量,然后用這最大的d個特征向量張成的矩陣來做低維投影降維。可以看出,在這個過程中需要先求出協方差矩陣XTX,當樣本數多樣本特征數也多的時候,這個計算量是很大的。

 注意到我們的SVD也可以得到協方差矩陣XTX最大的d個特征向量張成的矩陣,但是SVD有個好處,有一些SVD的實現算法可以不求先求出協方差矩陣XTX,也能求出我們的右奇異矩陣VV。也就是說,我們的PCA算法可以不用做特征分解,而是做SVD來完成。這個方法在樣本量很大的時候很有效。實際上,scikit-learn的PCA算法的背后真正的實現就是用的SVD,而不是我們我們認為的暴力特征分解。

 另一方面,注意到PCA僅僅使用了我們SVD的右奇異矩陣,沒有使用左奇異矩陣,那么左奇異矩陣有什么用呢?假設我們的樣本是m×n的矩陣X,如果我們通過SVD找到了矩陣XXT最大的d個特征向量張成的m×d維矩陣U,則我們如果進行如下處理:Xd×n=UTd×mXm×n。可以得到一個d×n的矩陣X‘,這個矩陣和我們原來的m×n維樣本矩陣X相比,行數從m減到了d,可見對行數進行了壓縮。也就是說,左奇異矩陣可以用於行數的壓縮。相對的,右奇異矩陣可以用於列數即特征維度的壓縮,也就是我們的PCA降維。   

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM