1. 程式人生 > >【轉載】主成分分析法(PCA)

【轉載】主成分分析法(PCA)

差異 投影 3D 方式 分享 alt 訓練 矩陣 9.png

https://www.jisilu.cn/question/252942

進行維數約減(Dimensionality Reduction),目前最常用的算法是主成分分析法 (Principal Componet Analysis, PCA)

使用主成分分析法進行數據的降維處理,具體的原理和過程是怎麽樣的呢?

下面讓我一一道來。

1 信息損失最少

例如這樣一些二維數據:

技術分享圖片

我們想要將數據降到一維,到底是圖中的紅線好呢還是綠線好呢?

技術分享圖片

降維就意味著信息的丟失,我們需要做的,就是盡可能將這樣的信息損失降低。

技術分享圖片

技術分享圖片

我們可以很直觀地看到,數據點和直線的距離就在降維的過程中丟失掉了。

顯然,綠線丟失的數據要比紅線多。

所以,我們可以判斷,使用紅線相比綠線會更好。

我們也註意到,投影到紅線上的藍點,離散的程度大於投影到綠線上的藍點,這也從另一個角度說明投影到紅線丟失的信息相對更少。

這個離散的程度,我們使用藍點之間的方差進行衡量:

技術分享圖片



其中:

技術分享圖片

為了方便計算,我們將所有的特征都減去該特征的均值,並依然用 a<sub>i</sub> 來表示,所以藍點之間的方差可以記為:

技術分享圖片

2 特征不相關

上面是二維降為一維的情況,只需要找到使得方差最大化的一個向量就可以了:

技術分享圖片

但是對於更高的維度,應該如何處理呢?例如三維降為二維。

當然我們可以首先找到一個使得投影方差最大方向,然後在這個基礎上,找到和這個方向不相關的另外一個使得投影方差最大的方向。

所謂的不相關,就是指第二個方向向量和第一個方向向量正交,體現在二維平面上就是垂直的關系:

技術分享圖片

我們先找到了使得投影方差最大方向,其方向向量為 u<sup>(1)</sup> ,然後找到了和它垂直的投影方差最大的方向,其方向向量為 u<sup>(2)</sup> 。

這裏兩個方向的相關程度,我們使用協方差進行衡量:

技術分享圖片



這裏的 a, b 均已減去特征的均值。

當協方差 Cov(a,b) = 0 的時候,兩個特征向量正交,也就是兩個特征不相關。

3 PCA的推導過程

假設我們的訓練數據有 m 行數據,有 n 個特征維度,那麽矩陣 X 是一個 m × n 的矩陣,可以表達為:

技術分享圖片

X 的協方差矩陣 C 可以通過以下公式得到:

技術分享圖片

那麽 C 為一個 n × n 的矩陣:

技術分享圖片

可以直觀地看到,協方差矩陣 C 是一個對稱矩陣,C<sub>ij</sub> = C<sub>ji</sub> ,對角線是各個特征的方差。

因為矩陣 C 是一個實對稱矩陣,所以 C 也具備一些實對稱矩陣的特征:

C 的不同特征值對應的特征向量是正交的;
C 的特征值都是實數,特征向量都是實向量;
C 可對角化,且相似對角陣上的元素即為矩陣本身特征值。

根據這些性質,我們可以得到 n 個線性無關的非零特征向量 e<sub>1</sub>, e<sub>2</sub>, … , e<sub>n</sub> ,這些特征向量構成的特征矩陣 E = ( e<sub>1</sub> e<sub>2</sub> … e<sub>n</sub> ) 滿足:

技術分享圖片

Λ 是一個對角矩陣,除了對角線有值,其他位置(空白處)都是 0 。

對於特征矩陣 X ,因為可能存在大量的冗余數據,我們將它轉換到另外一個特征空間,得到新的特征矩陣 Z:

技術分享圖片

我們希望這個特征空間中各個特征的彼此是線性無關的,也就是說希望各個特征向量是正交關系。

那麽在新的特征空間中,其協方差矩陣應該是一個對角矩陣:

技術分享圖片

對角線是方差,其他位置(空白處)是協方差。協方差為 0 ,代表著兩個向量正交。

假設特征空間轉換的過程可以表達為 Z = XU ,矩陣 D 代入該表達式可以得到:

技術分享圖片

也就是說 U = E ,U 就是矩陣 C 特征向量所組成的矩陣。矩陣 D 對角線上每個值就是矩陣 C 的特征值

如果我們把 D 中的特征值按照從大到小,將特征向量從左到右進行排序,然後取其中前 k 個,經過壓縮轉換(Z = XU),就得到了我們降維之後的數據矩陣 Z :

技術分享圖片

X 是 m × n 的矩陣, U 是 n × k 的矩陣,Z 是 m × k 的矩陣。

4 PCA的計算過程

第一步:首先對特征進行歸一化處理。

技術分享圖片

第二步:計算協方差矩陣。

技術分享圖片

第三步:計算協方差矩陣的特征向量並按照特征大從大到小排序。

技術分享圖片

第四步:提取特征向量矩陣的前 k 列。

技術分享圖片

第五步:通過矩陣乘法計算得到新的特征 Z 。其中計算的公式為:

技術分享圖片

至此我們算是完成了降維。

5 特征數 k 的選擇

不過有時候,降維的效果可能並不好。要麽可能維度壓縮不多,內存占用和計算速度依然沒有改善,要麽可能維度壓縮太過,信息丟失太大。

這其實取決於特征數 k 的選擇。

因為矩陣 U 中每個特征向量是相互正交的,矩陣 U 也是一個正交矩陣,所以有 UU<sup>T</sup> = E , E 為單位矩陣。

經過如下推導,我們可以反壓縮得到矩陣 X:

技術分享圖片

因為保留的特征數 k 小於 m,所以這個反壓縮得到的結果是不等於 X 的。

例如一維還原到二維,最終反壓縮得到的結果是:

技術分享圖片

而不是:

技術分享圖片

這是因為特征轉換的過程中,丟失了一部分的信息。

所以使用 X<sub>approx</sub> 進行標記更加合適:

技術分享圖片

有了 X<sub>approx</sub> ,其實我們就能計算信息丟失率:

技術分享圖片

如果損失小於 1%,那麽我們可以說保留了 99% 的差異性。

當然,差異性的百分比還有另外一個獲得,那就是前 k 個特征值之和除以所有的特征值之和。

因為我們已經對特征值進行了降序排序,所以前面 k 個特征應該能夠比較好的代表全部的特征。

註意,這個特征值是指對角矩陣對角線上的數值:

技術分享圖片

如果對於每個特征值,我們使用 S<sub>ii</sub> 進行標記,那麽公式就是:

技術分享圖片

大於 k 小於 m 部分的特征值,就是丟失的數據,所以信息丟失率也可以通過下面的公式計算:

技術分享圖片

我們需要做的,是設置一個差異性保留的百分比,然後從小到大對 k 進行遍歷,差異性滿足條件,k 就是我們要的結果。

例如計算得到的數據差異性百分比和 k 的關系如下:

k = 1 :60%
k = 2 :77%
k = 3 :88%
k = 4 :93%
k = 5 :97%
k = 6 :99%

如果我們要保留 90% 的數據,那麽 k 的取值應該是 4 ;
如果我們要保留 99% 的數據,那麽 k 的取值應該是 6 。

6 關於PCA的註意事項

註意一:如果使用了PCA對訓練集的數據進行了處理,那麽對於驗證集和測試集也需要進行相對應的處理。

我們在處理訓練集的過程中得到了特征的均值 μ 和方差 σ ,以及特征向量 U ,我們需要使用這些參數先對數據進行歸一化處理,然後轉換到新的特征空間。

註意二:在使用PCA進行壓縮之前,先使用原數據進行訓練,這樣我們才能對比壓縮前後的效果。

如果不是占用內存空間太大,或者算法運行速度過慢,其實沒有必要進行壓縮。

註意三:不要使用PCA來避免過度擬合。

因為通過這樣的方式皮避免度擬合,不僅效果很差,並且會丟失部分數據。

【轉載】主成分分析法(PCA)