我正在尝试实现图像盲信号分离的fastica(独立分量分析),但首先我想看看github中的一些示例,它们产生了良好的效果。我试图比较Wikipedia's FastICA上算法步骤的主循环,我很难看出它们实际上是如何相同的。
它们看起来很相似,但有一些差异我不明白。看起来这个实现与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算法:
最佳答案
首先,我不明白为什么代码中始终为零的术语仍然存在:
wp = ((1-u)*t'*g*wp+u*X*g)/M-mean(dg)*wp;
以上可简化为:
wp = X*g/M-mean(dg)*wp;
同时删除
u
,因为它总是1。其次,我认为下面这句话是错误的:
t = X'*b;
正确的表达式是:
t = X'*wp;
现在让我们看一下这里的每个变量让我们参考
w=e{xg(wtx)t}-e{g'(wtx)}w
作为迭代方程。
X
是您的输入数据,即迭代方程中的x。wp
是权重向量,即迭代方程中的w。其初始值是随机的。g
是非二次非线性函数的一阶导数,即迭代方程中的(wtx)dg
是g
的一阶导数,即迭代方程中的(wTX)M
虽然它的定义没有显示在您提供的代码中,但我认为它应该是X
的大小。了解了所有变量的含义后,我们现在可以试着理解代码了。
t = X'*b;
以上行计算wtx。
g = t.^3;
以上行计算g(wtx)=(wtx)3。注意g(u)可以是任何方程,只要f(u),其中g(u)=df(u)/du是非线性和非二次的。
dg = 3*t.^2;
上述行计算
g
的导数。 wp = X*g/M-mean(dg)*wp;
Xg
显然计算了xg(wtx)。Xg/M
计算Xg
的平均值,它相当于e{xg(wtx)t}。mean(dg)
是E{g'(wTX)},在方程中乘以wp
或w。现在你有了牛顿-拉斐逊方法所需要的。
关于algorithm - 了解FastICA实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43421250/