理解FastICA实现

3
我正在尝试实现FastICA(独立成分分析)来进行图像的盲信号分离,但首先我想看一下从Github中产生良好结果的一些示例。我试图比较算法步骤的主循环,其中包括维基百科的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
我开启了这个悬赏后,就发现了我的误解:/ 如果你想获得一些分数,请继续回答。 - Austin
1个回答

1
首先,我不明白为什么代码中始终为零的术语仍然存在:
wp = ((1-u)*t'*g*wp+u*X*g)/M-mean(dg)*wp;

以上内容可以简化为:
wp = X*g/M-mean(dg)*wp;

另外,由于它总是1,因此还要删除u

其次,我认为以下行有误:

t = X'*b;

正确的表达是:

t = X'*wp;

现在让我们逐个变量来看。我们将引用迭代方程式为:

w = E{Xg(wTX)T} - E{g'(wTX)}w

  • X是您的输入数据,即迭代方程中的X

  • wp是权重向量,即迭代方程中的w。其初始值是随机的。

  • g是一个非二次非线性函数的一阶导数,即迭代方程中的g(wTX)。

  • dgg的一阶导数,即迭代方程中的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)} 并在方程式中乘以 wpw

现在你拥有了牛顿-拉弗森方法所需的内容。


1
@Jake 因为您在应用权重因子后降低了图片的“亮度”。 - Anthony
1
从纯数学上讲,您可以将 w 应用于居中的数据,即 X,但必须取消居中的结果,这几乎是不可能的。如果您尝试 S = W'*WhiteningMat*UncenteredUnwhitenedData; SMean = mean(S); S_centredThenUncentred = W'*X+SMean;,则可以验证此内容,S 应该等于 S_centredThenUncentred。您可能需要修改计算平均值和取消居中的表达式。 - Anthony
1
@Jake 我认为你在评论中提出的问题更与代码背后的数学和理论相关,而不是代码本身,这意味着它超出了你最初提出的问题的范围。我也不熟悉ICA(昨天才开始研究),没有信号处理方面的背景知识,很难在短时间内理解它。我建议你在其他地方开始一个新的问题,也许可以在这里 - Anthony
1
另外,我想纠正一下,降低“亮度”并不是因为权重的问题。而是因为独立成分分析(ICA)无法恢复原始信号的幅度。我在这里阅读到了这个信息(链接:http://arnauddelorme.com/ica_for_dummies/)。 - Anthony
1
@Jake感谢您的点赞。我找到了一些幻灯片期刊论文,它们都提到了ICA的一个限制,即输出的符号无法确定。对于图像,解决方案非常简单。由于不存在负的RGB值,因此只需取绝对值即可。文档1似乎是关于ICA的一堂很好的讲座。我可能稍后会阅读它 :)。 - Anthony
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接