我使用Matlab读取MNIST数据库。这些图像最初是28×28(=784)像素。因此,我有一个784×1000的二维数组(意味着我读取了1000张图像)。
假设我的二维数组名为IMGS,Matlab表达式:IMGS(:, 1),将给我第一张图像。
为了执行PCA,以便从图像的784个特征中提取一些特征:
- 我转置数组IMGS,将图像放到行中,特征(维度)放到列中,得到一个名为IMGS_T的数组(IMGS_T(1, :)对应第一张图像)。
-
我使用princomp函数如下:[COEFF, SCORES] = princomp(IMGS_T);
我的问题是(这可能有点琐碎,但我希望确保这一点):假设我想从总共784个特征中提取100个特征,我只需要SCORES的前100列吗?
那么,在Matlab术语中,我只需要写:IMGS_PCA = IMGS(:, 100)’,我将创建一个名为IMGS_PCA的100×1000数组,它将在其列中保存我的1000张MNIST图像,并在其行中保存它们的头100个最重要的特征?
回答:
基本上是正确的。请注意,在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的数组来达到相同的结果。