如何将新图像投影到 ICA space?
How to project new images into ICA space?
我正在使用 FastICA MATLAB toolbox
我的训练图像在 tImage
中,其中每一行都是一个观察值。矩阵为 30x35200,30 张人脸图像,特征长度为 35200(像素)。
当我运行[icasig, A, W] = fastICA(tImage)
时,输出icasig
为30x35200,A
为30x30,W
为30x30。我了解到 icasig
是投影图像,因此不需要进一步处理。
现在我正在尝试准备测试图像并将其投影到 W
。我的困难是尺寸。我的测试图像是 1x35200(一张图像具有 35200 个特征)。我怎样才能将它投影到 30x30 的 W
上?
我认为你误解了 icasig
矩阵是什么。
输出是什么?
icasig
是 tImage
的估计独立分量, 不是 tImage
的投影行。这些类似于新投影 space 的基向量(它们不是真正的基向量,因为它们不是正交的,但它们的行为类似于基向量)。我们可以通过几个实验来证实这一点。
首先,让我们使用A
重建第一张图像。 A
是 tImage
的投影行,通常称为混合矩阵。 A
的列指定每个组件对每个图像的贡献程度。
(我使用 Face Recognition Project 图片作为我的代码示例)
figure;
subplot(1, 3, 1);
imshow(reshape(tImage(1, :), 128, 128));
title('First Image');
reconstruction = A(1, :)* icasig;
subplot(1, 3, 2);
imshow(reshape(reconstruction, 128, 128));
title('Reconstructed Image');
subplot(1, 3, 3);
imagesc(reshape(abs(tImage(1, :) - reconstruction), 128, 128));
title('Difference');
colorbar;
你可以在差异图像中看到重建的是原始图像的近似版本,但是对于人眼来说,两个图像看起来是一样的。
因此,您可以使用 A
作为 tImage
的低维替代品。
基础面的 ICA
当您将 icasig
的行可视化为图像时,您正在可视化组件。您可能已经看过 Eigenface 可视化。这些图像可以被认为是 ICAfaces。
这是前 9 个的图像
这些面孔代表图像变化最大的特征。
投影测试图像
对于新的测试图像,我们想计算出每个组件有多少要混合在一起用于投影。基本上,我们想知道它在 A
矩阵中的行是什么样的。
为了从 A
重建第一张图像,我们进行了以下操作
reconstruction = A(1, :) * icasig;
现在,测试图像的 A
未知,但如果我们用测试图像代替重建,我们可以使用线性求解器求解 A
。
A_test = icasig' \ testImage'; %I had to transpose things so that the dimensions matched
figure;
subplot(1, 3, 1);
imshow(reshape(testImage, 128, 128));
title('Test Image');
reconstruction = A_test' * icasig;
subplot(1, 3, 2);
imshow(reshape(reconstruction, 128, 128));
title('Reconstructed Image');
subplot(1, 3, 3);
imagesc(reshape(abs(testImage - reconstruction), 128, 128));
title('Difference');
colorbar;
结果看起来很像原始重建结果
我使用了 mldivide linear solver, but you could also use linsolve,或者任何你最喜欢的线性求解器。
为什么不用简单投影?
在这个答案的初稿中,我建议将测试图像投影到 icasig
上。我在考虑如何做 reprojection with PCA,但我不确定是否可以将相同的技术转移到 ICA,因为组件不是正交的。
在一个小实验中,结果不如使用线性求解器。这是我使用的投影代码。
A_test = icasig * testImage';
A_test = A_test ./ sqrt(sum(icasig.^2, 2));
那W是什么意思?
我相信这是用于盲源分离。这是 ICA 的一个非常不同的应用。我不是这项技术的专家,所以我建议在 Wikipedia 上阅读相关内容。在这篇文章中,他们还使用 W
来指代分离或分离矩阵。
术语令人困惑,因为 in PCA W
通常用于组件,此处使用 icasig
。
我正在使用 FastICA MATLAB toolbox
我的训练图像在 tImage
中,其中每一行都是一个观察值。矩阵为 30x35200,30 张人脸图像,特征长度为 35200(像素)。
当我运行[icasig, A, W] = fastICA(tImage)
时,输出icasig
为30x35200,A
为30x30,W
为30x30。我了解到 icasig
是投影图像,因此不需要进一步处理。
现在我正在尝试准备测试图像并将其投影到 W
。我的困难是尺寸。我的测试图像是 1x35200(一张图像具有 35200 个特征)。我怎样才能将它投影到 30x30 的 W
上?
我认为你误解了 icasig
矩阵是什么。
输出是什么?
icasig
是 tImage
的估计独立分量, 不是 tImage
的投影行。这些类似于新投影 space 的基向量(它们不是真正的基向量,因为它们不是正交的,但它们的行为类似于基向量)。我们可以通过几个实验来证实这一点。
首先,让我们使用A
重建第一张图像。 A
是 tImage
的投影行,通常称为混合矩阵。 A
的列指定每个组件对每个图像的贡献程度。
(我使用 Face Recognition Project 图片作为我的代码示例)
figure;
subplot(1, 3, 1);
imshow(reshape(tImage(1, :), 128, 128));
title('First Image');
reconstruction = A(1, :)* icasig;
subplot(1, 3, 2);
imshow(reshape(reconstruction, 128, 128));
title('Reconstructed Image');
subplot(1, 3, 3);
imagesc(reshape(abs(tImage(1, :) - reconstruction), 128, 128));
title('Difference');
colorbar;
你可以在差异图像中看到重建的是原始图像的近似版本,但是对于人眼来说,两个图像看起来是一样的。
因此,您可以使用 A
作为 tImage
的低维替代品。
基础面的 ICA
当您将 icasig
的行可视化为图像时,您正在可视化组件。您可能已经看过 Eigenface 可视化。这些图像可以被认为是 ICAfaces。
这是前 9 个的图像
这些面孔代表图像变化最大的特征。
投影测试图像
对于新的测试图像,我们想计算出每个组件有多少要混合在一起用于投影。基本上,我们想知道它在 A
矩阵中的行是什么样的。
为了从 A
重建第一张图像,我们进行了以下操作
reconstruction = A(1, :) * icasig;
现在,测试图像的 A
未知,但如果我们用测试图像代替重建,我们可以使用线性求解器求解 A
。
A_test = icasig' \ testImage'; %I had to transpose things so that the dimensions matched
figure;
subplot(1, 3, 1);
imshow(reshape(testImage, 128, 128));
title('Test Image');
reconstruction = A_test' * icasig;
subplot(1, 3, 2);
imshow(reshape(reconstruction, 128, 128));
title('Reconstructed Image');
subplot(1, 3, 3);
imagesc(reshape(abs(testImage - reconstruction), 128, 128));
title('Difference');
colorbar;
结果看起来很像原始重建结果
我使用了 mldivide linear solver, but you could also use linsolve,或者任何你最喜欢的线性求解器。
为什么不用简单投影?
在这个答案的初稿中,我建议将测试图像投影到 icasig
上。我在考虑如何做 reprojection with PCA,但我不确定是否可以将相同的技术转移到 ICA,因为组件不是正交的。
在一个小实验中,结果不如使用线性求解器。这是我使用的投影代码。
A_test = icasig * testImage';
A_test = A_test ./ sqrt(sum(icasig.^2, 2));
那W是什么意思?
我相信这是用于盲源分离。这是 ICA 的一个非常不同的应用。我不是这项技术的专家,所以我建议在 Wikipedia 上阅读相关内容。在这篇文章中,他们还使用 W
来指代分离或分离矩阵。
术语令人困惑,因为 in PCA W
通常用于组件,此处使用 icasig
。