我试图实现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算法:
答案 0 :(得分:1)
首先,我不明白为什么始终为零的术语仍然存在于代码中:
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 { X g ( w < / strong> T X ) T } - E { g '(<强>瓦特强> Ť <强> X 强>)}的瓦特强>
作为迭代方程式。
X
是您的输入数据,即迭代公式中的 X 。
wp
是权重向量,即迭代方程中的 w 。它的初始值是随机的。
g
是非二次非线性函数的一阶导数,即 g ( w T X )在迭代方程
dg
是g
的第一个派生词,即 g '( w T <迭代方程中的strong> X
M
虽然其定义未在您提供的代码中显示,但我认为其大小应为X
。
了解所有变量的含义后,我们现在可以尝试理解这些代码。
t = X'*b;
以上一行计算 w T X 。
g = t.^3;
以上一行计算 g ( w T X )=( w Ť <强> X 强>) 3 。请注意, g(u)可以是任何等式,只要 f(u),其中 g(u)= df(u)/ du ,是非线性和非二次的。
dg = 3*t.^2;
以上行计算g
的衍生物。
wp = X*g/M-mean(dg)*wp;
Xg
显然会计算 X g ( w T <强> X 强>)。 Xg/M
计算Xg
的平均值,相当于E { X g ( w < /强> Ť <强> X 强>)Ť}。
mean(dg)
E { g '( w T X 强>)}并乘以等式中的wp
或 w 。
现在你拥有Newton-Raphson Method所需的东西。