我正在尝试实现图像盲信号分离的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算法:
algorithm - 了解FastICA实现-LMLPHP

最佳答案

首先,我不明白为什么代码中始终为零的术语仍然存在:

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)
dgg的一阶导数,即迭代方程中的(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/

10-12 06:15