4

これはフォローアップの質問です:

PCA次元削減

新しい 10 次元のテスト データを分類するには、トレーニング データも 10 次元に減らす必要がありますか?

私は試した:

X = bsxfun(@minus, trainingData, mean(trainingData,1));           
covariancex = (X'*X)./(size(X,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension
Xtrain = bsxfun(@minus, trainingData, mean(trainingData,1));  
pcatrain = Xtest*V;

しかし、これと 10 次元のテスト データで分類器を使用すると、非常に信頼できない結果が得られますか? 私が根本的に間違っていることはありますか?

編集:

X = bsxfun(@minus, trainingData, mean(trainingData,1));           
covariancex = (X'*X)./(size(X,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension
Xtrain = bsxfun(@minus, trainingData, mean(trainingData,1));  
pcatrain = Xtest*V;

X = bsxfun(@minus, pcatrain, mean(pcatrain,1));           
covariancex = (X'*X)./(size(X,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension
Xtest = bsxfun(@minus, test, mean(pcatrain,1));  
pcatest = Xtest*V;
4

1 に答える 1

7

トレーニング データとテスト データの両方を削減する必要がありますが、どちらも同じ方法で削減する必要があります。したがって、トレーニング データの PCA から削減行列を取得したら、この行列を使用してテスト データの次元を削減する必要があります。つまり、トレーニング要素とテスト要素の両方に適用される 1 つの一定の変換が必要です。

コードの使用

% first, 0-mean data
Xtrain = bsxfun(@minus, Xtrain, mean(Xtrain,1));           
Xtest  = bsxfun(@minus, Xtest, mean(Xtrain,1));           

% Compute PCA
covariancex = (Xtrain'*Xtrain)./(size(Xtrain,1)-1);                 
[V D] = eigs(covariancex, 10);   % reduce to 10 dimension

pcatrain = Xtrain*V;
% here you should train your classifier on pcatrain and ytrain (correct labels)

pcatest = Xtest*V;
% here you can test your classifier on pcatest using ytest (compare with correct labels)
于 2013-12-14T14:18:15.443 に答える