我目前正在尝试使用PCA和ICA算法。我现在非常习惯使用PCA创建一组特征脸,选择最佳特征脸并重建图像,我也可以使用PCA进行脸部幻觉。我希望对ICA也这样做,但我不确定如何做到这一点。
到目前为止,我所采取的步骤是,执行PCA,找到代表特征脸的正交特征向量。目前正在试验耶鲁ORL和PIE数据库
然后我对这些特征向量执行fastica,如此
%Perform ICA on eigenvectors transposed
%icasig = source matrix
%A denotes unknown mixing matrix
%W denotes unmixing matrix - inverse of A
%Variable R are the orthogonal eigenvectors
[icasig A W] = fastica(R');
然后,我实现了ICA架构1以找到ICA系数。 ICA架构1的算法可以在这里找到
http://www.sciencedirect.com/science/article/pii/S1077314203000778
只需向下滚动到第2.3.1节
%centeredMatrix is the image matrix of my training set minus the mean so here
%I take out one of the mean centered images
x = centeredMatrix(:,1);
%Calculate Independent basis images
U = W * R';
%Calculate PCA Coefficients
C = x' * R;
%Calculate ICA Coefficients
B = C * inv(W);
% plot first 16 PCA faces
figure; hold on;
for i=1:16
subplot(4,4,i);
comp = reshape(R(:,i), width, height);
imagesc(comp),colormap('gray')
title(sprintf('PCAFace #%i', i));
end
% plot first 16 ICAFaces
figure; hold on;
for i=1:16
subplot(4,4,i);
comp = reshape(U(i,:), width, height);
imshow(comp);
title(sprintf('ICAFace #%i', i));
end
我知道我可以从这个
进行PCA重建%-----------------PCA Reconstruction----------
%Eigenvectors * pcaCoefficients + mean image
pcaRecon = (R * C') + mu;
pcaRecon = uint8(pcaRecon);
pcaRecon = reshape(pcaRecon,width,height);
figure, imshow(pcaRecon), title('PCA Recon');
但我不确定如何进行ICA重建。通过实施ICA架构1,我已经能够通过执行此操作来执行重建
%-----------------ICA Reconstruction----------
icaRecon = (icasig' * B') + mu;
icaRecon = uint8(icaRecon);
icaRecon = reshape(icaRecon,width,height);
figure, imshow(icaRecon), title('ICA Recon');
但我不确定这是否是一种很好的重建方法,与PCA相比似乎不是很有效。以上代码在Yale数据库上进行了测试,该数据库有165个图像使用PCA,我可以使用大约80个特征脸,并且仍然可以获得非常高质量的图像 而在这里使用ICA方法,我必须使用大约105 - 110才能获得类似质量的图像。与包含400个图像的ORL数据库相同,可以执行PCA,gen特征脸,然后使用大约120个特征脸进行重建并获得非常高质量的图像,而对于ICA,需要大约380个组件来获得类似的质量重建
我还是ICA的新手,所以还有很多东西需要学习,但如果可能的话,我想回答几个问题
1:我使用这种ICA方法进行重建是一种好方法吗?或者你会推荐一种更好的方法。我有
2:为什么我需要在ICA中使用这么多组件进行重建,我猜这是我方法的一个问题?
如果有人能指出正确的方向或向我解释更好的重建方法,我将非常感激。
提前致谢
编辑:
来自ORL数据库的示例结果,将原始数据与PCA和ICA重建进行比较。使用200个特征脸进行PCA重建,使用200个IC完成ICA重建。正如你所看到的那样,ICA重建相当差劲
答案 0 :(得分:1)
为什么我需要在ICA中使用这么多组件来进行重建, 我猜我的方法有问题吗?
我没有仔细检查你的代码,但是一个可能的答案就是PCA组件排序(解释输入数据集中最大变化量的组件首先出现),而典型的ICA组件来了以任意顺序出局。因此,如果您仅从n个组件的子集重建,则在PCA中很容易:选择前n个。在ICA中,您需要一些其他标准来选择 n个组件,因为缺少一个更好的词,“最简单的”。
答案 1 :(得分:0)
我也是ICA的新手,我和你做了几乎相同的实验。 我发现这个ICA重建方法本质上是一种 PCA重建!如果你扩展你的重建代码:“icasig'* B'”,你会发现你得到R *(x'* R)。实际上,您在上面提到的架构1也做了同样的事情。 至于你的问题,用n张图片重建ICA必须等于用相同的n张图片进行PCA重建。 您的重建代码完全没问题,我没有看到任何错误。不知道为什么结果不好,也许你的[icasig A W] = fastica(R');实现不是那么好?您可以通过检查W * R'是否等于icasig来判断。他们应该是平等的。