我正在尝试实现FastICA(独立成分分析)来进行图像的盲信号分离,但首先我想看一下从Github中产生良好结果的一些示例。我试图比较算法步骤的主循环,其中包括维基百科的FastICA,但我发现它们实际上是相同的,这让我有些困难。
它们看起来非常相似,但有一些差异我不理解。它看起来类似于Wiki中的“多组分提取”版本。
请问有人能帮我理解与非线性函数及其一、二阶导数有关的四行左右代码以及更新权重向量的第一行代码吗?非常感谢任何帮助!
这里是实现代码,变量已更改以更接近Wiki:
它们看起来非常相似,但有一些差异我不理解。它看起来类似于Wiki中的“多组分提取”版本。
请问有人能帮我理解与非线性函数及其一、二阶导数有关的四行左右代码以及更新权重向量的第一行代码吗?非常感谢任何帮助!
这里是实现代码,变量已更改以更接近Wiki:
% X is sized (NxM, 3x50K) mixed image data matrix (one row for each mixed image)
C=3; % number of components to separate
W=zeros(numofIC,VariableNum); % weights matrix
for p=1:C
% initialize random weight vector of length N
wp = rand(C,1);
wp = wp / norm(wp);
% like do:
i = 1;
maxIterations = 100;
while i <= maxIterations+1
% until mat iterations
if i == maxIterations
fprintf('No convergence: ', p,maxIterations);
break;
end
wp_old = wp;
% this is the main part of the algorithm and where
% I'm confused about the particular implementation
u = 1;
t = X'*b;
g = t.^3;
dg = 3*t.^2;
wp = ((1-u)*t'*g*wp+u*X*g)/M-mean(dg)*wp;
% 2nd and 3rd wp update steps make sense to me
wp = wp-W*W'*wp;
wp = wp / norm(wp);
% or until w_p converges
if abs(abs(b'*bOld)-1)<1e-10
W(:,p)=b;
break;
end
i=i+1;
end
end
而且Wiki的算法可供快速参考: