我使用Matlab读取MNIST数据库。这些图像最初是28×28(= 784)像素。所以,我有一个2D 784x1000阵列(意思是,我已经阅读了1000张图像)。
假设我的2D数组的名称是IMGS,Matlab表达式:IMGS(:,1),会给我第一张图像。
为了执行PCA,所以要提取图像的一些特征(来自其中的784个):
我使用这样的princomp函数:[COEFF,SCORES] = princomp(IMGS_T];
我的问题是这个(它可能有点微不足道,但我想确定这一点): 假设我想从784个中提取100个特征,我需要的只是SCORES的前100列?
所以,在Matlab术语中,我只需要写:IMGS_PCA = IMGS(:,100)' 我将创建一个名为IMGS_PCA的100x1000阵列,它将在我的列中保存我的1000个MNIST图像,并在其行中保存它们的前100个最重要的特征?
答案 0 :(得分:2)
基本上是正确的。请注意,princomp
行中的输入对应于观察,而列对应于变量。
为了说明您的程序,
IMGS = rand(1000,784);
[COEFF, SCORE] = princomp(IMGS);
为证明功能的使用是正确的,您可以尝试恢复原始图像,
recovered_IMGS = SCORE / COEFF + repmat(mean(IMGS,1), 1000, 1);
然后IMGS - recovered_IMGS
会给你零矩阵(在数值误差范围内)。
要仅使用前100个功能,您可以
for i=101:784
SCORE(:,i) = zeros(1000,1);
end
然后使用相同的代码恢复图像:
recovered_IMGS_100 = SCORE / COEFF + repmat(mean(IMGS,1), 1000, 1);
或者,正如您所提到的,您可以创建另一个100 x 1000阵列来实现相同的结果。