基于PCA的MNIST图像特征提取

时间:2014-02-08 01:39:04

标签: matlab machine-learning pca

我使用Matlab读取MNIST数据库。这些图像最初是28×28(= 784)像素。所以,我有一个2D 784x1000阵列(意思是,我已经阅读了1000张图像)。

假设我的2D数组的名称是IMGS,Matlab表达式:IMGS(:,1),会给我第一张图像。

为了执行PCA,所以要提取图像的一些特征(来自其中的784个):

  1. 我转换数组IMGS,将图像放到行和要素(维度)到列,在一个名为IMGS_T的数组中(IMGS_T(1,:)对应于第一个图像)。
  2. 我使用这样的princomp函数:[COEFF,SCORES] = princomp(IMGS_T];

    我的问题是这个(它可能有点微不足道,但我想确定这一点): 假设我想从784个中提取100个特征,我需要的只是SCORES的前100列?

    所以,在Matlab术语中,我只需要写:IMGS_PCA = IMGS(:,100)' 我将创建一个名为IMGS_PCA的100x1000阵列,它将在我的列中保存我的1000个MNIST图像,并在其行中保存它们的前100个最重要的特征?

1 个答案:

答案 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阵列来实现相同的结果。