我正在尝试执行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,为699个字符的图像提供900维数据.test是225x900,225900维字符.
基本上,我想把它降到225x10,即10个维,但是在这一点上我有点卡住了。
发布于 2013-12-12 18:44:15
协方差应该在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;发布于 2013-12-12 18:38:28
从您的代码来看,您似乎接受的是labels的协变性,而不是trainingData。我相信PCA的要点是确定数据的某些N(这里的N= 10 )子空间的最大方差。
你的协方差矩阵应该是900×900(如果900是每幅图像的维数,那是我假设的30×30像素图像的结果)。其中对角线元素[i,i] of covaraincex给出了所有训练样本的像素方差,而非对角线[i,j]给出了像素i和像素j之间的协方差。这应该是[i,j] == [j,i].的对角线矩阵。
此外,当调用eigs(covariancex,N)时,如果要将维度降到10,则N应该是10而不是40。
https://stackoverflow.com/questions/20549969
复制相似问题