了解 FastICA 实施
Understanding a FastICA implementation
我正在尝试为图像的盲信号分离实施 FastICA(独立分量分析),但首先我想我会看一下 Github 中的一些示例,这些示例会产生良好的结果。我正在尝试比较 Wikipedia's FastICA 算法步骤中的主循环,但我很难看出它们实际上是如何相同的。
它们看起来很相似,但有一些我不明白的区别。看起来这个实现类似于(或相同)来自 Wiki 的 "Multiple component extraction" 版本。
有人能帮我理解在非线性函数及其一阶和二阶导数以及更新权重向量的第一行中发生了什么吗?非常感谢任何帮助!
下面是更改变量以更贴近 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
是非二次非线性函数的一阶导数,即 g(wTX)在迭代方程
dg
是g
的一阶导数,即g'(wTX)在迭代方程
M
虽然你提供的代码中没有显示它的定义,但是我觉得应该是X
.
[=123的大小=]
了解了所有变量的含义后,我们现在可以尝试理解代码了。
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.
现在您已经拥有牛顿-拉夫逊法所需的一切。
我正在尝试为图像的盲信号分离实施 FastICA(独立分量分析),但首先我想我会看一下 Github 中的一些示例,这些示例会产生良好的结果。我正在尝试比较 Wikipedia's FastICA 算法步骤中的主循环,但我很难看出它们实际上是如何相同的。
它们看起来很相似,但有一些我不明白的区别。看起来这个实现类似于(或相同)来自 Wiki 的 "Multiple component extraction" 版本。
有人能帮我理解在非线性函数及其一阶和二阶导数以及更新权重向量的第一行中发生了什么吗?非常感谢任何帮助!
下面是更改变量以更贴近 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
是非二次非线性函数的一阶导数,即 g(wTX)在迭代方程dg
是g
的一阶导数,即g'(wTX)在迭代方程
[=123的大小=]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.
现在您已经拥有牛顿-拉夫逊法所需的一切。