如何将新图像投影到 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 矩阵是什么。

输出是什么? icasigtImage 的估计独立分量, 不是 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