ICA(独立成分分析)在信号盲源分离中的应用

转自:https://blog.csdn.net/cai2016/article/details/52983473

ICA简介
      ICA是20世纪90年代提出的,起初是神经网络的研究中有一个重要的问题,独立成分分析是一个解决问题的新方法。在许多应用方面,包括特征识别、信号分离。这种方法是用一种解线性方程组的方式的估计方式求解信号源。
ICA与鸡尾酒会
      假想一下,在一个房间里的不同位置放着两个麦克风,同时有两个人说话。两个麦克风能同时记录下两个时间信号,如果仅用这两个记录的信号来估计出原来的两个语音信号,那将是一件非常有意义的事情,这也就是所谓的“鸡尾酒会”问题 。
信号盲源分离
      以鸡尾酒会声音辨别为例,将每个声音区分出来,这样人大脑就可以很快集中听需要注意的声音。以下以三个独立源为例,三个接收端,每个接收端都含有三个声音源的线性叠加。下图是示例图:


对模型参数的解释
      A=[a11,a12,a12;a21,a22,a23;a31,a32,a32]作为一个混合矩阵,这里的每一个元素可以表示鸡尾酒舞会问题中物理意义为距离,X为观测信号,S为独立源也就是声音信号。以上模型中假设每个独立源噪声干扰很小,忽略影响。实际上在ICA信号盲源分离中可以将噪声信号单独一种独立源处理较好,一些文献对于ICA噪声就是采用这种方案进行处理。
半盲源分离信号分离
      在混合矩阵A已知的前提下,反解出独立源就很简单。ICA常用的情形是混合矩阵和独立源都不明确的条件下一种估计算法。真正实现信号的盲源分离。
ICA盲源分离流程


      上述流程图中,由独立源线性组合成的观测信号X,只需要对S进行求解即可。S=B*X,其中B为A的逆,通过迭代对A进行逼近,当达到设置的精度时即可分离出混合矩阵的近似。盲源分离的目的是求得源信号的最佳估计。
ICA假设的三个条件
      独立成分被假设是统计独立。对于这一条可以从概率密度以及其他算法可以判断。我们说随机变量y1,y2..yn独立,是指在i≠j时,有关yi的取值情况对于yj如何取值没有提供任何信息。
       独立成分具有非高斯分布。如果观测到的变量具有高斯分布,那么ICA在本质上是不可能实现的。假定S经过混合矩阵A后,他们的联合概率密度仍然不变化,因此我们没有办法在混合中的得到混合矩阵的信息。
       假设混合矩阵是方阵。这个条件是为了后续ICA算法求解的便利。当混合矩阵A是方阵时就意味着独立源的个数和监测信号的个数数目是一致。
ICA算法步骤
      观测信号构成一个混合矩阵,通过数学算法进行对混合矩阵A的逆进行近似求解分为三个步骤:
1) 去均值。去均值也就是中心化,实质是使信号X均值是零。
2) 白化。白化就是去相关性。
3)构建正交系统。在常用的ICA算法基础上已经有了一些改进,形成了fastICA算法。fastICA实际上是一种寻找wTz(Y= wTz )的非高斯最大的不动点迭代方案。
      以上有较多的数学推导,这里就省略了,下面给出fastICA的算法流程:
1 观测数据的中心化
2 数据白化
3 选择需要估计的分量个数m,设置迭代次数和范围
4 随机选择初始权重
5 选择非线性函数
6 迭代 
7 判断收敛,是下一步,否则返回步骤6
8 返回近似混合矩阵的逆矩阵

算法demo
      下面给出一个ICA简单信号盲源分离实例:独立源信号:正弦波、方波、三角波、随机信号(很多情况下可以将噪声信号看做一种独立源),ICA实现对信号的混合分解。
以下是四个独立源信号:


四个观测信号:


分离出的四个源信号:


      ICA在进行信号分离时需要注意两点:解分离出的源信号顺序与初始的源信号顺序不对应;另外一个就是分离出的原始信号幅值与原始源信号不对应,形态域上具备相似性。
      以下是常见的fastICA算法仿真代码:

%以下程序调用ICA,输入观察信号,输出为解混合信号
function Z=ICA(X)
%-------------去均值------------
[M,T] = size(X); %获取输入矩阵的行/列数,行数为观测数据的个数,列数为采样点点数
average= mean(X')';  %按行取均值
for i=1:M
    X(i,:)=X(i,:)-average(i)*ones(1,T); 
end
%------------白化--------------
Cx = cov(X',1);    %计算协方差矩阵Cx
[eigvector,eigvalue] = eig(Cx); %计算Cx的特征值和特征向量
W=eigvalue^(-1/2)*eigvector';   %白化矩阵
Z=W*X;   %正交矩阵

%-------------迭代-------------
Maxcount=10000;        %最大迭代次数
Critical=0.00001;   %判断是否收敛
m=M;                %需要估计的分量的个数
W=rand(m);
for n=1:m  
    WP=W(:,n);  %初始权矢量(任意)
%     Y=WP'*Z;
%     G=Y.^3;%G为非线性函数,可取y^3等
%     GG=3*Y.^2;  %G的导数
    count=0;
    LastWP=zeros(m,1);
    W(:,n)=W(:,n)/norm(W(:,n));%单位化一列向量
    while abs(WP-LastWP)&abs(WP+LastWP)>Critical %两个绝对值同时大于收敛条件
        count=count+1;   %迭代次数
        LastWP=WP;       %上次迭代的值
       % WP=1/T*Z*((LastWP'*Z).^3)'-3*LastWP;
        for i=1:m     
WP(i)=mean(Z(i,:).*(tanh((LastWP)'*Z)))-(mean(1-(tanh((LastWP))'*Z).^2)).*LastWP(i);%更新
        end
        WPP=zeros(m,1);%施密特正交化
        for j=1:n-1
            WPP=WPP+(WP'*W(:,j))*W(:,j);
        end
        WP=WP-WPP;
        WP=WP/(norm(WP));

        if count==Maxcount
            fprintf('未找到相应的信号'); 
            return; 
        end
    end
    W(:,n)=WP;
end
Z=W'*Z;
 



应用ICA需要考虑的几点
      ICA主要用于特征提取和信号盲源分离中。在盲源信号分离中,关于源的个数是确定的,因此分离出的源信号数目在分离之前是确定已知的。监测信号的维数与源信号的数目相同,混合矩阵和源信号具体情况在分离之前可以不清除具体表现形式,但是需要满足独立、非高斯分布的条件,这些是在实际中应用ICA需要考虑的条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值