【學習筆記】奇異值分解(SVD)原理與在降維中的應用
前言
在專案實戰的特徵工程中遇到了採用SVD進行降維,具體SVD是什麼,怎麼用,原理是什麼都沒有細說,因此特開一篇,記錄下SVD的學習筆記
參考:劉建平老師部落格 https://www.cnblogs.com/pinard/p/6251584.html
奇異值分解(SVD)原理與在降維中的應用
回顧特徵值和特徵向量
考研學習線代到最後的內容,也是考研的難點就是求一個矩陣特徵值,特徵向量,以及求正定矩陣,標準正交化。
但是因為要進行特徵分解,矩陣A必須為方陣。那麼如果A不是方陣,即行和列不相同時,我們還可以對矩陣進行分解嗎?
答案是可以,此時我們的SVD登場了。
SVD的定義
簡單來說,假設我們的矩陣A是一個m×n的矩陣,A的轉置和A做矩陣乘法,那麼會得到n×n的一個方陣ATA。既然ATA是方陣,那麼我們就可以進行特徵分解,
這樣我們就可以得到矩陣ATA的n個特徵值和對應的n個特徵向量v了。將ATA的所有特徵向量張成一個n×n的矩陣V,就是我們SVD公式裡面的V矩陣了。一般我們將V中的每個特徵向量叫做A的右奇異向量
如果我們將A和A的轉置做矩陣乘法,那麼會得到m×m的一個方陣AAT。既然AAT是方陣,那麼我們就可以進行特徵分解,
這樣我們就可以得到矩陣AAT的m個特徵值和對應的m個特徵向量u了。將AAT的所有特徵向量張成一個m×m的矩陣U,就是我們SVD公式裡面的U矩陣了。一般我們將U中的每個特徵向量叫做A的左奇異向量
U和V我們都求出來了,現在就剩下奇異值矩陣Σ沒有求出了。由於Σ除了對角線上是奇異值其他位置都是0,那我們只需要求出每個奇異值σ就可以了
我們注意到:
A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avi=σiui⇒σi=Avi/ui
這樣我們可以求出我們的每個奇異值,進而求出奇異值矩陣Σ。
進一步我們還可以看出我們的特徵值矩陣等於奇異值矩陣的平方,這樣也就是說,我們可以不用σi=Avi/ui來計算奇異值,也可以通過求出ATA的特徵值取平方根來求奇異值。
SVD的一些性質
對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。
就是說一個大的矩陣A可以用三個小的矩陣表示
SVD小結
SVD作為一個很基本的演算法,在很多機器學習演算法中都有它的身影,特別是在現在的大資料時代,由於SVD可以實現並行化,因此更是大展身手。SVD的原理不難,只要有基本的線性代數知識就可以理解,實現也很簡單因此值得仔細的研究。當然,SVD的缺點是分解出的矩陣解釋性往往不強,有點黑盒子的味道,不過這不影響它的使用。