📄 ica2.m
字号:
%基于峭度极大的ICA算法
clear
%模拟数据
a=0:pi/4:100;
b=sin(a);
[m,n]=size(b);
c=rand(m,n);
data=zeros(2,n);
data(1,:)=b+c;
data(2,:)=0.5*b+2*c;
[M,N]=size(data);
%画出数据
for(i=1:M)
subplot(M,1,i);
plot(data(M,:));
end
%去均值
mean1=mean(data,2);
X=zeros(M,N);
for(i=1:M)
X(i,:)=data(i,:)-mean1(i,1);
end
%whiten
[U1,S1,V1]=svd(X); %对观测数据进行奇异值分解
P=U1'*X; %主分量分解
C=P*P';
Z=C^(-1/2)*P; %观测数据的白化
%对W赋初值,设置迭代步长
W=eye(M,M);
u=0.01; %迭代步长
%算法迭代
W1=zeros(M,M);
%step
i=1;
W1(:,i)=W(:,i);
partial=4*sign(mean((W1(:,i)'*Z).^4,2)-3)*mean((W1(:,i)'*Z).^3*Z',2);
W0=zeros(M,1);
W0=W1(:,i);
W1(:,i)=W0+u*partial;
W1(:,i)=W1(:,i)/norm(W1(:,i));
while((norm(W1(:,i)-W0))>=0.0001)
W0=W1(:,i);
W1(:,i)=W0+u*partial;
W1(:,i)=W1(:,i)/norm(W1(:,i));
end
%step
i=2;
W1(:,i)=W(:,i);
partial=4*sign(mean((W1(:,i)'*Z).^4,2)-3)*mean((W1(:,i)'*Z).^3*Z',2);
W0=zeros(N,1);
W0=W1(:,i);
W1(:,i)=W0+u*partial;
W1(:,i)=W1(:,i)/norm(W1(:,i));
while((norm(W1(:,i)-W0))>=0.0001)
W0=W1(:,i);
W1(:,i)=W0+u*partial;
W1(:,i)=W1(:,i)/norm(W1(:,i));
end
%判断是否正交
while(W1(:,2)'*W1(:,1)>=0.01)
W1(:,i)=W(:,i);
partial=4*sign(mean((W1(:,i)'*Z).^4,2)-3)*mean((W1(:,i)'*Z).^3*Z',2);
W0=zeros(N,1);
W0=W1(:,i);
W1(:,i)=W0+u*partial;
W1(:,i)=W1(:,i)/norm(W1(:,i));
while((norm(W1(:,i)-W0))>=0.0001)
W0=W1(:,i);
W1(:,i)=W0+u*partial;
W1(:,i)=W1(:,i)/norm(W1(:,i));
end
end
% W(:,i)=W1(:,i);
%分离后矩阵
Y=zeros(M,N);
Y=W1'*Z;
%画出分离后的图形
for(i=1:M)
subplot(4,1,i);
plot(Y(i,:));
end
subplot(4,1,3);
plot(b);
subplot(4,1,4);
plot(c);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -