我的训练图像位于tImage
,其中每行是一个观察点。矩阵是30x35200,30个面部图像,具有35200个特征长度(像素)。
当我运行[icasig, A, W] = fastICA(tImage)
时,输出icasig
为30x35200,A
为30x30,W
为30x30。我所学到的是icasig
是投影图像,因此无需进一步处理。
现在我正在尝试准备测试图像并将其投影到W
。我的难点在于尺寸。我的测试图像是1x35200(一个图像有35200个功能)。如何在W
上投影30x30?
答案 0 :(得分:0)
我认为你误解了icasig
矩阵是什么。
有什么输出?
icasig
是tImage
的估计独立成分,不 tImage
的预计行数。这些类似于新投影空间的基础向量(它们不是真正的基础向量,因为它们不是正交的,但它们的行为类似于基础向量)。我们可以通过几个实验证实这一点。
首先,让我们使用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 for Basis Faces
当您将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线性求解器,但您也可以使用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
。