绪论

独立成分分析ICA是一个在多领域被应用的基础算法。ICA是一个不定问题,没有确定解,所以存在各种不同先验假定下的求解算法。相比其他技术,ICA的开源代码不是很多,且存在黑魔法–有些步骤并没有在论文里提到,但没有这些步骤是无法得到正确结果的。

ICA原理

就是源信号加权混合后通过ICA分离

clear;clc;close all;% ts=0.005
% t=np.arange(0,1,ts)
% s1=np.sin(2*np.pi*10*t);s2=np.sin(2*np.pi*20*t);s2=np.array(20 * (5 * [2] + 5 * [-2]));a9mysubplot.mysubplot([s1,s2])
% s=0.5*s1+0.5*s2;a9myplot.myplot(s)ts=0.005;
t=0:0.005:1;
s1=sin(2*pi*10*t);
s2=square(2*pi*20*t,50);
% plot(s2);
% figure(1);subplot(211);plot(s1);subplot(212);plot(s2);
subplot(3,2,1),plot(s1),title('输入信号1');
subplot(3,2,2),plot(s2),title('输入信号2');S=[s1;s2];
% s=0.5*s1+0.5*s2;S=[s;s];
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');MixedS_bak=MixedS;
%%%%%%%%%%%%%%%%%%%%%%%%%%  标准化  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MixedS_mean=zeros(2,1);
for i=1:2MixedS_mean(i)=mean(MixedS(i,:));
end                                        % 计算MixedS的均值for i=1:2for 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:numofICi=1;maxIterationsNum=1000;               % 设置最大迭代次数(即对于每个独立分量而言迭代均不超过此次数)IterationsNum=0;b=rand(numofIC,1)-.5;                  % 随机设置b初值b=b/norm(b);                           % 对b标准化 norm(b):向量元素平方和开根号while i<=maxIterationsNum+1if i == maxIterationsNum           % 循环结束处理fprintf('\n第%d分量在%d次迭代内并不收敛。', r,maxIterationsNum);break;endbOld=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;                     % 保存所得向量bbreak;endi=i+1;        end
endfor k=1:numofICW(:,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');

function Z=zf_fushang(x)
% 这是对信号源进行负熵分离
% 、、、、、、、、、预白化处理、、、、、、、、、、、、
[m,n]=size(x);
zerox=x-mean(x,2)*ones(1,n);%中心化
Cxx=cov(zerox.');
[vector,value]=eig(Cxx);
value=abs(value);
whiteMatrix=value^(-1/2)*vector';%白化处理
Z=whiteMatrix*zerox;% 、、、、、、、、、、使用负熵分离信源、、、、、、、、、
maxcount=100;%设定最大的循环次数
minvalue=1E-6;%设定收敛的门限值
w=ones(m,m);%设定初始的权矢量
B=[];
for k=1:mwp=w(:,k);count=0;lastwp=zeros(m,1);while abs(abs(wp'*lastwp)-1)>minvaluecount=count+1;lastwp=wp;for i=1:m     %选择的G函数是G(y)=-exp(-y^2/2)g=(lastwp'*Z).*exp(-0.5*(lastwp'*Z).^2);%一次微分dg=(1-(lastwp'*Z).^2).*exp(-0.5*(lastwp'*Z).^2);%二次微分
% /----------------------------------------------wp(i,:)=mean(Z(i,:).*g)-mean(dg)*lastwp(i,:);end
%、、、、、、、、、、、对已经提取的分量进行正交化、、、、、、、、、、、、if(k>1)wp=wp-w(:,1:(k-1))*w(:,1:(k-1))'*wp;endwp=wp./norm(wp);if count>=maxcountfprintf('未找到相应的信号');return;endendw(:,k)=wp;
end
Z=w.'*Z;

我太懒了,直接附图片吧

在这里插入图片描述

看完秒懂ICA(含MATLAB和python代码)相关推荐

  1. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  2. 2个字节能存多少个16进制_Java语言中最大的整数再加1等于多少?看完秒懂

    短文涨姿势,看了不白看,不关注等啥? 已知Java语言中int类型所能表示的最大整数为2147483647,请问以下代码执行结果是什么? 一部分人都会认为这段程序压根就无法通过编译,也有人认为,这段程 ...

  3. win10系统文件拖拽卡顿_终于找到Win10卡顿病根了!看完秒懂

    原标题:终于找到Win10卡顿病根了!看完秒懂 我们知道Win10自带了杀毒方案Windows Defender,但这在提高安全性的同时,在某些场景也带来了卡顿. 例如开启内藏大量exe的文件夹的时候 ...

  4. 计算机硬件发展慢,老电脑卡慢应该更换哪些硬件?看完秒懂

    原标题:老电脑卡慢应该更换哪些硬件?看完秒懂 现如今时代的发展可以说的上是突飞猛进,许多高科技的东西也是出现在我们生活当中,同时也承担起了重要的作用.就拿电子产品电脑来讲,也是满足了不同用户的需求. ...

  5. 台式计算机里的电池有啥用,电脑主板上的电池有什么用?看完秒懂!

    众所周知,电脑主板上面有一块纽扣电池,但很多人不知道主板上的电池是干什么用的,今天小编就来说说这个主板上不起眼的电池有什么用,电脑小白不妨跟随小编来科普一下,看完秒懂! 主板电池作用 1.系统时间 如 ...

  6. modbus rtu与计算机通讯,Modbus通讯协议原来是这么回事!看完秒懂了

    原标题:Modbus通讯协议原来是这么回事!看完秒懂了 [www.gkwo.net]工程师必备网站 导语:ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用 ...

  7. 查看计算机配置讲解,教您如何看显示器参数!电脑显示器常见参数详解,看完秒懂!...

    由于显示器可选的范围比较广,同一个尺寸大小的显示器,不同品牌不同型号不同参数会有上百种可供选择,其实我们只需明确了预算与用途,才可以正确选择合适自己的显示器.那么如何看显示器参数?下面装机之家分享一下 ...

  8. 电感饱和怎么判断? 看完秒懂

    电感饱和怎么判断? 看完秒懂 电感饱和的原因 先直观的认识下什么是电感饱和,如图1: 图1 我们知道当图1线圈中通过电流时,线圈会产生磁场: 磁芯在磁场的作用下会被磁化,其内部磁畴会慢慢旋转: 当磁芯 ...

  9. 无盘服务器大内存的好处,4GB+64GB够用?看完秒懂,原来大内存还有那么多好处...

    原标题:4GB+64GB够用?看完秒懂,原来大内存还有那么多好处 随着智能手机的普及,手机APP也随之而来,成了我们生活的一部分.但是,随着APP数量的增多和体量的增大,也占据了手机的大部分内存,让不 ...

最新文章

  1. CIFS NFS SMB Samba 文件共享协议 介绍
  2. 5.30 Tree Traversal + Tree manipulation
  3. 0-1背包问题优化算法详解
  4. 创建ACCESS数据库,并且创建表和数据。重点:关闭ACCESS数据库引用
  5. 指数分布java_python-numpy-指数分布实例详解
  6. Fliptile POJ - 3279 (翻转)(二进制+对第一行暴力遍历翻转的位置)
  7. silverlight-Canvas中1像素的线变成了2像素
  8. 信贷违约风险评估模型(上篇):探索性数据分析
  9. LAMP架构部署论坛
  10. 如何用wps画三线图(最方便最快的方法)
  11. 英文打字训练程序c语言,x86汇编实现英文打字练习软件
  12. sqlserver while 用法
  13. 感谢同事的临别赠言,愿自己一路顺风。
  14. Oracle11g64位发行版安装教程
  15. 【大数据技术】实验3:熟悉常用的Hive操作
  16. Minecraft 命令方块:迷宫计时器(压力板计时系统)
  17. 数学和编程到底是什么关系?
  18. inter cpu 测试软件,Intel发布新版官方CPU检测工具支持64系统
  19. 获取计算机名和局域网内的工作组名称
  20. 「自然语言处理(NLP)」入门系列(一)初识NLP

热门文章

  1. 一个网站是如何上线的
  2. SQL Server2008 R2下载及安装
  3. 驱动轮是什么意思_驾驶机动车经常听说驱动轮那你知道是什么意思吗
  4. java中paras是什么意思_paras的使用方法是什么
  5. VMware如此强大,势必成为开源世界的老大
  6. 画世界怎么用光影_【色彩】色彩绘画时四种光影的运用~
  7. 配置http和https
  8. [数据分析] 决策树算法:决策树的概念
  9. ​致刚入行的程序猿:青春有限,莫被温水煮青蛙
  10. 轻断食:正在横扫全球的瘦身革命