NO IMAGE

原文連結UFLDL Tutorial PCA
PCA主成分分析(Principal Components Analysis)是重要的降低維度的方法,可以大大提高演算法執行的速度。PCA更是應用白化(whiten)的基礎,而whiten是許多演算法中重要的預處理步驟。

當你在對圖片進行演算法訓練時,圖片的畫素一般都有許多冗餘,因為相鄰畫素的關聯度很高,比如你訓練的圖片是16 x 16大小,那麼你的資料維度就達到16×16 = 256維,而PCA能將你的資料降維,而且幾乎不會帶來多少誤差。

例項

我們這裡的例子用的資料集是兩維的,我們將利用PCA將資料從2維降到1維(實際中是一般為256維降到50維..為了視覺化方便我們採用2維資料),如下圖所示
這裡寫圖片描述

這裡用的資料x1 和 x2都經過預處理,使其有相同的均值(0)和方差.為了描述方便,我們也人工地將資料進行了分類(不是採用機器學習分類方法)
,PCA演算法將我們的資料投影到一個低維子空間中,從視覺化的角度看,下圖中u1代表資料變數的主方向,u2代表次方向。
這裡寫圖片描述

也就是說,變數主要在u1和u2方向變化。為了更加正式地表達如何計算u1和u2,我們首先計算矩陣 Σ\Sigma:
這裡寫圖片描述
如果x的均值為0,那麼Σ\Sigma就是x的協方差矩陣。
u1和u2分別是協方差矩陣的第一和第二特徵向量。
可以用一些做線性代數運算的軟體求協方差矩陣的特徵向量。具體來說,我們可以利用計算得到的特徵向量形成特徵向量矩陣:
這裡寫圖片描述
式中,u1、u2…un 都是矩陣的特徵向量,其中u1是第一特徵向量。令λ1\lambda_1、λ2\lambda_2 ,,λn\lambda_n 為矩陣的特徵值。
在我們這個二維資料的例子中,可以重新以u1、u2作為基準座標系來表示資料。uT1xu_1^T x 表示x x 在 u1u_1上的投影。同理uT2xu_2^T x 表示x x 在 u2u_2上的投影。

旋轉資料

因此,我們可以將xx用(u1,u2)(u_1,u_2)表示為:
這裡寫圖片描述

我們對每個訓練資料都進行旋轉變換,可以得到如下圖所示資料:
這裡寫圖片描述
這是訓練集在旋轉到(u1,u2)(u_1,u_2) 座標下的圖示。UTxU^T x 可以將xx 旋轉到基準座標u1,u2,…,unu_1,u_2,…,u_n,UU是一個正交矩陣,滿足UUT=UTU=IU U^T= U^T U = I,因此可以將xrotx_{rot}復原為xx:
Uxrot=UUTx=xU x_{rot} = U U^T x = x

資料的降維

我們可以看到變數的主方向是xrotx_{rot}的第一維向量xrot,1x_{rot,1}。因此如果我們想將資料降為1維,我們可以令:
這裡寫圖片描述
更一般的來說,如果資料x∈Rnx\in R^n,若想要將資料降維至k維,我們可以將xrotx_{rot}的前k項作為降維後的資料。
另一種對PCA的解釋是,xrotx_{rot}是n維向量,越靠前的成分值越大(比如我們這個例子中,對於絕大多數樣本i x(i)rot,1=uT1x(i)x_{rot,1}^{(i)} = u_1^T x^{(i)} 要比x(i)rot,2=uT2x(i)x_{rot,2}^{(i)} = u_2^T x^{(i)} 大)。PCA就將xrotx_{rot}靠後的成分(更小)捨棄,將他們近似為0。具體來說,我們可以定義x¯\overline x 為xrotx_{rot} 前k維向量,有:
這裡寫圖片描述

我們這個例子中,可以繪出x¯\overline x 的圖示,(n=2,k=1):
這裡寫圖片描述

然而,因為最後n-k 維總是0,所以也沒必要保留這些資料,我們就令x¯\bar x為xrotx_{rot} 的前k維向量。所以我們也常說”保留前k 階主成分。

* 恢復資料的近似值*

現在,我們將x∈Rnx\in R^n 壓縮至 x¯∈Rk\bar x \in R^k。給定 x¯\bar x,我們如何將x¯\bar x 恢復到一個近似的原始值xx呢?從前文我們知道了,x=Uxrotx = Ux_{rot},此外我們可以把x¯\bar x看作是xrotx_{rot}的近似值,只不過我們把最後n-k維近似為0。因此,我們可以填充n-k維向量維0,然後再近似恢復資料為到xrot∈Rnx_{rot} \in R^n。所以有:
這裡寫圖片描述
實際應用中,我們不會真的用0擴充套件剩餘的n-k維,而是直接將x¯\bar x和U的前k維相乘,這樣可以避免很多和0相乘的運算。經過恢復運算,資料分佈如下圖所示:
這裡寫圖片描述
我們利用1維資料近似表示了原始的2維資料。

如果你在訓練一個自編碼器或者其他的非監督特徵學習演算法,你的演算法執行 時間會依賴於你的輸入維度大小。如果把資料從n降維到k,你的演算法執行速度會有很大的提高。對於許多資料集來說,x¯\bar x 對於 原始資料的近似已經足夠精確,利用PCA可以大幅提高執行速度而只引入一些很小的誤差。

應該剩下多少成分?

我們如何選擇k的值呢,需要留下多少成分呢? 本例的二維資料似乎顯然是選擇k=1,但是這不具有一般性,無法推廣到多維資料。如果k太大,我們壓縮不了多少資料, 極限狀態下,若k = n則我們就沒有對資料進行壓縮;如果k太小,我們就不能對原始資料有個很好的近似。

為了確定k的值,我們一般看不同k情況下的變數留存百分比(percentage of variance retained )。對於k = n,則我們對 原始資料有100%的近似,資料的變化都留存下來了。相反如果k=0,則我們近似資料都是0,因此0%的變化留存下來了。

更一般有,令 λ1,λ2…λn\lambda_1,\lambda_2\ldots\lambda_n 為Σ\Sigma的特徵值,λj\lambda_j對應於 uju_j,如果我們保留k 主成分,則 留存百分比 為:
這裡寫圖片描述

在我們這個2D的例子中,λ1=7.29\lambda_1 = 7.29,λ2=0.69\lambda_2= 0.69,因此k=1時,我們保留了變數的 7.29/(7.29 0.69)=0.9137.29/(7.29 0.69) = 0.913,也就是說變數留存百分比為91.3%。
變數留存百分比更正式的定義超出了本教程的內容。但是式子這裡寫圖片描述可以解釋一些內容,如果λj≈0\lambda_j \approx 0,則xrot,jx_{rot,j}通常也接近於0,我們將xrot,jx_{rot,j}近似為0,捨去了一些變數之間的相關性。這也解釋了為什麼我們留下前面(與λj\lambda_j值更大相關的特徵向量),而不是留下後面的那一部分。如果我們捨去排在前面的主成分xrot,jx_{rot,j}, 將導致更大的近似誤差。

對於影象的處理,一種通常的啟發式做法是選擇k保留99%的變化。也就是說,我們選擇最小的k,滿足:
這裡寫圖片描述
根據不同的應用,如果對圖片精度要求不高的話,也能取90~98%。當你向他人描述PCA的應用時說選擇k值保留95%的變化要比說保留120(無論是多少個)個成分要清楚明瞭得多。

PCA 在影象中的應用

為了讓PCA有效,我們一般希望每個特徵有相似的取值範圍(且均值接近於0)。如果你使用PCA在其他應用中,通過歸一化可以將每個特徵的均值為0 方差為1。但是對於絕大多種類的圖片來說,不進行這樣的預處理。特別地,假設我們在訓練我們的演算法應用於自然圖片,xjx_j代表第j個畫素。(自然圖片代表具體的人或動物在其生命週期的圖片)
注意:通常我們用的圖片都是戶外的,有草地、樹木等,然後從圖片中隨機的裁剪小尺寸(比如16 X 16 )的圖片進行訓練。但是實際中 大多數特徵學習演算法對於訓練的特定種類圖片有足夠的魯棒性,只要圖片不是太模糊,或者有什麼奇怪的人造物,演算法都能工作。
訓練自然圖片時,對於每一個畫素分別計算平均值和方差意義不大,因為統計上來說,圖片的一部分應該(理論上)和其他任何一部分一樣。這種圖片的屬性稱為平穩性(stationarity)
細節上來說,為了讓PCA工作有效,我們要求兩點:
1. 特徵均值近似為0;
2. 不同特徵方差近似;
對於一般的自然圖片,無需方差正規化,要求2自然滿足。(如果你在訓練音訊,或者是光譜圖,或者一些文字,我們一般也不會進行方差正規化。)。事實上,PCA與資料的縮放無關,它會返回相同的特徵向量。
所以我們不會進行方差正規化,我們唯一需要正規化的是均值,來確保特徵的均值大約為0。對於大部分應用來說我們不關心圖片整體是否明亮,比如說對於物體類別識別任務,圖片整體的明亮與否不會影響物品的種類。更正式的說法是,我們不關心一個圖片的平均亮度。因此我們可以直接 減去這個值,這也就是均值正規化的方法。具體的,如果x(i)∈Rnx^{(i)} \in R^n(灰度圖)是16×16圖片的亮度值,我們對每個圖片進行如下的正規化:
這裡寫圖片描述
這裡寫圖片描述
注意:這兩步是對每一個圖片x(i)x^{(i)} 進行的,u(i)u^{(i)} 是圖片x(i)x^{(i)}的平均亮度,這和每個畫素xjx_j的平均值不是一回事。
如果你不是訓練自然圖片,而是訓練手寫數字之類的圖片。可以考慮一些其他的正規化方法,根據不同應用要選擇不同的方法。但是當你訓練自然圖片時,上述方法是最常用的合理方法。