独立成分分析 matlab 程序

作者&投稿:戴眉 (若有异议请与网页底部的电邮联系)
跪求非负独立成分分析的matlab程序?~

您好, 这样的:
一、FastICA算法的基本步骤:
1. 对观测数据进行中心化,使它的均值为0;
2. 对数据进行白化,。
3. 选择需要估计的分量的个数,设迭代次数
4. 选择一个初始权矢量(随机的)。
5. 令,非线性函数的选取见前文。
6. 。
7. 令。
8. 假如不收敛的话,返回第5步。
9.令,如果,返回第4步。

二.MATLAB源程序及说明:
%下程序为ICA的调用函数,输入为观察的信号,输出为解混后的信号
function Z=ICA(X)
%-----------去均值---------
[M,T] = size(X); %获取输入矩阵的行/列数,行数为观测数据的数目,列数为采样点数
average= mean(X')'; %均值
for i=1:M
X(i,:)=X(i,:)-average(i)*ones(1,T);
end
%---------白化/球化------
Cx = cov(X',1); %计算协方差矩阵Cx
[eigvector,eigvalue] = eig(Cx); %计算Cx的特征值和特征向量
W=eigvalue^(-1/2)*eigvector'; %白化矩阵
Z=W*X; %正交矩阵

%----------迭代-------
Maxcount=10000; %最大迭代次数
Critical=0.00001; %判断是否收敛
m=M; %需要估计的分量的个数
W=rand(m);
for n=1:m
WP=W(:,n); %初始权矢量(任意)
% Y=WP'*Z;
% G=Y.^3;%G为非线性函数,可取y^3等
% GG=3*Y.^2; %G的导数
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; %上次迭代的值
% WP=1/T*Z*((LastWP'*Z).^3)'-3*LastWP;
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
Z=W'*Z;

%以下为主程序,主要为原始信号的产生,观察信号和解混信号的作图
clear all;clc;
N=200;n=1:N;%N为采样点数
s1=2*sin(0.02*pi*n);%正弦信号
t=1:N;s2=2*square(100*t,50);%方波信号
a=linspace(1,-1,25);s3=2*[a,a,a,a,a,a,a,a];%锯齿信号
s4=rand(1,N);%随机噪声
S=[s1;s2;s3;s4];%信号组成4*N
A=rand(4,4);
X=A*S;%观察信号

%源信号波形图
figure(1);subplot(4,1,1);plot(s1);axis([0 N -5,5]);title('源信号');
subplot(4,1,2);plot(s2);axis([0 N -5,5]);
subplot(4,1,3);plot(s3);axis([0 N -5,5]);
subplot(4,1,4);plot(s4);xlabel('Time/ms');
%观察信号(混合信号)波形图
figure(2);subplot(4,1,1);plot(X(1,:));title('观察信号(混合信号)');
subplot(4,1,2);plot(X(2,:));
subplot(4,1,3);plot(X(3,:));subplot(4,1,4);plot(X(4,:));

Z=ICA(X);

figure(3);subplot(4,1,1);plot(Z(1,:));title('解混后的信号');
subplot(4,1,2);plot(Z(2,:));
subplot(4,1,3);plot(Z(3,:));
subplot(4,1,4);plot(Z(4,:));xlabel('Time/ms');

function [lambda,T,fai]=MSA2(A)
%求标准化后的协差矩阵,再求特征根和特征向量
%标准化处理
[p,n]=size(A);
for j=1:n
mju(j)=mean(A(:,j));
sigma(j)=sqrt(cov(A(:,j)));
end
for i=1:p
for j=1:n
Y(i,j)=(A(i,j)-mju(j))/sigma(j);
end
end
sigmaY=cov(Y);
%求X标准化的协差矩阵的特征根和特征向量
[T,lambda]=eig(sigmaY);
Xsum=sum(sum(lambda,2),1);
for i=1:n
fai(i)=lambda(i,i)/Xsum;
end
%方差贡献率

FastICA算法的基本步骤:
1. 对观测数据进行中心化,使它的均值为0;
2. 对数据进行白化,。
3. 选择需要估计的分量的个数,设迭代次数
4. 选择一个初始权矢量(随机的)。
5. 令,非线性函数的选取见前文。
6. 。
7. 令。
8. 假如不收敛的话,返回第5步。
9.令,如果,返回第4步。

二.MATLAB源程序及说明:
%下程序为ICA的调用函数,输入为观察的信号,输出为解混后的信号
function Z=ICA(X)
%-----------去均值---------
[M,T] = size(X); %获取输入矩阵的行/列数,行数为观测数据的数目,列数为采样点数
average= mean(X')'; %均值
for i=1:M
X(i,:)=X(i,:)-average(i)*ones(1,T);
end
%---------白化/球化------
Cx = cov(X',1); %计算协方差矩阵Cx
[eigvector,eigvalue] = eig(Cx); %计算Cx的特征值和特征向量
W=eigvalue^(-1/2)*eigvector'; %白化矩阵
Z=W*X; %正交矩阵

%----------迭代-------
Maxcount=10000; %最大迭代次数
Critical=0.00001; %判断是否收敛
m=M; %需要估计的分量的个数
W=rand(m);
for n=1:m
WP=W(:,n); %初始权矢量(任意)
% Y=WP'*Z;
% G=Y.^3;%G为非线性函数,可取y^3等
% GG=3*Y.^2; %G的导数
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; %上次迭代的值
% WP=1/T*Z*((LastWP'*Z).^3)'-3*LastWP;
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
Z=W'*Z;

%以下为主程序,主要为原始信号的产生,观察信号和解混信号的作图
clear all;clc;
N=200;n=1:N;%N为采样点数
s1=2*sin(0.02*pi*n);%正弦信号
t=1:N;s2=2*square(100*t,50);%方波信号
a=linspace(1,-1,25);s3=2*[a,a,a,a,a,a,a,a];%锯齿信号
s4=rand(1,N);%随机噪声
S=[s1;s2;s3;s4];%信号组成4*N
A=rand(4,4);
X=A*S;%观察信号

%源信号波形图
figure(1);subplot(4,1,1);plot(s1);axis([0 N -5,5]);title('源信号');
subplot(4,1,2);plot(s2);axis([0 N -5,5]);
subplot(4,1,3);plot(s3);axis([0 N -5,5]);
subplot(4,1,4);plot(s4);xlabel('Time/ms');
%观察信号(混合信号)波形图
figure(2);subplot(4,1,1);plot(X(1,:));title('观察信号(混合信号)');
subplot(4,1,2);plot(X(2,:));
subplot(4,1,3);plot(X(3,:));subplot(4,1,4);plot(X(4,:));

Z=ICA(X);

figure(3);subplot(4,1,1);plot(Z(1,:));title('解混后的信号');
subplot(4,1,2);plot(Z(2,:));
subplot(4,1,3);plot(Z(3,:));
subplot(4,1,4);plot(Z(4,:));xlabel('Time/ms');

我当时也是因为自己写论文需要这个算标准值,独立成分我也不会,实在不好意思哦,等别的高手来解答你吧!呵呵


镇赉县19689826857: 跪求非负独立成分分析的matlab程序? -
晁昆里拉: 您好, 这样的: 一、FastICA算法的基本步骤: 1. 对观测数据进行中心化,使它的均值为0; 2. 对数据进行白化,. 3. 选择需要估计的分量的个数,设迭代次数 4. 选择一个初始权矢量(随机的). 5. 令,非线性函数的选取见前文. 6. . 7. 令....

镇赉县19689826857: 急用matlab 主成分分析全程序
晁昆里拉: function [lambda,T,fai]=MSA2(A) %求标准化后的协差矩阵,再求特征根和特征向量 %标准化处理 [p,n]=size(A); for j=1:n mju(j)=mean(A(:,j)); sigma(j)=sqrt(cov(A(:,j))); end for i=1:p for j=1:n Y(i,j)=(A(i,j)-mju(j))/sigma(j); end end sigmaY=cov(Y); %求...

镇赉县19689826857: PCA主成分分析matlab代码? -
晁昆里拉: [coef,SCORE,latent] = princomp(A); latentsum = sum(latent); for i = 1:col%A的总列数 if sum(latent(1:i))/latentsum > threshold%阈值 eg:0.95 tranM = coef(:,1:i); break; end end B = A* tranM;

镇赉县19689826857: 用matlab如何做代谢组学的主成分分析? -
晁昆里拉: 对于使用matlab做主成分分析,我认为比较复杂,而使用SPSS软件求解的话,相对要简单得多,你完全可以用SPSS软件来求解,那时间不会超过2小时.如果你真的想用matlab的话, 对于主成份分析.我给你一个不错的关于主成分和因子分析...

镇赉县19689826857: 主成分分析法matlab的通用程序 -
晁昆里拉: [coeff,score,latent,tsquared]=princomp(X)

镇赉县19689826857: 在matlab中做主成分分析 -
晁昆里拉: latent 是eigen value 并不是对应原来的每一列,主成分分析做完以后其实结果是在数据自己的维度下,而不是原有的行列的维度

镇赉县19689826857: 怎么把excel的数据导入到matlab然后用主成分分析法分析结果 求具体程序过程
晁昆里拉: excel数据表可以直接导入matlab的. 打开matlab之后,做file选项里,找import data,然后选择你存放excel数据的路径,然后选择对应文件,然后点击导入,就ok了. 至于 主成分分析法,木有研究,无能为力.

镇赉县19689826857: 如何用matlab分析电流里面各次谐波的成分 -
晁昆里拉: 1.如果你是用编程的话,可以用matlab提供的fft函数分析,下面是给你举个例子:给定数学函数:x(t)=12sin(2pi*10t+pi/4)+5cos(2pi*40t) 程序如下:N=128; %采样点数 T=1; %采样时间终点 t=linspace(0,T,N); %给出N个采样时间ti(i=1:N) x=...

镇赉县19689826857: 老师给的matlab程序,一篇论文里的,关于主成分分析的,我具体该怎么运行啊? -
晁昆里拉: matlab里面有个m文件编辑器的,你通过那个把这些.m文件打开就知道怎么运行了

镇赉县19689826857: 如何用fastica 对数据集进行特征提取?本人初学,已有matlab程序只能对信号进行独立成分分析,求助! -
晁昆里拉: FastICA不能降维,但是你感兴趣的信号只是其中一部分吧,只对分离后的独立分离进行分析,算是特征提取的第一步.特征提取没什么太多捷径,都是具体问题具体分析.很炫的提取算法和学习算法都比不过对特征的认识.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网