4

我目前正在尝试使用 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 相比,它似乎不是很有效。上面的代码是在有 165 张图像的耶鲁数据库上测试的。使用 PCA,我可以使用大约 80 个特征脸,仍然可以获得非常高质量的图像,而使用 ICA 方法,我必须使用大约 105 - 110 来获得类似质量的图像。与包含 400 个图像的 ORL 数据库相同,可以执行 PCA,gen eigenfaces,然后使用大约 120 个特征面进行重建并获得非常高质量的图像,而使用 ICA,需要大约 380 个组件才能获得类似质量的重建

我还是 ICA 的新手,所以还有很多东西要学,但如果可能的话,我想回答几个问题是

1:我用来重建的这个ICA方法是不是一个好方法?或者有没有更好的方法可以推荐。我有

2:为什么我需要用ICA的这么多组件来做重构,我猜这是我的方法有问题?

如果有人能指出正确的方向或向我解释一种更好的重建方法,将不胜感激。

提前致谢

编辑:

ORL 数据库的示例结果,将原始结果与 PCA 和 ICA 重建进行比较。使用 200 个特征面完成 PCA 重建,使用 200 个 IC 完成 ICA 重建。如您所见,ICA 重建相比之下相当差

在此处输入图像描述

4

2 回答 2

1

为什么我需要使用 ICA 的这么多组件来进行重建,我猜这是我的方法的问题?

我没有详细检查您的代码,但是对此的一个可能答案是 PCA 组件按顺序排列(解释输入数据集中最大方差的组件首先出现),而通常 ICA 组件以任意形式出现命令。因此,如果您仅从 n 个组件的子集进行重构,则在 PCA 中很容易:选择第一个 n。在 ICA 中,您需要一些其他标准来选择哪些n 个组件是“最简单”的组件。

于 2013-11-21T23:59:49.123 回答
0

我也是 ICA 的新手,我和你做了几乎相同的实验。有趣的是,我发现这种 ICA 重建方法本质上是一种PCA 重建!如果你扩展你的重建代码:“icasig' * B'”,你会发现你得到 R * (x' * R)。事实上,你上面提到的架构 1 做了同样的事情。至于您的问题,使用 n 张图片进行 ICA 重建必须等于使用相同 n 张图片进行 PCA 重建。您的重建代码完全可以,我没有看到任何错误。不知道为什么效果不好,可能是你的 [icasig AW] = fastica(R'); 实现不是那么好?您可以通过检查 W*R' 是否等于 icasig 来判断。他们应该是平等的。

于 2013-11-24T03:06:38.783 回答