Java PCA降维
我正在尝试将900维缩减为10维。到目前为止,我已经:Java PCA降维,java,matlab,machine-learning,linear-algebra,pca,Java,Matlab,Machine Learning,Linear Algebra,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; 其中标签是1x699字符标签(1-26)trainingData是699
covariancex = cov(labels);
[V, d] = eigs(covariancex, 40);
pcatrain = (trainingData - repmat(mean(traingData), 699, 1)) * V;
pcatest = (test - repmat(mean(trainingData), 225, 1)) * V;
其中标签
是1x699
字符标签(1-26)trainingData
是699x900
,用于699个字符图像的900维数据<代码>测试为225x900,尺寸为225900个字符
基本上,我想把它减少到
225x10
,即10个维度,但我在这一点上有点卡住了。从您的代码中,似乎您是在获取标签的协方差,而不是培训数据。我相信主成分分析的意义在于确定数据的某些N(这里N=10)子空间中的最大方差
协方差矩阵应该是900x900(如果900是每个图像的维数,我假设是30x30像素图像的结果)。其中covaraincex
的对角元素[I,I]
给出所有训练样本的该像素的方差,非对角[I,j]
给出像素i
和像素j
之间的协方差。这应该是一个对角矩阵,如[i,j]=[j,i]。
此外,当调用EIG(协方差x,N)
时,如果您想将维度减少到10,N应该是10而不是40。协方差应该在您的培训数据中实现:
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;
抱歉,还有一件事,我记得为什么我最初使用40(虽然我不需要那么多),因为根据我的讲师,维度2:11比1:10更好,我如何实现这一点?[vd]=EIG(协方差x,11);pcatest=Xtest*V(:,2:11);对不起,我记得为什么我最初使用40(虽然我不需要那么多),因为根据我的讲师的说法,维度2:11比1:10更好,我如何实现这一点?