我正在努力执行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维度,但在这一点上有点卡住了。
答案 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。