我使用Matlab读取MNIST数据库。这些图像最初是28x28(=784)个像素。因此,我有一个2D 784x1000阵列(意思是,我已经读取了1000张图像)。
假设我的2D阵列的名称是IMGS,那么Matlab表达式:IMGS(:,1)将为我提供第一个图像。
为了执行PCA,从而提取图像的一些特征(从784个特征中):
- 我在一个名为IMGS_T的数组中转置数组IMGS,将图像放在行中,将特征(维度)放在列中(IMGS_T(1,:)对应于第一个图像)
-
我使用的princomp函数如下:[COFF,SCORES]=princomp(IMGS_T];
我的问题是(这可能有点琐碎,但我想确定一下):假设我想从784个特征中提取100个特征,我只需要分数的前100列?
因此,在Matlab中,我只需要写:IMGS_PCA=IMGS(:,100)'我将创建一个100x1000阵列,称为IMGS_PCA,它将在其列中保存我的1000个MNIST图像,并在其行中保存它们的前100个最重要的功能?
基本上是正确的。请注意,在princomp
中,输入的行对应于观测值,列对应于变量。
为了说明您的程序,
IMGS = rand(1000,784);
[COEFF, SCORE] = princomp(IMGS);
为了证明功能的使用是正确的,你可以尝试恢复原始图像,
recovered_IMGS = SCORE / COEFF + repmat(mean(IMGS,1), 1000, 1);
则CCD_ 2将给出零矩阵(在数值误差内)。
要只使用前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的阵列来获得相同的结果。