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需要考虑的条件。