色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

跪求非負獨立成分分析的matlab程序?

劉姿婷2年前14瀏覽0評論

您好,這樣的:

一、FastICA算法的基本步驟:

1.對觀測數據進行中心化,使它的均值為0;

2.對數據進行白化,。

3.選擇需要估計的分量的個數,設迭代次數

4.選擇一個初始權矢量(隨機的)。

5.令,非線性函數的選取見前文。

6.。

7.令。

8.假如不收斂的話,返回第5步。

9.令,如果,返回第4步。

二.MATLAB源程序及說明:

%下程序為ICA的調用函數,輸入為觀察的信號,輸出為解混后的信號

functionZ=ICA(X)

%-----------去均值---------

[M,T]=size(X);%獲取輸入矩陣的行/列數,行數為觀測數據的數目,列數為采樣點數

average=mean(X')';%均值

fori=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);

forn=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));

whileabs(WP-LastWP)&abs(WP+LastWP)>Critical

count=count+1;%迭代次數

LastWP=WP;%上次迭代的值

%WP=1/T*Z*((LastWP'*Z).^3)'-3*LastWP;

fori=1:m

WP(i)=mean(Z(i,:).*(tanh((LastWP)'*Z)))-(mean(1-(tanh((LastWP))'*Z).^2)).*LastWP(i);

end

WPP=zeros(m,1);

forj=1:n-1

WPP=WPP+(WP'*W(:,j))*W(:,j);

end

WP=WP-WPP;

WP=WP/(norm(WP));

ifcount==Maxcount

fprintf('未找到相應的信號);

return;

end

end

W(:,n)=WP;

end

Z=W'*Z;

%以下為主程序,主要為原始信號的產生,觀察信號和解混信號的作圖

clearall;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([0N-5,5]);title('源信號');

subplot(4,1,2);plot(s2);axis([0N-5,5]);

subplot(4,1,3);plot(s3);axis([0N-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');