機器學習 -- PCA(Principal Component Analysis)


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,那麼就是尋找一個平面,將原樣本投影到該平面上面,如下圖所示:

image.png-98.2kB

如果降低的維度大於3維了,實際上就是要找一個稱爲“超平面”的東西,將高維的數據投影到這個超平面上面。

這裏其實存在着多條直線或者多個超平面,那麼在使用PCA降維的過程中是如何選擇的呢?它必須滿足下面兩個條件:

  • 最小投影誤差,即樣本點與其對應的超平面上的投影點的距離最短
  • 最大投影方差,即樣本點在這個超平面上的投影點的分佈要儘量分開,方差最大

如下圖所示:
image.png-85.3kB

很明顯,右邊這條紅色的直線在投影距離和分佈上面都優於左邊的直線,因此這條紅色的直線就是我們新的座標系,投影在該直線上面的點即爲降維後的樣本。

PCA背後的意義:通過上兩個特質,我們可以這樣理解,PCA主要提取了原始數據中方差大的那部分成分,即主成分,放棄掉那些方差小的成分。因爲方差大,說明原樣本和新樣本之間的關係度高,方差小說明關係度低,那當然保留關係度高的那部分信息。

4. PCA算法是怎樣的?

輸入:
訓練集X(注意,只對訓練集進行PCA計算):x(1),x(2),,x(m)x^{(1)}, x^{(2)}, \dots, x^{(m)}
每個樣本feature的維度爲n,目標維度爲k,knk \le n

處理過程:

  • 1.對所有樣本進行歸一化:

    • uj=1mi=1mxj(i),σj2=1mi=1m(xj(i)uj)2u_j = \frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}, \sigma_j^2 = \frac{1}{m}\sum_{i=1}^{m}(x_j^{(i)} - u_j)^2
    • xj(i)=xj(i)ujσjx_j^{(i)} = \frac{x_j^{(i)} - u_j}{\sigma_j}
      注意: PCA提取的是樣本feature的主成分。對於xj(i)R(n×1)x_j^{(i)} \in R^{(n × 1)},上標表示第i個樣本,下標表示第j個feature。按照上式的方法,對所有樣本進行歸一化。
  • 2.計算樣本的協方差矩陣:
    Σ=1mi=1m(x(i))(x(i))T\Sigma = \frac{1}{m}\sum_{i=1}^{m}(x^{(i)})(x^{(i)})^T
    注意:x(i)x^{(i)}爲一個nx1維的向量,如果擴展到m個樣本,那麼X爲nxm的矩陣。協方差矩陣如下,維度爲nxn:Σ=1mXXT\Sigma = \frac{1}{m} X X^T

  • 3.對協方差矩陣做特徵值分解,得到特徵值矩陣(eigenvectors):
    注意: 提取矩陣特徵的兩種方法:特徵值分解和奇異值SVD分解。在實踐中,通常使用奇異值分解(SVD-Singluar Value Decomposition)代替特徵值分解,所以這裏我們只介紹SVD。

假設我們的樣本矩陣A是一個m×n的矩陣,其中m爲樣本個數,n爲feature數,那麼我們定義矩陣A的SVD爲:
A=UΣVTA = U \Sigma V^T,其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全爲0,主對角線上的每個元素都稱爲奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足UTU=I,VTV=IU^T U = I, V^T V = I。下圖可以很形象的看出上面SVD的定義:
image.png-19.9kB

對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。也就是說:
Am×n=Um×mΣm×nVn×nTUm×kΣk×kVk×nTA_{m×n} = U_{m×m}\Sigma_{m×n}V^T_{n×n} \approx U_{m×k}\Sigma_{k×k}V^T_{k×n}其中k小於n,也就是一個大的矩陣A可以用三個小的矩陣Um×m,Σm×n,Vn×nTU_{m×m}, \Sigma_{m×n}, V^T_{n×n}來表示。如下圖所示,現在我們的矩陣A只需要三個小矩陣就可以近似描述了。
image.png-34.4kB

  • 4.特徵值分解後,取最大的k個特徵值對應的特徵向量Vk×nTV^T_{k×n}

**輸出:**得到新樣本矩陣:
Zm×k=Xm×nVn×kZ_{m×k} = X_{m×n} V_{n×k}

這個矩陣和我們原來的m×n維樣本矩陣X相比,列數從n減到了k,即,feature從n維降到了k維。

另一方面,注意到PCA僅僅使用了我們SVD的右奇異矩陣,沒有使用左奇異矩陣,那麼左奇異矩陣有什麼用呢?假設我們的樣本是m×n的矩陣X,對於U只取前k列,即:
Xk×n=Uk×mTXm×nX'_{k×n} = U^T_{k×m}X_{m×n}
可以得到一個k×n的矩陣X‘,這個矩陣和我們原來的m×n維樣本矩陣X相比,行數從m減到了k,可見對行數進行了壓縮。也就是說,左奇異矩陣可以用於行數的壓縮。相對的,右奇異矩陣可以用於列數即特徵維度的壓縮,也就是我們的PCA降維

5. 如何重構經過PCA降維的數據?

上面推導瞭如何得到投影矩陣Z,那麼我們能否通過Z恢復出原始的X呢?那麼肯定有人要問:爲什麼要恢復出原始數據X呢?因爲這裏有個信息保留度的問題。比如,希望降維後的新樣本能夠保留原樣本95%的信息,即,只允許降維丟失5%的信息。那麼如何衡量這個保留度或者丟失度呢?這就需要下面的公式來計算:

1mi=1mx(i)xapprox(i)2sumi=1mx(i)20.05\frac{\frac{1}{m}\sum_{i=1}^{m}||x^{(i)} - x^{(i)}_{approx}||^2}{sum_{i=1}^{m}||x^{(i)}||^2} \le 0.05

該式表示至少要保留95%的信息,只允許損失5%的信息。式中的XapproxX_{approx}即爲我們需要從Z恢復回來的“原始數據”,畢竟信息有丟失,所以它只是近似的原始數據。

接下來看如何得到XapproxX_{approx}
其實很簡單,仍然使用上面的右奇異矩陣Vk×n)TV^T_{k×n)},計算方法如下:
Xapprox(m×n)=Zm×kVk×nTX_{approx(m×n)} = Z_{m×k}V^T_{k×n}

6. 如何選擇主成分的個數?

如果你要可視化,那麼很容易就確定降到的維度,無非就是2或者3。但是如果要真正地做特徵降維,那麼這個k是很難主觀確定出來的,但是從信息保留度的角度,這個就比較容易確定了,比如要保留99%的信息,然後據此來推斷出來k應該是多少。方法其實也簡單,就是通過上面提到的公式:
1mi=1mx(i)xapprox(i)2sumi=1mx(i)20.01\frac{\frac{1}{m}\sum_{i=1}^{m}||x^{(i)} - x^{(i)}_{approx}||^2}{sum_{i=1}^{m}||x^{(i)}||^2} \le 0.01
算法如下:

  • 1.對於k,從1, 2, …逐個取值,然後計算VT,Z,XapproxV^T, Z, X_{approx}
  • 2.然後通過上面的公式計算比值是否小於0.01,如果不小於,就繼續取不同的值,如果滿足條件了,那麼當前取得值就是最終的k值

這種方法雖然可行,但是效率太低了。下面介紹一種更爲簡單的方法,就是利用SVD分解的三個矩陣中的Σ\Sigma
在上面的推導中可知Σ\Sigma的維度是mxn,而且該矩陣的特點就是在主對角線上的元素爲奇異值(Singular Value),其他的元素全部爲0。
“對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。”
我們就是利用上面的特性來評估k的值,方法如下:

  • 只計算對角線上k個奇異值的和,然後比上對角線上所有奇異值的和
  • 它們的比例就是信息保留度,如果對於某個值k,可以滿足這個比例大於0.99了,那麼這個k值就是我們的主成分個數了
    過程如下圖所示:
    image.png-80kB
    這種計算方法比上面那種效率要高很多。

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_:這裏保存的就是主成分,即Vk×nTV^T_{k×n}
  • explained_variance_:這裏保存的就是協方差
  • explained_variance_ratio_:這裏保存的是協方差
  • n_components_:這裏保存的就是k
  • singular_values:這裏保存的就是奇異值

主要的函數:

  • fit_transform(X): 它的作用就是將X降維後得到Z
  • inverse_transform(Z): 它的作用就是將Z恢復爲XapproxX_{approx}

其他關係:
Z = np.dot(X, pca.components_.T) —投影后的新矩陣
X_approx = np.dot(Z, pca.components_) —得分矩陣
Resi = X - X_approx — 殘差矩陣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章