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

来源:互联网 发布:淘宝运营指数指是什么 编辑:程序博客网 时间:2024/06/10 08:58

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 判断收敛,是下一步,否则返回步骤68 返回近似混合矩阵的逆矩阵

算法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;endZ=W'*Z;

应用ICA需要考虑的几点

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

2 0