我正在尝试执行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
是字符(1-26)的1x699
标签。 trainingData
是用于699个字符的图像的900维数据。 699x900
是test
,225 900个维字符。
基本上,我想将其减小到225x900
,即10维,但此时有点卡住。
协方差应该在您的225x10
中实现:
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;
而不是labels
的协方差。我相信PCA的目的是确定数据的N个子空间(此处N = 10)中的最大方差。
您的协方差矩阵应为900x900(如果每个图像的尺寸为900,则我假设具有30x30像素图像的结果。)其中trainingData
的对角元素[i,i]
给出了所有训练样本的像素方差,对角线covaraincex
给出像素[i,j]
和像素i
之间的协方差。这应该是一个对角矩阵,因为j
此外,在调用[i,j] == [j,i].
时,如果要将尺寸减小到10,则N应该是10,而不是40。