了解FastICA实施

时间:2017-04-15 01:32:31

标签: algorithm matlab image-processing machine-learning feature-detection

我试图实现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算法:

enter image description here

1 个答案:

答案 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 )在迭代方程

  • dgg的第一个派生词,即 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所需的东西。