我正在学习UFLDL。使用本教程中的代码
avg = mean(x, 1);
x = x - repmat(avg, size(x, 1), 1);
sigma = x * x' / size(x, 2);
[U,S,V] = svd(sigma);
xRot = U' * x;
xTilde = U(:,1:k)' * x;
我可以得到本教程所需的结果(在另一个地方计算k,假设k等于300)。在该示例中,x是n * m(784 * 60000)矩阵,每列表示MNIST图像。如果我弄错了,我已经看到本教程准备的loadMNISTImages.m代码,它将mnist图像加载为28x28x [MNIST图像数]矩阵,并将矩阵重新整形为#pixels x #examples。
从代码中,我计算平均像素值并从每个图像补丁中减去它,即m(60000)表示。 sigma是一个n * n(784 * 784)矩阵,因此U. xTilde是k * m(300 * 60000)。因此,此代码计算每个图像色块(每列)的平均值,并减小每个图像色块的尺寸(减少行的尺寸)。
然后我尝试实现一个简单的PCA示例,如图所示:
使用这样的代码
x = [-3.8,-2.5;-1.2,-2.5;1,1.5;2.7,2.5;3,1.3];
x = x';
x = x - repmat(mean(x, 2), 1, size(x, 2));
sigma = x * x' / size(x, 2);
[U, S, V] = svd(sigma);
xRot = U' * x;
xTilde = U(:,1)' * x;
你可以看到x是n * m(转换后为2 * 5)。我计算每行的平均值和减少的行的维度。
这两种情况都减少了行的维度,但第一种情况是计算列的平均值,而第二种情况计算行的平均值。我如何理解这种情况?