%FastICA算法代码
%对数据进行标准化
close all,clear
load 105.mat
X=X105_BA_time';
[M,T] = size(X);
average=mean(X')';
for i=1:M
X(i,:)=X(i,:)-average(i)*ones(1,T);
end
%对数据进行白化,使之为0均值,单位协方差
Cx=cov(X',1);
[eigvector,eigvalue]=eig(Cx);
W=eigvalue^(-1/2)*eigvector';
Z=W*X;
%使用FastICA算法对数据进行特征提取.非线性函数选择tanh(a1y)
Maxcount=10000; %最大迭代次数
Critical=0.00001; %判断是否收敛
m=12; %需要估计的分量的个数
W=rand(m);
for n=1:m
WP=W(:,n); %初始权矢量(任意)
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; %上次迭代的值
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
D=W'*Z;
评论0