基于负熵(fastICA)的盲源分离

来源:互联网 发布:ubuntu docker 启动 编辑:程序博客网 时间:2024/06/09 22:46

根据信息论可知,等方差分布中高斯分布的熵最大。而根据概率论的中心极限定理可知,若一随机变量由许多相互独立的随机变量组成,只要具有有限的均值与方差,则无论其为何种分布,随机变量较更接近高斯分布。反之,对一个混合信号来说,如果完成对信号的分离,则会使得分离后的结果之间的非高斯性变大,即信号之间可看成相互独立的。故引入负熵来度量,其公式定义为
这里写图片描述
式中这里写图片描述是与这里写图片描述具有相同方差的高斯变量。从式子可以看出,当且仅当信号这里写图片描述满足高斯分布时,其负熵才会为零。而这里写图片描述不满足高斯分布是,负熵都会大于零,特别的当负熵达到最大时可以知道此时信号这里写图片描述的熵为零,亦即可以得出此时信号之间的独立性最大。故在分离信号的时候用可用负熵来度量。详细的推导过程见李云霞的博士论文《盲信号分离算法及其应用》。
我们在看完其推导之后,往往会发现其实际编程的时候会有困难,基于此,我在这里详细讲解如何实现编程。编程的步骤一般如下:
1)对接收信号中心化与预白化
2)设置迭代次数,选择初始权
3)程序主体
4)正交化,这是避免提取出重复的源信号
5)对迭代权值归一化
6)判断是否收敛,没有的话返回3)继续,知道收敛为止。
好了,不多说,我们讲解如何编写:
我们分离正定信号,4个信源,4个传感器,2000个采样点;接收信号为X,其行列为4*2000。
%%去均值与预白化

       [m,n]=size(X);%获的输入数据的行列       Zerox=X-mean(X,2)*ones(1,n);       Rxx=Zerox*Zerox'/n;       [S,V,D]=svd(Rxx);       WhiteMartix=V^(-1/2)*S';       Z=WhiteMartix*Zerox; 

上面处理过后,Z为白化之后的数据,接着我们处理白化后的数据即可

%设置收敛门限与最大的迭代次数
设置最大的迭代次数的迭代次数是防止收敛门限设置过小的时候程序达不到为陷入死循环。

W=eye(m,m);%设定初始的权矢量W=W*real(inv(W'*W)^(1/2));%采用对称正交化Wold=zeros(m,m);crit=zeros(1,m);epsilon=1E-6;%设定收敛的门限值while(1-min(crit)>epsilon)    Wold=W;    U=W'*Z;      %选择的G函数是G(y)=logcosh(ay)/a    %超高斯与亚高斯都存在可以用%         a=1;%         g=tanh(a*U);%         dg=a*(1-tanh(U).^2);      %选择的G函数是G(y)=-exp(-y^2/2)      %适用于超高斯信源%             g=U.*exp(-0.5*U.^2);%             dg=(1-U.^2).*exp(-0.5*U.^2);      %选择的G函数是G(y)=y^4/4           %适用于亚高斯信源            g=U.^3;            dg=3*U.^2;    W=Z*g'/n-diag(mean(dg.'))*W;%核心公式    W=W*real(inv(W'*W)^(1/2));%采用对称正交化    crit=abs(sum(W.*Wold)); endZ=W'*Z;
1 0