1. 程式人生 > >MATLAB自帶工具箱實現PCA降維程式碼,著重介紹實現方法

MATLAB自帶工具箱實現PCA降維程式碼,著重介紹實現方法

最近專案中需要進行PCA降維,環境是MATLAB,但是在網上找了很多都是介紹PCA原理的,的確介紹的很仔細,但是我是一個工科狗,只是想最快查到用程式碼實現降維的方法而已,網上的對我來說太多了,因此在此做一個總結,出於對知識的 尊重,插兩篇介紹的不錯的PCA 原理文章,只是想實現pCA的大可不必看.原理文章1 
原理文章2

下面開始介紹用MATLAB自帶工具包函式pca(對應老版本函式princomp,在maltab裡help princomp會提示你用pca代替他)進行降維的方法. 
直接上程式碼分析:

[pc,score,latent,tsquare] = pca(feature);%我們這裡需要他的pc和latent值做分析
  • 1

feature是被降維的特徵,每一行是一個特徵,列數代表總的特徵個數,比如一個圖片的HOG特徵是96維,總共有8000個HOG特徵,那麼feature的維度是8000×96,我們的目標就是將其降維(假設將96維降到50維,)那麼我們期望的降維後feature就變成了我們需要的feature_after_PCA:8000×50

latent用來計算降維後取多少維度能夠達到自己需要的精度, 
通過下面的程式碼執行結果可以得到取pc中對應每一維度對原始資料的精度:

cumsum(latent)./sum(latent)
    0.2763
    0.3954
    0.8765
    0.8854
    0.8931
    0.8995
    0.9055
    0.9111
    0.9808
    0.9819
    0.9828
    0.9838
    0.9846
    0.9854
    0.9862
    0.9869
    0.9876
    0.9883
    0.9999
    1.0000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

結果應該是有96維,但是太長,這裡隨機刪減了一部分,我們可以看到只去取第一維的話和原始資料的準確度只有27%,很低,取全部的維度最後的精度就是100%,如果我們覺得精度達到90%就能接受的話我們就只需要取精度為90%對應的維度,這裡假設第50維的精度是90%. 
因此我們需要取pc中的1:50列來做最後的變換矩陣:

tran=pc(:,1:50);
  • 1

因此我們最終的feature降維後的矩陣feature_after_PCA就通過下式計算:

feature= bsxfun(@minus,feature,mean(feature,1));
feature_after_PCA= feature*tran;
  • 1
  • 2

至此我們PCA降維完成.這裡需要人工介入的地方就是選取多少維度來確定和原始資料的精度問題.

補充:上面計算feature_after_PCA的方法是正確的,但是pca函式其實已經給出了所有的轉換後矩陣表示,也就是輸出的score項,因此在確定需要降維到50維度以後,只需要取score中對應的列就能得到feature_after_PCA:

feature_after_PCA=score(:,1:50);