PCA降维

时间:2013-12-12 17:19:32

标签: matlab machine-learning linear-algebra pca dimensionality-reduction

我正在努力执行PCA将900维度减少到10.到目前为止,我已经:

covariancex = cov(labels);
[V, d] = eigs(covariancex, 40);

pcatrain = (trainingData - repmat(mean(traingData), 699, 1)) * V;
pcatest = (test - repmat(mean(trainingData), 225, 1)) * V;

其中labels是字符的1x699标签(1-26)。 trainingData是699x900,900维数据,用于699个字符的图像。 test是225x900,225 900维字符。

基本上我想把它降低到225x10,即10维度,但在这一点上有点卡住了。

2 个答案:

答案 0 :(得分:8)

协方差应该在trainingData

中实施
X = bsxfun(@minus, trainingData, mean(trainingData,1));           
covariancex = (X'*X)./(size(X,1)-1);                 

[V D] = eigs(covariancex, 10);   % reduce to 10 dimension

Xtest = bsxfun(@minus, test, mean(trainingData,1));  
pcatest = Xtest*V;

答案 1 :(得分:1)

从您的代码中,您似乎正在考虑labels的协方差,而不是trainingData。我认为PCA的重点在于确定数据中某些N(N = 10)个子空间的最大方差。

你的协方差矩阵应该是900x900(如果900是每个图像的维度,我假设有30x30像素图像的结果。)[i,i]的对角元素covaraincex给出了方差所有训练样本的像素,并且对角线[i,j]给出像素i和像素j之间的协方差。这应该是[i,j] == [j,i].

的对角矩阵

此外,在调用eigs(covariancex,N)时,如果要将维度缩减为10,则N应为10而不是40。