奇異值分解(SVD)原理與在降維中的應(yīng)用
奇異值分解(Singular Value Decomposition,以下簡稱SVD)是在機器學(xué)習(xí)領(lǐng)域廣泛應(yīng)用的算法,它不光可以用于降維算法中的特征分解,還可以用于推薦系統(tǒng),以及自然語言處理等領(lǐng)域。是很多機器學(xué)習(xí)算法的基石。本文就對SVD的原理做一個總結(jié),并討論在在PCA降維算法中是如何運用運用SVD的。
1. 回顧特征值和特征向量
我們首先回顧下特征值和特征向量的定義如下: A x = λ x Ax=\lambda x Ax=λx
其中A是一個 n × n n \times n n×n的矩陣,x是一個n維向量,則我們說 λ \lambda λ是矩陣A的一個特征值,而x是矩陣A的特征值 λ \lambda λ所對應(yīng)的特征向量。
求出特征值和特征向量有什么好處呢? 就是我們可以將矩陣A特征分解。如果我們求出了矩陣A的n個特征值 λ 1 ≤ λ 2 ≤ . . . ≤ λ n \lambda_1 \leq \lambda_2 \leq ... \leq \lambda_n λ1?≤λ2?≤...≤λn?,以及這n個特征值所對應(yīng)的特征向量 { w 1 , w 2 , . . . w n } \{w_1,w_2,...w_n\} {w1?,w2?,...wn?},那么矩陣A就可以用下式的特征分解表示: A = W Σ W ? 1 A=W\Sigma W^{-1} A=WΣW?1
其中W是這n個特征向量所張成的 n × n n \times n n×n維矩陣,而 Σ \Sigma Σ為這n個特征值為主對角線的 n × n n \times n n×n維矩陣。
一般我們會把W的這n個特征向量標(biāo)準(zhǔn)化,即滿足 ∣ ∣ w i ∣ ∣ 2 = 1 ||w_i||_2 =1 ∣∣wi?∣∣2?=1, 或者說 w i T w i = 1 w_i^Tw_i =1 wiT?wi?=1,此時W的n個特征向量為標(biāo)準(zhǔn)正交基,滿足 W T W = I W^TW=I WTW=I,即 W T = W ? 1 W^T=W^{-1} WT=W?1, 也就是說W為酉矩陣。
這樣我們的特征分解表達(dá)式可以寫成 A = W Σ W T A=W\Sigma W^T A=WΣWT
注意到要進(jìn)行特征分解,矩陣A必須為方陣。那么如果A不是方陣,即行和列不相同時,我們還可以對矩陣進(jìn)行分解嗎?答案是可以,此時我們的SVD登場了。
2. SVD的定義
SVD也是對矩陣進(jìn)行分解,但是和特征分解不同,SVD并不要求要分解的矩陣為方陣。假設(shè)我們的矩陣A是一個 m × n m \times n m×n的矩陣,那么我們定義矩陣A的SVD為: A = U Σ V T A = U\Sigma V^T A=UΣVT
其中U是一個 m × m m \times m m×m的矩陣, Σ \Sigma Σ是一個 m × n m \times n m×n的矩陣,除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個 n × n n \times n n×n的矩陣。U和V都是酉矩陣,即滿足 U T U = I , V T V = I U^TU=I, V^TV=I UTU=I,VTV=I。下圖可以很形象的看出上面SVD的定義:
那么我們?nèi)绾吻蟪鯯VD分解后的U, Σ \Sigma Σ, V這三個矩陣呢?
如果我們將A的轉(zhuǎn)置和A做矩陣乘法,那么會得到 n × n n \times n n×n的一個方陣 A T A A^TA ATA。既然 A T A A^TA ATA是方陣,那么我們就可以進(jìn)行特征分解,得到的特征值和特征向量滿足下式: ( A T A ) v i = λ i v i (A^TA)v_i = \lambda_i v_i (ATA)vi?=λi?vi?
這樣我們就可以得到矩陣 A T A A^TA ATA的n個特征值和對應(yīng)的n個特征向量v了。將 A T A A^TA ATA的所有特征向量張成一個 n × n n \times n n×n的矩陣V,就是我們SVD公式里面的V矩陣了。一般我們將V中的每個特征向量叫做A的右奇異向量。
如果我們將A和A的轉(zhuǎn)置做矩陣乘法,那么會得到 m × m m \times m m×m的一個方陣 A A T AA^T AAT。既然 A A T AA^T AAT是方陣,那么我們就可以進(jìn)行特征分解,得到的特征值和特征向量滿足下式: ( A A T ) u i = λ i u i (AA^T)u_i = \lambda_i u_i (AAT)ui?=λi?ui?
這樣我們就可以得到矩陣 A A T AA^T AAT的m個特征值和對應(yīng)的m個特征向量u了。將 A A T AA^T AAT的所有特征向量張成一個 m × m m \times m m×m的矩陣U,就是我們SVD公式里面的U矩陣了。一般我們將U中的每個特征向量叫做A的左奇異向量。
U和V我們都求出來了,現(xiàn)在就剩下奇異值矩陣 Σ \Sigma Σ沒有求出了。由于 Σ \Sigma Σ除了對角線上是奇異值其他位置都是0,那我們只需要求出每個奇異值 σ \sigma σ就可以了。
我們注意到: A = U Σ V T ? A V = U Σ V T V ? A V = U Σ ? A v i = σ i u i ? σ i = A v i u i A=U\Sigma V^T \Rightarrow AV=U\Sigma V^TV \Rightarrow AV=U\Sigma \Rightarrow Av_i = \sigma_i u_i \Rightarrow \sigma_i = \frac {Av_i} {u_i} A=UΣVT?AV=UΣVTV?AV=UΣ?Avi?=σi?ui??σi?=ui?Avi??
這樣我們可以求出我們的每個奇異值,進(jìn)而求出奇異值矩陣 Σ \Sigma Σ。
上面還有一個問題沒有講,就是我們說 A T A A^TA ATA的特征向量組成的就是我們SVD中的V矩陣,而 A A T AA^T AAT的特征向量組成的就是我們SVD中的U矩陣,這有什么根據(jù)嗎?這個其實很容易證明,我們以V矩陣的證明為例。 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 \Rightarrow A^T=V\Sigma U^T \Rightarrow A^TA =V\Sigma U^TU\Sigma V^T = V\Sigma^2V^T A=UΣVT?AT=VΣUT?ATA=VΣUTUΣVT=VΣ2VT
上式證明使用了: U T U = I , Σ T = Σ U^TU=I, \Sigma^T=\Sigma UTU=I,ΣT=Σ??梢钥闯?span id="n5n3t3z" class="katex--inline"> A T A A^TA ATA的特征向量組成的的確就是我們SVD中的V矩陣。類似的方法可以得到 A A T AA^T AAT的特征向量組成的就是我們SVD中的U矩陣。
進(jìn)一步我們還可以看出我們的特征值矩陣等于奇異值矩陣的平方,也就是說特征值和奇異值滿足如下關(guān)系: σ i = λ i \sigma_i = \sqrt{\lambda_i} σi?=λi??
這樣也就是說,我們可以不用 σ i = A v i u i \sigma_i =\frac {Av_i}{u_i} σi?=ui?Avi??來計算奇異值,也可以通過求出 A T A A^TA ATA的特征值取平方根來求奇異值。
3. SVD計算舉例
這里我們用一個簡單的例子來說明矩陣是如何進(jìn)行奇異值分解的。我們的矩陣A定義為:
A = ( 0 1 1 1 1 0 ) \mathbf{A} = \left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1&0 \end{array} \right) A= ?011?110? ?
我們首先求出 A T A A^TA ATA和 A A T AA^T AAT
A T A = ( 0 1 1 1 1 0 ) ( 0 1 1 1 1 0 ) = ( 2 1 1 2 ) \mathbf{A^TA} = \left( \begin{array}{ccc} 0& 1 &1\\ 1&1&0 \end{array} \right) \left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1&0 \end{array} \right) = \left( \begin{array}{ccc} 2& 1 \\ 1&2 \end{array} \right) ATA=(01?11?10?) ?011?110? ?=(21?12?)
A A T = ( 0 1 1 1 1 0 ) ( 0 1 1 1 1 0 ) = ( 1 1 0 1 2 1 0 1 1 ) \mathbf{AA^T} = \left( \begin{array}{ccc} 0& 1\\ 1& 1\\ 1&0 \end{array} \right) \left( \begin{array}{ccc} 0& 1 &1\\ 1&1&0 \end{array} \right) = \left(\begin{array}{ccc} 1& 1 &0\\1& 2 &1\\ 0& 1&1 \end{array} \right) AAT= ?011?110? ?(01?11?10?)= ?110?121?011? ?
進(jìn)而求出 A T A A^TA ATA的特征值和特征向量: λ 1 = 3 ; v 1 = ( 1 2 1 2 ) ; λ 2 = 1 ; v 2 = ( ? 1 2 1 2 ) \lambda_1= 3; v_1 = \left( \begin{array}{ccc} \frac {1} {\sqrt{2}} \\ \frac {1} {\sqrt{2}}\end{array} \right); \lambda_2= 1; v_2 = \left( \begin{array}{ccc} \frac {-1}{\sqrt{2}} \\ \frac {1} {\sqrt{2}}\end{array} \right) λ1?=3;v1?=(2?1?2?1??);λ2?=1;v2?=(2??1?2?1??)
接著求 A A T AA^T AAT的特征值和特征向量:
λ 1 = 3 ; u 1 = ( 1 6 2 6 1 6 ) ; λ 2 = 1 ; u 2 = ( 1 2 0 ? 1 2 ) ; λ 3 = 0 ; u 3 = ( 1 3 ? 1 3 1 3 ) \lambda_1= 3; u_1 = \left( \begin{array}{ccc} \frac {1} {\sqrt{6}}\\ \frac {2} {\sqrt{6}} \\ \frac {1} {\sqrt{6}}\end{array} \right); \lambda_2= 1; u_2 = \left( \begin{array}{ccc} \frac {1} {\sqrt{2}} \\ 0 \\ \frac {-1} {\sqrt{2}}\end{array} \right); \lambda_3= 0; u_3 = \left( \begin{array}{ccc} \frac {1} {\sqrt{3}} \\ \frac {-1} {\sqrt{3}}\\ \frac {1} {\sqrt{3}}\end{array} \right) λ1?=3;u1?= ?6?1?6?2?6?1?? ?;λ2?=1;u2?= ?2?1?02??1?? ?;λ3?=0;u3?= ?3?1?3??1?3?1?? ?
利用 A v i = σ i u i , i = 1 , 2 Av_i = \sigma_i u_i, i=1,2 Avi?=σi?ui?,i=1,2求奇異值:
( 0 1 1 1 1 0 ) ( 1 2 1 2 ) = σ 1 ( 1 6 2 6 1 6 ) ? σ 1 = 3 \left(\begin{array}{ccc} 0& 1\\1& 1\\ 1&0 \end{array} \right) \left( \begin{array}{ccc} \frac {1} {\sqrt{2}} \\ \frac {1} {\sqrt{2}}\end{array} \right) = \sigma_1 \left( \begin{array}{ccc} \frac {1} {\sqrt{6}} \\\frac {2} {\sqrt{6}} \\ \frac {1} {\sqrt{6}}\end{array} \right)\Rightarrow \sigma_1=\sqrt{3} ?011?110? ?(2?1?2?1??)=σ1? ?6?1?6?2?6?1?? ??σ1?=3?
( 0 1 1 1 1 0 ) ( ? 1 2 1 2 ) = σ 2 ( 1 2 0 ? 1 2 ) ? σ 2 = 1 \left( \begin{array}{ccc} 0& 1\\1& 1\\1&0 \end{array} \right) \left( \begin{array}{ccc} \frac {-1} {\sqrt{2}}\\ \frac {1} {\sqrt{2}} \end{array} \right) = \sigma_2 \left( \begin{array}{ccc} \frac {1} {\sqrt{2}} \\ 0 \\ \frac {-1} {\sqrt{2}}\end{array} \right)\Rightarrow \sigma_2=1 ?011?110? ?(2??1?2?1??)=σ2? ?2?1?02??1?? ??σ2?=1
當(dāng)然,我們也可以用 σ i = λ i \sigma_i = \sqrt{\lambda_i} σi?=λi??直接求出奇異值為 3 \sqrt{3} 3?和1.
最終得到A的奇異值分解為: A = U Σ V T = ( 1 6 1 2 1 3 2 6 0 ? 1 3 1 6 ? 1 2 1 3 ) ( 3 0 0 1 0 0 ) ( 1 2 1 2 ? 1 2 1 2 ) A=U\Sigma V^T = \left( \begin{array}{ccc} \frac {1} {\sqrt{6}} & \frac {1} {\sqrt{2}} & \frac {1} {\sqrt{3}}\\\frac {2} {\sqrt{6}} & 0 & \frac {-1} {\sqrt{3}}\\ \frac {1} {\sqrt{6}} & \frac {-1} {\sqrt{2}} & \frac {1} {\sqrt{3}}\end{array} \right) \left( \begin{array}{ccc} \sqrt{3} & 0 \\ 0 & 1\\ 0 & 0 \end{array} \right) \left( \begin{array}{ccc} \frac {1} {\sqrt{2}}& \frac {1} {\sqrt{2}}\\ \frac {-1} {\sqrt{2}}& \frac {1} {\sqrt{2}}\end{array} \right) A=UΣVT= ?6?1?6?2?6?1??2?1?02??1??3?1?3??1?3?1?? ? ?3?00?010? ?(2?1?2??1??2?1?2?1??)
4. SVD的一些性質(zhì)
上面幾節(jié)我們對SVD的定義和計算做了詳細(xì)的描述,似乎看不出我們費這么大的力氣做SVD有什么好處。那么SVD有什么重要的性質(zhì)值得我們注意呢?
對于奇異值,它跟我們特征分解中的特征值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應(yīng)的左右奇異向量來近似描述矩陣。也就是說: 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×n?Vn×nT?≈Um×k?Σk×k?Vk×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?來表示。如下圖所示,現(xiàn)在我們的矩陣A只需要灰色的部分的三個小矩陣就可以近似描述了。
由于這個重要的性質(zhì),SVD可以用于PCA降維,來做數(shù)據(jù)壓縮和去噪。也可以用于推薦算法,將用戶和喜好對應(yīng)的矩陣做特征分解,進(jìn)而得到隱含的用戶需求來做推薦。同時也可以用于NLP中的算法,比如潛在語義索引(LSI)。下面我們就對SVD用于PCA降維做一個介紹。
5. SVD用于PCA
在主成分分析(PCA)原理總結(jié)中,我們講到要用PCA降維,需要找到樣本協(xié)方差矩陣 X T X X^TX XTX的最大的d個特征向量,然后用這最大的d個特征向量張成的矩陣來做低維投影降維??梢钥闯觯谶@個過程中需要先求出協(xié)方差矩陣 X T X X^TX XTX,當(dāng)樣本數(shù)多樣本特征數(shù)也多的時候,這個計算量是很大的。
注意到我們的SVD也可以得到協(xié)方差矩陣 X T X X^TX XTX最大的d個特征向量張成的矩陣,但是SVD有個好處,有一些SVD的實現(xiàn)算法可以不求先求出協(xié)方差矩陣 X T X X^TX XTX,也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解,而是做SVD來完成。這個方法在樣本量很大的時候很有效。實際上,scikit-learn的PCA算法的背后真正的實現(xiàn)就是用的SVD,而不是我們我們認(rèn)為的暴力特征分解。
另一方面,注意到PCA僅僅使用了我們SVD的右奇異矩陣,沒有使用左奇異矩陣,那么左奇異矩陣有什么用呢?
假設(shè)我們的樣本是 m × n m \times n m×n的矩陣X,如果我們通過SVD找到了矩陣 X X T XX^T XXT最大的d個特征向量張成的 m × d m\times d m×d維矩陣U,則我們?nèi)绻M(jìn)行如下處理: X d × n ′ = U d × m T X m × n X'_{d\times n} = U_{d \times m}^TX_{m \times n} Xd×n′?=Ud×mT?Xm×n?
可以得到一個 d × n d \times n d×n的矩陣X‘,這個矩陣和我們原來的 m × n m\times n m×n維樣本矩陣X相比,行數(shù)從m減到了k,可見對行數(shù)進(jìn)行了壓縮。也就是說,左奇異矩陣可以用于行數(shù)的壓縮。相對的,右奇異矩陣可以用于列數(shù)即特征維度的壓縮,也就是我們的PCA降維。文章來源:http://www.zghlxwxcb.cn/news/detail-424661.html
6. SVD小結(jié)
SVD作為一個很基本的算法,在很多機器學(xué)習(xí)算法中都有它的身影,特別是在現(xiàn)在的大數(shù)據(jù)時代,由于SVD可以實現(xiàn)并行化,因此更是大展身手。SVD的原理不難,只要有基本的線性代數(shù)知識就可以理解,實現(xiàn)也很簡單因此值得仔細(xì)的研究。當(dāng)然,SVD的缺點是分解出的矩陣解釋性往往不強,有點黑盒子的味道,不過這不影響它的使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-424661.html
到了這里,關(guān)于奇異值分解(SVD)原理與在降維中的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!