基于负熵(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
- 基于负熵(fastICA)的盲源分离
- ICA独立成分分析—FastICA基于负熵最大
- 基于负熵的快速不动点算法
- 分离非负整数--gyy
- 盲源分离的略缩语
- FastICA算法
- FastICA算法
- 非负矩阵分解算法基于hadoop streaming的实现
- word2vec基于负采样的模型原理介绍
- 基于分离轴定理的碰撞检测
- 基于NodeJS的前后端分离
- 基于MySQL-Proxy的读写分离配置
- 基于NodeJS的前后端分离
- Mysql 基于 Amoeba 的 读写分离
- mysql基于amoeba的读写分离
- 基于分离轴定理的碰撞检测
- 基于mybatis+spring的读写分离
- 基于字符串的分离链接hash算法
- hdu 2717 Catch That Cow
- DSP前言
- Java基础——Lambda表达式
- python定义类
- 关于配置PHP的错误解决
- 基于负熵(fastICA)的盲源分离
- CODEVS 1690 开关灯
- JMX设置属性
- Linux命令之curl
- linux 共享内存
- Eclipse如何设置注释模板
- 数据结构
- 整合ssh框架的配置文件
- Android安全与逆向之在ubuntu上面搭建NDK环境