文章目錄
1. 什麼是PCA?
PCA全稱Principal Component Analysis,主成分分析。顧名思義,就是從原始數據中提取主要的成分進行分析,忽略掉那些不重要的信息。取之精華,去其糟粕。
2. 爲什麼用PCA?
在機器學習中,降維Dimentionalty Reduction是個主要的原因,這裏面有兩個目標:
-
降維的一個主要目的就是數據壓縮Data Compression。在機器學習中有大量的樣本,而且每個樣本有着大量的features。數據量非常大,導致存儲和內存的資源問題。這時通過降維,大幅度的縮減數據量,而且還能保持住feature之間很大的差異性。比如保持了95%的差異性,但是維度可能下降了100倍
-
降維的另一個目的就是可視化Visualization。因爲人類只能識別2D,3D的事物,而一個樣本的feature可能是很高的維度,因此就需要通過降維的手段,將高維降到2D或者3D,讓人們能夠直觀的看到效果,幫助人們很好地分析問題
另外,降維還能帶來兩個額外的好處:
- 捨棄了部分信息後,使樣本被採用的密度增大
- 當數據受到影響後,最小的特徵值所對應的向量往往與噪聲有關,將它們捨棄後,能在一定程度上起到了去噪的效果
3. PCA是如何工作的?
我們同樣以人類能夠理解的2D降到1D爲例解釋PCA的工作原理。在2D的空間中散步的一堆樣本(x, y),我們要尋找一條直線,使得這些樣本投影到該條直線上,那麼這些投影點,即爲降維後的新樣本。我們的座標系也從原來的(x, y)變爲現在的直線z。同樣的道理,如果要降到2D,那麼就是尋找一個平面,將原樣本投影到該平面上面,如下圖所示:
如果降低的維度大於3維了,實際上就是要找一個稱爲“超平面”的東西,將高維的數據投影到這個超平面上面。
這裏其實存在着多條直線或者多個超平面,那麼在使用PCA降維的過程中是如何選擇的呢?它必須滿足下面兩個條件:
- 最小投影誤差,即樣本點與其對應的超平面上的投影點的距離最短
- 最大投影方差,即樣本點在這個超平面上的投影點的分佈要儘量分開,方差最大
如下圖所示:
很明顯,右邊這條紅色的直線在投影距離和分佈上面都優於左邊的直線,因此這條紅色的直線就是我們新的座標系,投影在該直線上面的點即爲降維後的樣本。
PCA背後的意義:通過上兩個特質,我們可以這樣理解,PCA主要提取了原始數據中方差大的那部分成分,即主成分,放棄掉那些方差小的成分。因爲方差大,說明原樣本和新樣本之間的關係度高,方差小說明關係度低,那當然保留關係度高的那部分信息。
4. PCA算法是怎樣的?
輸入:
訓練集X(注意,只對訓練集進行PCA計算):
每個樣本feature的維度爲n,目標維度爲k,
處理過程:
-
1.對所有樣本進行歸一化:
注意: PCA提取的是樣本feature的主成分。對於,上標表示第i個樣本,下標表示第j個feature。按照上式的方法,對所有樣本進行歸一化。
-
2.計算樣本的協方差矩陣:
注意:爲一個nx1維的向量,如果擴展到m個樣本,那麼X爲nxm的矩陣。協方差矩陣如下,維度爲nxn: -
3.對協方差矩陣做特徵值分解,得到特徵值矩陣(eigenvectors):
注意: 提取矩陣特徵的兩種方法:特徵值分解和奇異值SVD分解。在實踐中,通常使用奇異值分解(SVD-Singluar Value Decomposition)代替特徵值分解,所以這裏我們只介紹SVD。
假設我們的樣本矩陣A是一個m×n的矩陣,其中m爲樣本個數,n爲feature數,那麼我們定義矩陣A的SVD爲:
,其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全爲0,主對角線上的每個元素都稱爲奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足。下圖可以很形象的看出上面SVD的定義:
對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。也就是說:
其中k小於n,也就是一個大的矩陣A可以用三個小的矩陣來表示。如下圖所示,現在我們的矩陣A只需要三個小矩陣就可以近似描述了。
- 4.特徵值分解後,取最大的k個特徵值對應的特徵向量:
**輸出:**得到新樣本矩陣:
這個矩陣和我們原來的m×n維樣本矩陣X相比,列數從n減到了k,即,feature從n維降到了k維。
另一方面,注意到PCA僅僅使用了我們SVD的右奇異矩陣,沒有使用左奇異矩陣,那麼左奇異矩陣有什麼用呢?假設我們的樣本是m×n的矩陣X,對於U只取前k列,即:
可以得到一個k×n的矩陣X‘,這個矩陣和我們原來的m×n維樣本矩陣X相比,行數從m減到了k,可見對行數進行了壓縮。也就是說,左奇異矩陣可以用於行數的壓縮。相對的,右奇異矩陣可以用於列數即特徵維度的壓縮,也就是我們的PCA降維
5. 如何重構經過PCA降維的數據?
上面推導瞭如何得到投影矩陣Z,那麼我們能否通過Z恢復出原始的X呢?那麼肯定有人要問:爲什麼要恢復出原始數據X呢?因爲這裏有個信息保留度的問題。比如,希望降維後的新樣本能夠保留原樣本95%的信息,即,只允許降維丟失5%的信息。那麼如何衡量這個保留度或者丟失度呢?這就需要下面的公式來計算:
該式表示至少要保留95%的信息,只允許損失5%的信息。式中的即爲我們需要從Z恢復回來的“原始數據”,畢竟信息有丟失,所以它只是近似的原始數據。
接下來看如何得到?
其實很簡單,仍然使用上面的右奇異矩陣,計算方法如下:
6. 如何選擇主成分的個數?
如果你要可視化,那麼很容易就確定降到的維度,無非就是2或者3。但是如果要真正地做特徵降維,那麼這個k是很難主觀確定出來的,但是從信息保留度的角度,這個就比較容易確定了,比如要保留99%的信息,然後據此來推斷出來k應該是多少。方法其實也簡單,就是通過上面提到的公式:
算法如下:
- 1.對於k,從1, 2, …逐個取值,然後計算
- 2.然後通過上面的公式計算比值是否小於0.01,如果不小於,就繼續取不同的值,如果滿足條件了,那麼當前取得值就是最終的k值
這種方法雖然可行,但是效率太低了。下面介紹一種更爲簡單的方法,就是利用SVD分解的三個矩陣中的。
在上面的推導中可知的維度是mxn,而且該矩陣的特點就是在主對角線上的元素爲奇異值(Singular Value),其他的元素全部爲0。
“對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。”
我們就是利用上面的特性來評估k的值,方法如下:
- 只計算對角線上k個奇異值的和,然後比上對角線上所有奇異值的和
- 它們的比例就是信息保留度,如果對於某個值k,可以滿足這個比例大於0.99了,那麼這個k值就是我們的主成分個數了
過程如下圖所示:
這種計算方法比上面那種效率要高很多。
7. 總結
以上,講述了什麼是PCA,解釋了爲什麼要用PCA,PCA的工作原理,以及如何選擇k值。本文中有不足的地方或者錯誤也請指出,比如那個“信息保留度”,這是我自己定義的,Andrew.Wu稱之爲差異性(比如,99% of variace is retained)。
8. sklearn中的PCA
在sklearn.decomposition模塊中封裝好了PCA的算法,下面簡單介紹下里面的主要參數:
- n_components: 即上面提到的k值,要降到的維度值。如果不填寫k,只是填寫一個[0, 1]的值的話,那麼它代表的就是信息保留率,比如填寫0.95,那就是保留95%的信息,而k值是該算法自動得到的
- svd_solver:裏面有4種方法,如果輸入數據比較大的話,選擇randomized,效率會比較高,具體使用場景,請閱讀說明sklearn.decomposition.PCA
主要屬性:
- components_:這裏保存的就是主成分,即
- explained_variance_:這裏保存的就是協方差
- explained_variance_ratio_:這裏保存的是協方差
- n_components_:這裏保存的就是k
- singular_values:這裏保存的就是奇異值
主要的函數:
- fit_transform(X): 它的作用就是將X降維後得到Z
- inverse_transform(Z): 它的作用就是將Z恢復爲
其他關係:
Z = np.dot(X, pca.components_.T) —投影后的新矩陣
X_approx = np.dot(Z, pca.components_) —得分矩陣
Resi = X - X_approx — 殘差矩陣