PCA降维

3

我正在尝试执行主成分分析,将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,表示225个900维字符的测试数据。

基本上我想把它缩小到225x10,即10个维度,但目前有些困难。

2个回答

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;

抱歉,只有一件事,我记得为什么最初使用了40(尽管我不需要那么多),因为据我的讲师说,更好的做法是采用2:11而不是1:10的尺寸,我该怎么做呢? - user3094936
[V D]=eigs(covariancex,11); pcatest=Xtest*V(:,2:11);[V D] = eigs(covariancex, 11); pcatest = Xtest * V(:, 2:11); - lennon310

1
从您的代码看,似乎您正在计算“labels”的协方差,而不是“trainingData”的协方差。我认为PCA的重点在于确定数据的N(这里是N = 10)个子空间中的最大方差。
您的协方差矩阵应该是900x900(如果900是每个图像的维数,我假设这是由于有30x30像素的图像)。其中对角线元素“[i,i]”表示所有训练样本的该像素的方差,“[i,j]”表示像素“i”和像素“j”的协方差。这应该是一个对角矩阵,因为“[i,j] == [j,i]”。
此外,在调用“eigs(covariancex,N)”时,如果要将维数减少到10,则N应为10,而不是40。

抱歉,我记得为什么最初使用了40(尽管我不需要那么多),因为根据我的讲师,取维度2:11比1:10更好,我该如何实现这一点? - user3094936

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接