前言

主成分分析 (Principal Component Analysis PCA) 是我在數理統計課上最難理解的知識之一,它在機器學習當中也有廣泛的應用,Pattern Recognition and Machine Learning1 一書第12.1章也對其做了充分的解釋,書中提到PCA有可以由兩種定義得到,這兩種定義分別在1901年,1933年發明,PCA可以有很多應用,降維,有損數據壓縮,特徵提取,數據可視化。對於這些問題,不僅僅PCA可以解決,如今出現了也各種各樣新的方法。PCA常常用來對數據進行預處理,但PCA不能確保可以提高最終的分類效果,在我看來PCA來做預處理需要小心,不能無腦使用PCA,甚至不要用PCA做預處理。

這篇文章,簡要地分析了一下PCA,另外用實驗的方式表明PCA做預處理不能提高分類效果。

理解PCA

考慮有一組數據,{x??},其中 ?? = 1, 2, ... ??,x??是一個D維向量,最大方差法 (Maximum variance formulation) 的目標是把D維的向量通過一個D × M的矩陣,將??個D維向量映射成M維向量,M < D,使得映射之後的數據方差最大1 。求得符合條件的D × M的矩陣就是用來做PCA預處理用的。求這個矩陣的過程當中會涉及到矩陣乘法,特徵值,特徵向量的概念,Youtube博主3Blue1Brown2 將這些概念解釋的非常巧妙。

PCA預處理實驗

實驗環境及數據

  • 操作系統: macOS 10.13
  • 框架: Torch 7
  • 語言: Lua
  • 數據:
    • 來源 MNIST Torch package wrapper andresy/mnist。
    • 一個數據的大小,28*28=784,表示一個數字
    • 訓練集有60,000個數據,測試集合有10,000個數據

實驗與結果

  • 實驗一:利用PCA預處理

原始數據一共有784維,PCA降維希望保持99%的主成分 ( M越大,能保持的主成分百分比越大 ),選定將784維降至559維,記為k。

數據經過預處理後 ,採用單層神經網路的方法,將k維向量映射到10維的結果向量當中,並用softmax激活函數,使每個位置為對應數字的概率。

將epoch設置為200,發現第163次的validation準確率最高。之後的37次 epoch的訓練都沒有將validation的準確率提高。

  • 實驗二:利用PCA預處理,並對預處理矩陣進優化

這個實驗,將PCA預處理操作的矩陣乘法看成是一層神經網路,利用PCA降維可以看成對網路當中的矩陣參數進行相應的初始化,之後將這個神經網路當中的參數一同加入分類訓練。

利用實驗一當中的第163次validation準確率最高的模型,將PCA那層神經網路當中的矩陣參數加入訓練。發現validation的準確率會再次升高,第23次epoch 訓練結束時,validation準確率最高,其test的準確率也從0.9067升高到了0.9079。

  • 實驗三:不利用PCA預處理

直接使用單層神經網路對原始784進行分類。發現其validation的最佳結果比之前的兩種方法都好,validation達到了0.9073,test準確率達到了0.9129。

代碼實現

實驗一,實驗二: PCA_Test_exp1_and_exp2.html 。實驗三:PCA_Test_exp3.html 。

分析

實驗二當中將降維操作使用到的矩陣一同加入訓練,可以將其用到的網路看成是兩層神經網路,特別注意的是兩層之間沒有經常用到的 ReLU等激活函數,這意味著這個兩層神經網路的表達能力相當於一層神經網路的表達能力,可以將其看成兩個分別是矩陣784 × k,k × 10 相乘將得到一個 784 × 10 的矩陣,也就是不用實驗三當中所用到的網路的表達能力。

結論

PCA並不是萬能的,利用PCA並不能主是提升分類效果,可以將PCA理解成一種對數據憑直覺的一種預處理方式。當然很多有一些主觀地,直覺的方式可以幫助提升機器學習系統的效果,比如神經網路的設計,Dropout的機制,分類器的選擇。但是對主觀,直覺的想法需要有一定的警惕,如果有可能的話,儘可能地想一些辦法對其進行驗證。

參考資料

  1. Pattern Recognition and Machine Learning Christopher Bishop, 免費下載
  2. Eigenvectors and eigenvalues | Essence of linear algebra, chapter 13 Bilibili

推薦閱讀:

相关文章