2014-02-08 143 views
0

我使用Matlab來讀取MNIST數據庫。這些圖像最初是28x28(= 784)像素。所以,我有一個2D 784x1000陣列(意思是說,我已經閱讀了1000張圖片)。使用PCA對MNIST圖像進行特徵提取

假設我的2D數組名稱是IMGS,Matlab表達式:IMGS(:, 1)會給我第一個圖像。

爲了執行PCA,以便提取一些的圖像的特徵(從他們的784):

  1. 我轉置陣IMGS,把圖像的行數和特徵(尺寸)在列中,在一個名爲IMGS_T的數組中(IMGS_T(1,:)對應於第一個圖像)。
  2. 我使用princomp功能是這樣的:[COEFF,分數= princomp(IMGS_T];

    我的問題是這樣的(它可能有點微不足道,但,我想,以確保此): ? 假如我想提取從他們的784的整體100層的功能,我需要的是成績的前100列

    所以,在Matlab而言,我需要的是寫:IMGS_PCA = IMGS(: ,100)' ,我將創建一個100x1000的數組,名爲IMGS_PCA,它可以將我的1000個MNIST圖像保存在其列中,並且它們的行中前100個最重要的特徵?

+0

它認爲它是正確的 – michaeltang

回答

2

基本上它是正確的。請注意,在princomp行輸入對應於觀察值,列對變量。

說明你的程序,

IMGS = rand(1000,784); 
[COEFF, SCORE] = princomp(IMGS); 

使用證明的功能是正確的,你可以嘗試恢復原始圖像,

recovered_IMGS = SCORE/COEFF + repmat(mean(IMGS,1), 1000, 1); 

然後IMGS - recovered_IMGS會給你零矩陣(在數字錯誤內)。

只使用前100層的功能,你可以

for i=101:784 
    SCORE(:,i) = zeros(1000,1); 
end 

然後使用相同的代碼來恢復圖片:

recovered_IMGS_100 = SCORE/COEFF + repmat(mean(IMGS,1), 1000, 1); 

或者你也可以,正如你所說,創造了另一個100 x 1000陣列來實現相同的結果。