在进行正式的实例化代码演示前,先对独立成分分析(ICA)进行部分阐述,以便对后续代码的处理过程,有更为形象的认识。本部分的论述,分为盲源分离的认识;独立成分分析的基础概念;FastICA算法的理解。
ICA 与盲源分离的方法具有非常密切的关系。ICA是实现盲源分离的其中一种,也是被最广泛使用的方法,故而,有必要在介绍ICA前,对盲源分离进行简要的介绍。
盲源分离是由“鸡尾酒会问题”引出,该问题描述的是一场鸡尾酒会中有N个人一起说话,同时有N个录音设备,问怎样根据这N个录音文件恢复出N个人的原始语音,示意图如下[1]。(ICA就是针对该问题所提出的一个算法。)
盲源分离:根据源信号的统计特性,是指仅由观测的混合信号恢复(分离)出未知原始源信号的过程。通常观测到的混合信号来自多个传感器的输出,并且传感器的输出信号独立性(线性不相关)。
盲信号的“盲”字强调了两点:1)原始信号并不知道;2)对于信号混合的方法也不知道。
盲源分离的目的:求得源信号的最佳估计。(当盲源分离的各分量相互独立时,就成为独立分量分析)[2]。
寻找一个类似于【公式1】中矩阵B确定线性变换,使得随机变量Yi,i=1,2,..n尽可能独立,流程示意如下图所示:
因此,BSS的主要工作是寻找一个线性滤波器或者是一个权重矩阵B。理想的条件下,B矩阵是A矩阵的逆矩阵。由于参数空间不是欧几里得度量,在大多的情况下都是黎曼度量,因此对于B(或W)矩阵的求解选用自然梯度解法。
其中随机向量X=(x1,x2,…,xn)表示观测数据或观测信号(observed data),随机向量S=(s1,s2,…,sn)表示源信号,称为独立成分(independent components),A称为nxn的混合矩阵(mixing matrix),在该模型中,X表示的是一个随机向量,x(t)表示随机向量X的一个样本;Y=BX=BAS;Y是我们求解后的成分信号,S是源信号,若要使Y最大程度上逼近S,这实际上就是个优化过程,只需要满足解混合矩阵B是最佳估计A的逆矩阵就好。
上图所示是标准的独立成分分析模型,可以看作成一个生成模型(generativemodel),它的意思是说观测信号是通过源信号混合而生成的,在这个意义下,独立成分也称为隐含或潜在交量(hidden/latent , nariable ),也就是说这些独立成分是无法直接观测到的,另一方面,混合系数矩阵A也是未知的。
为了进一步理解ICA的统计模型,我们假设两个独立分量服从下面的均匀分布:
选择均匀分布的取值范围,使得均值为0,方差为1。S1和S2的联合密度在正方形内是均匀的,这源于联合密度的基础定义:两个独立变量的联合密度是他们边密度的乘积。联合密度如下图4所示,数据点是从分布中随机抽取。
现在混合这两个独立成分,我们取下面的混合矩阵:
这得出了两个混合变量,X1和X2,很容易得出混合数据在一个平行四边形上的均匀分布,如下图5所示:
我们可以看到,随机变量X1和X2不再独立,换一种说法是,是否有可能从一个值去预测另一个值。假设X1的值为最大或最小值,那么X2的值就可以确定了。如上图中红框圈起来的数据点所示。由此可知,X1和X2已经不再独立了。但是对于图4中的随机变量S1和S2情况就不同了,如果我们知道S1的值,那么无论通过什么方式都无法确定S2的值。
估计ICA数据模型的问题现在成为仅利用混合X1和X2的信息来估计混合矩阵A0,实际上,我们可以通过观察上图来直观的估计矩阵A:平行四边形的边的方向就是混合矩阵A的列所指的方向。这样独立成分分析的解可以通过确定混合方向来得到,但在标准的ICA中这样的计算是较为复杂的,我们可以寻找更为方便,计算简单,且适用于独 立成分的任何分布的算法,这里只给出ICA的直观解释。
独立成分分析的任务:在只知道观测信号X的T个样本x(1),…,x(T),且在源信号S和混合矩阵A未知的条件下,假设源信号si(0=1,…,n)之间是相互统计独立的,来求解混合矩阵A和源信号s。
为了确保ICA模型能被估计,我们必须做出一定的假设和约束(即应用ICA的前提条件):
1)独立成分被假定是统计独立的(前提条件);
2)独立成分具有非高斯的分布(高斯分布时,ICA本质上是不可实现的);
3)为了简单起见,假定混合矩阵是方阵(独立成分的个数与观测到的混合量个数相同)。
在定义的ICA模型中,很容易发现存在下面一些必然的含混因素或者不确定性,具体而言:
1)我们无法确定独立成分的方差/能量;(原因是混合矩阵A和独立成分S都是未知的,不过在绝大多数的应用中,这种含混因素是无关紧要的)
2)我们无法确定独立成分的次序。(原因是混合矩阵A和独立成分S都是未知的,另外ICA所求得的解是波形保持解,在某些特殊的应用中,需要确定输出成分的顺序,为此,可以通过某些统计量的大小来规定输出独立成分的顺序)
前面的五小章节主要介绍了ICA的一些基础概念,接下来,将叙述ICA的实际应用,下图为应用ICA算法的简化处理流程。
在ICA的实际应用中,为了简化算法,亦或者应用过程中可能出现的问题,如过学习和数据中的噪声,我们常常会对数据进行预处理操作,具体操作方法有如下几种类型:
1)变量的中心化处理;(实现混合变量和独立成分的零均值);
2)白化;(实现变量的去相关)
3)主成分分析(PCA)降维;(简化算法)
4)时间滤波(降低数据中的噪声)
I C A 估 计 方 法 = 目 标 函 数 + 优 化 算 法 ICA估计方法=目标函数+优化算法 ICA估计方法=目标函数+优化算法
在目标函数明确的情况下,我们可以使用任何经典的优化算法,如(随机)梯度算法和牛顿方法,然而在某些情况下,算法和估计原理可能难以区分。
ICA算法的性质依赖于目标函数和优化算法。特别是:
理想情况下,这两类性质是独立的,即不同的优化方法可以用来优化同一个目标函数,一个优化方法可以用来优化不同的目标函数[4]。
ICA算法的研究主要可分为基于信息论准则的迭代估计方法和基于统计学的代数方法两大类,从原理上来说,它们都是利用了源信号的独立性和非高斯性。基于信息论的方法研究中,各国学者从最大熵、最小互信息、最大似然和负熵最大化等角度提出了一系列估计算法。如FastICA算法, Infomax算法,最大似然估计算法等。基于统计学的方法主要有二阶累积量、四阶累积量等高阶累积量方法。
独立成分分析(ICA)己经成功地应用在图像处理、语音信号处理、生物医学信号处理、模式识别、数据挖掘、通讯和金融等领域。
FastICA算法,又称不动点(Fixed-Point)算法,是由芬兰赫尔辛基大学Hyvärinen等人提出来的。是一种快速寻优迭代算法,与普通的神经网络算法不同的是这种算法采用了批处理的方式,即在每一步迭代中有大量的样本数据参与运算。但是从分布式并行处理的观点看该算法仍可称之为是一种神经网络算法。
FastICA算法有基于峭度、基于似然最大、基于负熵最大等形式,这里,我们介绍基于负熵最大的FastICA算法(可以有效地把不动点迭代所带来的优良算法特性与负熵所带来的更好统计特性结合起来)。它以负熵最大作为一个搜寻方向,可以实现顺序地提取独立源,充分体现了投影追踪(Projection Pursuit)这种传统线性变换的思想。此外,该算法采用了定点迭代的优化算法,使得收敛更加快速、稳健。
因为FastICA算法以负熵最大作为一个搜寻方向,因此先讨论一下负熵判决准则。由信息论理论可知:在所有等方差的随机变量中,高斯变量的熵最大,因而我们可以利用熵来度量非高斯性,常用熵的修正形式,即负熵。根据中心极限定理,若一随机变量由许多相互独立的随机变量之和组成,只要具有有限的均值和方差,则不论其为何种分布,随机变量较更接近高斯分布。换言之,较的非高斯性更强。因此,在分离过程中,可通过对分离结果的非高斯性度量来表示分离结果间的相互独立性,当非高斯性度量达到最大时,则表明已完成对各独立分量的分离[1]。
这里不做赘述,详情请见: 独立成分分析FastICA算法原理
准备两段原始的清晰语音文件:sound1,sound2。(提取码:muda)
%MATLAB代码:
[S1,fs1] = audioread('C:\Users\非黑不即白\Desktop\ICA\ICA\sound1.wav'); % 读取原始语音信号
[S2,fs2] = audioread('C:\Users\非黑不即白\Desktop\ICA\ICA\sound2.wav');
subplot(3,2,1),plot(S1),title('输入信号1');
subplot(3,2,2),plot(S2),title('输入信号2');
% 将其组成矩阵
s1 = S1';
s2 = S2';
S=[s1;s2];
Sweight = rand(size(S,1));
MixedS=Sweight*S; % 将混合矩阵重新排列并输出
subplot(3,2,3),plot(MixedS(1,:)),title('混合信号1');
subplot(3,2,4),plot(MixedS(2,:)),title('混合信号2');
% wavwrite(MixedS(1,:),8000,8,'mixed_wav1.wav');%保存wav数据
% wavwrite(MixedS(1,:),8000,8,'mixed_wav2.wav');
MixedS_bak=MixedS;
%%%%%%%%%%%%%%%%%%%%%%%%%% 标准化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MixedS_mean=zeros(2,1);
for i=1:2
MixedS_mean(i)=mean(MixedS(i,:));
end % 计算MixedS的均值
for i=1:2
for j=1:size(MixedS,1)
MixedS(i,j)=MixedS(i,j)-MixedS_mean(i);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%% 白化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MixedS_cov=cov(MixedS'); % cov为求协方差的函数
[E,D]=eig(MixedS_cov); % 对信号矩阵的协方差函数进行特征值分解
Q=inv(sqrt(D))*(E)'; % Q为白化矩阵
MixedS_white=Q*MixedS; % MixedS_white为白化后的信号矩阵
IsI=cov(MixedS_white'); % IsI应为单位阵
%%%%%%%%%%%%%%%%%%%%%%%% FASTICA算法 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X=MixedS_white; % 以下算法将对X进行操作
[VariableNum,SampleNum]=size(X);
numofIC=VariableNum; % 在此应用中,独立元个数等于变量个数
B=zeros(numofIC,VariableNum); % 初始化列向量w的寄存矩阵,B=[b1 b2 ... bd]
for r=1:numofIC
i=1;maxIterationsNum=1000; % 设置最大迭代次数(即对于每个独立分量而言迭代均不超过此次数)
IterationsNum=0;
b=rand(numofIC,1)-.5; % 随机设置b初值
b=b/norm(b); % 对b标准化 norm(b):向量元素平方和开根号
while i<=maxIterationsNum+1
if i == maxIterationsNum % 循环结束处理
fprintf('\n第%d分量在%d次迭代内并不收敛。', r,maxIterationsNum);
break;
end
bOld=b;
a2=1;
u=1;
t=X'*b;
g=t.*exp(-a2*t.^2/2);
dg=(1-a2*t.^2).*exp(-a2*t.^2/2);
b=((1-u)*t'*g*b+u*X*g)/SampleNum-mean(dg)*b;
% 核心公式
b=b-B*B'*b; % 对b正交化
b=b/norm(b);
if abs(abs(b'*bOld)-1)<1e-9 % 如果收敛,则
B(:,r)=b; % 保存所得向量b
break;
end
i=i+1;
end
end
for k=1:numofIC
W(:,k)=B(:,k)/5^k; % 得到解混矩阵W
end
%%%%%%%%%%%%%%%%%%%%%%%%%% ICA计算的数据复原并构图 %%%%%%%%%%%%%%%%%%%%%%%%%
ICAedS=W'*Q*MixedS_bak; % 计算ICA后的矩阵
% 将混合矩阵重新排列并输出
subplot(3,2,5),plot(ICAedS(1,:)),title('ICA解混信号1');
subplot(3,2,6),plot(ICAedS(2,:)),title('ICA解混信号2');
% wavwrite(ICAedS(1,:),8000,8,'fastica_wav1.wav');%保存wav数据
% wavwrite(ICAedS(2,:),8000,8,'fastica_wav2.wav');
由上图我们可以看出,程序执行结果良好,输入信号1、2与ICA解混信号1、2近似等同,即采用该算法能够很好的对混合信号实现解混操作,得到与原始信号近似的两个独立成分。
文章参考来源:
[1] https://blog.csdn.net/ctyqy2015301200079/article/details/86705869 学习笔记 | 独立成分分析(ICA, FastICA)及应用
[2] https://wenku.baidu.com/view/ca9e450b8f9951e79b89680203d8ce2f0166653b.html 百度文库|独立成分分析
[3] https://blog.csdn.net/Tonywu2018/article/details/91490158 详解独立成分分析
[4] 《独立成分分析》AapoHyvarinen 编著
[5] https://blog.csdn.net/a358463121/article/details/105622832 独立成分分析FastICA算法原理
补充:
https://blog.csdn.net/cai2016/article/details/52983473 ICA(独立成分分析)在信号盲源分离中的应用
https://blog.csdn.net/u012421852/article/details/80500891 【机器学习】【ICA-1】概率统计/代数知识详解:高斯分布、概率密度函数、累积分布函数、联合分布函数、复合函数的概率密度函数、行列式求导等
https://blog.csdn.net/u012421852/article/details/80500940 【机器学习】【ICA-2】ICA独立成分分析的原理 + ICA前的预处理(中心化+漂白)
https://blog.csdn.net/zb1165048017/article/details/48464573 ICA独立成分分析—FastICA基于负熵最大
https://blog.csdn.net/lizhe_dashuju/article/details/50263339 史上最直白的ICA教程之一
https://blog.csdn.net/sinat_37965706/article/details/71330979 因子分析、主成分分析(PCA)、独立成分分析(ICA)——斯坦福CS229机器学习个人总结(六)
https://blog.csdn.net/nl997566011/article/details/69480074 语音增强研究现状与趋势分析
https://blog.csdn.net/qq_24163555/article/details/89378420 FASTICA独立成分分析matlab代码实现