SVD
定義
假設\(A\)為\(M\times N\)矩陣,則存在\(M\times M\)維正交矩陣\(U=[u_1,u_2,\cdots,u_m]\),\(N\times N\)維正交矩陣\(V=[v_1,v_2,\cdots,v_n]\)和\(M\times N\)對角矩陣\(\Sigma=diag{\sigma_1,\sigma_2,\cdots,\sigma_p}\),使得\(A=U^T\Sigma V\),這種矩陣分解形式成為\(A\)的奇異值分解(SVD),而\(\sigma_i\)稱作\(A\)的奇異值。
解釋
\(M\times N\)的矩陣\(A\)可以看做是\(M\times N\)維線性空間的一個向量。這樣我們總能選擇\(M\times N\)個基向量將該矩陣展開。最簡單的一組基可以選成\(e(i,j)\),即只在第\(i\)行第\(j\)列元素值為1,其余元素均為0的矩陣。這樣任意矩陣在這組基下的展開系數剛好就是對應矩陣元素。
理論上來說任選一組完備的基向量都可以用來展開該線性空間中所有的向量,不過對於不同的情況,展開系數的復雜度可能差別非常大。所以我們一般希望根據不同的情況來選擇不同的基向量,好比三維空間中的直角坐標,球坐標,柱坐標這些。而SVD分解就給我們提供了一種根據給定矩陣\(A\)來選取比較合適的基向量的做法,同時也給出了矩陣\(A\)在這組基向量下的展開系數。
另外,我們知道\(M\times N\)維空間可以由\(M\)維空間和\(N\)維空間做張量積得到,而對應的基向量也是由\(M\)維空間和\(N\)維空間的基向量做張量積得到。由於矩陣\(U\)和\(V\)都是正交的,所以他們的列向量構成了\(M\)維和\(N\)維空間的基向量。故\( u_i v_j^T\)(注意下標不一樣)構成\(M\times N\)維空間的一組基向量,而\(\Sigma\)則是用該組基向量展開\(A\)得到的系數,可以認為是基向量的權重。
可見此時\(\Sigma\)最多只有\(p\)個非零值,對應的基向量為\( u_i v_i^T\)。相比用\(e(i,j)\)展開要簡單很多。根據矩陣乘法易知,\(A=\sum_{i=1}^{r}\sigma_i u_i v_i^T\),給定了\(U\)和\(V\),\(A\)就完全由奇異值\(\sigma_i\)來決定,這樣我們可以選擇丟掉某些很小的奇異值以取得壓縮數據的效果。
應用
SVD最主要的應用就是對數據進行壓縮,只保留最主要的數據。由\(A=\sum_{i=1}^{r}\sigma_i u_i v_i^T\)可知,最多只需要存儲矩陣\(U\)和\(V\)的各\(r\)個列向量以及\(r\)個奇異值便可以完全恢復出\(A\)。如果還嫌\(r\)太大,則可以只保留最大的前\(p\)個奇異值及其對應的\(U\)和\(V\)的列向量,因為奇異值\(\sigma_i\)的大小代表了對應基向量\(u_iv_i^{T}\)的權重。
另外, 從等式\(A=U^T\Sigma V\)可以導出兩個矩陣\(A_1=AV^T=U^T\Sigma=\sum_{i=1}^{r}\sigma_i u_i\)和\(A_2=UA=\Sigma V=\sum_{i=1}^{r}\sigma_i v_i^T\)。這兩個矩陣可以認為是對原始矩陣\(A\)進行了列/行壓縮得到的\(M\times r\)和\(r\times N\)矩陣。該方法可以用來替代下文提到的PCA對數據進行處理,比如scikit-learn中的pca算法就是基於SVD實現的。事實上,通過簡單的矩陣運算可以看出,SVD和PCA是完全等價的(考慮\(AA^{T}=U^T\Sigma V(U^T\Sigma V)^T=U^T\Sigma\Sigma^TU\),剛好與PCA相同)
PCA
已知\(M\times N\)維數據矩陣\(X=[x_1,x_2,\cdots,x_N]\),其中\(x_i\)是長度為\(M\)的列向量。我們想要把數據在保留主要信息的情況下進行壓縮,方式是尋找一個線性變換 \(V\),令\(Y=VX\),變換后的數據\(Y\)應該可以比較清晰的表征出各個數據包含的信息量,使刪除某些數據成為可能。我們可以用PCA方法來尋找\(V\),和SVD不同,PCA的思路是計算\(X\)的協方差矩陣,然后對其進行對角化,尋找協方差矩陣的主軸方向(特征向量),認為主軸長度(即特征值)大的方向上方差也大,從而對應數據信息量也很大。對於較小的主軸長度,可以將其忽略而不至於對數據造成太大影響。具體做法如下:
假設\(X\)已經是去中心化的,那么\(X\)的協方差矩陣\(C=XX^T\)或\(C=X^TX\)。后面可以看到\(C\)的不同表示方式實際上實現了對\(X\)不同維度的數據壓縮(即對數據點數和特征數做壓縮)。我們以前者為例,則\(C\)是\(M\times M\)的矩陣。
接下來,對\(C\)進行相似對角化,即求出其\(M\)個特征值\(\lambda_1 \sim \lambda_M\)及其對應特征向量\(v_1 \sim v_M\),這里假設特征值和特征向量已經按從大到小的順序進行排列。我們令\(V=[v_1,v_2,\cdots,v_M]\),計算\(Y=V^TX=[y_1,y_2,\cdots,y_n]\),其中\(y_i=[v_1^Tx_i,v_2^Tx_i,\cdots, v_m^Tx_i]\)。\(Y\)就是我們想要尋找的數據的新的表示形式。易知\(Y\)滿足如下性質:
- \(y_i\)互不相關,即\(YY^T\)為對角陣(\(YY^T=(V^TX)(V^TX)^T=V^T(XX^T)V\),剛好是\(C\)的相似對角化矩陣)
- 若\(i>j\)則\(var(y_i)>var(y_j)\)(\(var(y_i)\)是特征值,已經從大到小排列)
\(Y\)的計算過程可以認為是把原始數據往各個“主軸”方向上進行投影,而主軸長度則用來衡量各個主軸的權重。這樣,權重較小的那些指標就可以被忽略。具體操作起來就是在\(Y\)中刪去對應較小特征值的那些特征向量,比如只保留\(r\)個特征向量,那么最后得到的\(y_i\)的長度也只有\(r\),矩陣\(Y\)是\(r*N\)的,相比之前的\(X\),實現了在第一維上面的壓縮。此外,注意到協方差矩陣是對稱陣,所以\(V\)是正交矩陣,要想恢復原始數據,可以直接計算\(X=V^TY=V^TVX\)。當\(V\)已經刪除若干特征向量后,恢復的數據也會相應變得簡單。
如前所述,如果需要對\(X\)的另一維進行壓縮,只需要計算協方差矩陣\(X^TX\)即可。
SVD和PCA的區別
SVD直接對數據進行分解,不需要數據是方陣。PCA方法需要先求出數據的協方差矩陣(是個方陣),然后對其做特征值分解。此外,用SVD可以直接實現對行/列的壓縮,分別對應對數據特征指標和數據量的壓縮。而PCA要想實現對行/列的壓縮,需要分別求協方差矩陣\(XX^T\)和\(X^TX\)。
KPCA
KPCA是為了解決原始數據結構較為復雜,從而線性不可分的情況而發展出來的一種方法。和SVM一樣,它也是利用核函數將已知低維數據映射到高維,然后在高維做PCA。整個高維空間的計算過程涉及內積運算,可以利用核函數在原空間進行計算。
待壓縮數據\(X\)同上文,我們選擇一個核函數\(Z: R^M\times R^M \mapsto R\)使得\(Z(x_i,x_j)=<\Phi(x_i),\Phi(x_j)>\)對所有\(x_i,j \in R^M\)均成立。其中\(\Phi\)定義為\(\Phi:R^M \mapsto F\),將\(R^M\)中的元素\(x\)映射為定義了內積\(<,>\)的希爾伯特空間\(F\)(可能是無窮維的)中的元素\(\Phi(x)\)。\(F\)又叫做特征空間。接下來證明可以無論\(F\)的維度是多少,都可以在其中對數據做PCA。
假設還是打算壓縮數據的第一維,即把數據縮減成\(r\times N\)的。根據PCA方法,數據\(X\)在\(F\)空間內的協方差矩陣可以表示為:
\(\bar{C}=\Phi(X)\Phi(X)^T=\sum_{j=1}^{N}\Phi(x_j)\Phi(x_j)^T\)
注意這時矩陣\(\bar{C}\)不再是\(M\times M\)的,而有可能是無窮維的。所以直接對角化行不通,需要尋求變通的方法。
\(\bar{C}\)的特征向量\(v\)滿足方程:
\(\bar{C}v=\lambda v\)
將\(\bar{C}=\sum_{j=1}^{N}\Phi(x_j)\Phi(x_j)^T\)帶入上式可得:
\(v=\frac{1}{\lambda}\sum_{j=1}^{N}\Phi(x_j)<\Phi(x_j),v>\)
可見特征向量\(v\)屬於向量\(\Phi(x_j)\)張成的子空間,因此至多有\(N\)個線性無關的特征向量。
考慮等價的方程:
\(\lambda <\Phi(x_j),v>=<\Phi(x_j),\bar{C}v>\)
然后把\(v\)表示成\(\Phi(x_j)\)的展開形式:
\(v=\sum_{j=1}^{N}\alpha_j\Phi(x_j)\)
將上式代入等價的特征值方程可得:
\(\lambda K\alpha=K^2\alpha\)
其中\(K\)是\(N\times N\)矩陣,滿足\(K_{ij}=<\Phi(x_i),\Phi(x_j)>\),\(\alpha=[\alpha_1,\alpha_2,\cdots,\alpha_N]\)
所以,我們通過求解特征值方程\(\lambda\alpha=K\alpha\),便可以求出\(\lambda\)和\(\alpha\)。顯然滿足\(\lambda\alpha=K\alpha\)的解必然滿足\(\lambda K\alpha=K^2\alpha\),而且可以證明后者的附加解並不會對展開式\(v=\sum_{j=1}^{N}\alpha_j\Phi(x_j)\)有影響。另外, 展開式中的系數\(\alpha_j\)剛好就是高維空間\(F\)中原始數據往主軸方向的投影,即壓縮后的數據。這樣,我們將原本的求解\(\bar{C}\)的特征向量\(v\)的問題轉化成為等價地求\(K\)的特征向量\(\alpha\),求出了\(\alpha\)便得到了壓縮后的數據。但是需要厘清的是\(K\)的的特征值並不是主軸,主軸仍然是\(v\),\(K\)的意義只是在於幫助我們計算\(F\)空間上的數據\(\Phi(x)\)在\(v\)上的投影。
通過令\(<v,v>=1\),我們可以把對應的特征向量\(\alpha\)進行歸一化:
\(1=<v,v>=\sum_{i,j=1}^{N}\alpha_i\alpha_j<\Phi(x_i),\Phi(x_j)>=<\alpha,K\alpha>=\lambda<\alpha,\alpha>\)
對於任意新的數據點\(\Phi(x')\),它在主軸\(v\)上的投影為:
\(<v,\Phi(x')>=\sum_{j=1}^N\alpha_j<\Phi(x_j),\Phi(x')>\)
可見在\(F\)空間進行PCA分解只涉及到計算內積\(<\Phi(x_i),\Phi(x_j)>\),而這個可以在原空間用核函數計算,所以KPCA是可行的。
最后,考慮到在上述推導中,我們假設數據已經是在\(F\)空間上去中心化的,所以對於任意數據還需要對\(\Phi(X)\)進行去中心化。但是由於\(\Phi(X)\)的具體形式未知,所以實際執行起來有困難。解決方法是轉而對\(K\)進行去中心化:
去中心化后的數據為\(\Phi^c(x)=\Phi(x)-\frac{1}{N}\sum_{i=1}^N\Phi(x_i)\),據此計算去中心化的矩陣\(K^c_{ij}=<\Phi^c(x_i),\Phi^c(x_j)>\)
將\(\Phi^c(x)\)的表達式代入並利用內積的線性性質,最后可得:
\(k^c=K-1_NK-K1_N+1_NK1_N\)
其中\(1_N\)即所有元素都為\(1/N\)的\(N\times N\)矩陣。
個人覺得KPCA方法的兩個關鍵點一是把協方差矩陣的特征向量\(v\)表示成數據\(\Phi(x)\)的線性疊加,一是利用PCA中壓縮后的數據並不是來自特征向量\(v\),而是來自數據往\(v\)上的投影,即\(<v,\Phi(x)>\)。和PCA不同,KPCA雖然原理上還是要利用協方差矩陣的主軸對數據進行篩選,但是具體計算時並沒有對其做分解,而是利用上述兩點轉而計算矩陣\(K\)。注意原空間的協方差矩陣和\(K\)
的維度是不同的,一個是\(M\times M\),另一個是\(N\times N\)。在映射到高維空間時,協方差矩陣可能成為無窮維,而數據壓縮實際上是在\(K\)對應的那一維上進行的。比如,有100組二維數據,想要壓縮到1維,PCA是計算\(2\times 2\)的協方差矩陣的特征值,而KPCA則是計算\(100\times 100\)的\(K\)矩陣的特征值,但是會丟棄99個特征向量,只保留1個最長的主軸。
PPCA與FA
這部分內容在MLAPP書中第12章有詳細的介紹,這里不再大篇幅的討論,只是捎帶着提一下。可以認為PCA是PPCA(Probabilistic PCA )的一種特殊情況,而PPCA又是FA(factor analysis)的一種特殊情況,他們都屬於線性潛變量模型,即認為觀測到的高維變量其實是由低維的潛變量通過某個廣義線性模型生成的(這種低維→高維的映射,可以類比三維空間的曲線方程,一維自變量\(t\)被映射為三維函數值\(\mathbf{y}\)),我們的目的是通過觀測值(高維)推測背后的潛變量(低維),這樣也就實現了數據壓縮的效果。
上文提到PCA是選定若干個主軸,把原始數據往這些主軸上投影來得到壓縮后的數據,而PPCA和PCA的不同點在於把原始數據往主軸上投影的時候不一定采用正交投影的方法。
PS:MLAPP第12章還提到了Independent Component Analysis (ICA) ,也可以跟PCA做下對照。
