我目前正在试验使用 PCA 和 ICA 算法。我现在可以很舒服地使用 PCA 来创建一组特征脸,选择最佳特征脸并重建图像,而且我还可以使用 PCA 来执行面部幻觉。我希望对 ICA 做同样的事情,但我不确定如何做到这一点。
到目前为止,我采取的步骤是,执行 PCA,找到代表特征面的正交特征向量。目前正在 Yale 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 张图像的 Yale 数据库上进行了测试。使用 PCA 我可以使用大约 80 个特征脸并且仍然可以获得非常高质量的图像
而在这里使用 ICA 方法,我必须使用大约 105 - 110 才能获得类似质量的图像。与包含 400 张图像的 ORL 数据库相同,可以执行 PCA、gen eigenfaces,然后使用大约 120 个特征脸进行重建并获得非常高质量的图像,而对于 ICA,需要大约 380 个组件才能获得类似质量的重建
我还是 ICA 的新手,所以还有很多东西要学,但如果可能的话,我想回答几个问题
1:我用来做重建的这个ICA方法是一个好方法吗?或者你有没有更好的方法推荐。我有
2:为什么我需要使用这么多组件和ICA来进行重建,我猜这是我的方法有问题?
如果有人能指出我正确的方向或向我解释进行重建的更好方法,我将不胜感激。
提前致谢
编辑:
来自 ORL 数据库的示例结果,将原始与 PCA 和 ICA 重建进行比较。 PCA 重建使用 200 个特征脸完成,ICA 重建使用 200 个 IC 完成。正如你所看到的,ICA 重建相比之下相当糟糕
最佳答案
我没有详细检查您的代码,但对此的一个可能答案是 PCA 组件按顺序排列(解释输入数据集中最大差异的组件首先出现)而通常 ICA 组件以任意方式出现命令。因此,如果您仅从 n 个分量的子集进行重构,则在 PCA 中很容易:选择前 n 个。在 ICA 中,您需要一些其他标准来选择哪些 n 个组件,因为想要一个更好的词,“最”的组件。