小波神经网络程序.docx
《小波神经网络程序.docx》由会员分享,可在线阅读,更多相关《小波神经网络程序.docx(8页珍藏版)》请在冰豆网上搜索。
小波神经网络程序
主要思想:
用小波变换代替普通神经网络的激励函数
小波的参数b(平移因子)和a(伸缩因子)以及小波前的系数W
在网络中受到训练以逼近目标函数(信号)。
附件是我简单地画了一下流程图
%BP小波神经网络快速学习算法
clear
clc
SamIn=-10:
0.01:
10;
SamOut=2*sin(3*SamIn).*exp(-0.1*SamIn.*SamIn);
%figure;plot(SamIn,SamOut);
%pause
%Bp小波神经网络参数初始化
W=rand(15,1);
B=10*rands(15,1);
%对伸缩因子A进行初始化
temp=rand(15,1);
i=1;
while(i<=15)
iftemp(i,1)<=0.5
A(i,1)=2*temp(i,1);
else
A(i,1)=8*temp(i,1)-3;
end
i=i+1;
end
%BP算法训练小波神经网络
N=2001;
g=1.01;
l=0.0008;
t=SamIn;
study_rate=0.08;
count=0;
Err_NetworkOut_SamOuts=[]; %全局变量
NetworkOutSet=[]; %局部变量
fori=1:
N
NetworkOut=0; %局部变量
forj=1:
15
tao=(t(i)-B(j,1))/A(j,1);
h=cos(1.75*tao).*exp(-tao^2/2);
NetworkOut=NetworkOut+h*W(j,1);
end
NetworkOutSet=[NetworkOutSetNetworkOut];
end
%计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
former=Err_NetworkOut_SamOut; %记录前一次的误差
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOutsErr_NetworkOut_SamOut];%误差函数集合
Err_SamOut=(1/2)*sumsqr(SamOut); %函数平方和
ErrRate=Err_NetworkOut_SamOut/Err_SamOut; %相对误差
%计算增加量
E_diff_W=0;%局部变量
E_diff_B=0;%局部变量
E_diff_A=0;%局部变量
E_diff_W1=[];%局部变量
E_diff_B1=[];%局部变量
E_diff_A1=[];%局部变量
fori=1:
15
forj=1:
N
tao=(t(j)-B(i,1))/A(i,1);
h=cos(1.75*tao).*exp(-tao^2/2);
f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
s1=SamOut(j)-NetworkOutSet(j);
s2=s1*h;
s3=s1*(W(i,1)/A(i,1))*exp(-tao^2/2).*f;
E_diff_W=E_diff_W+s2;
E_diff_B=E_diff_B+s3;
E_diff_A=E_diff_A+s3*tao;
end
E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_W1=[E_diff_W1,E_diff_W];
E_diff_B1=[E_diff_B1,E_diff_B];
E_diff_A1=[E_diff_A1,E_diff_A];
end
W=W-study_rate*E_diff_W1';
B=B-study_rate*E_diff_B1';
A=A-study_rate*E_diff_A1';
ErrRate
whileErrRate>=0.005
%计算前向传播网络
%采用小波函数h(t)=cos(1.75t).*exp(-t^2/2);
NetworkOutSet=[];
fori=1:
N
NetworkOut=0;
forj=1:
15
tao=(t(i)-B(j,1))/A(j,1);
h=cos(1.75*tao).*exp(-tao^2/2);
NetworkOut=NetworkOut+h*W(j,1);
end
NetworkOutSet=[NetworkOutSetNetworkOut];
end
%计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOutsErr_NetworkOut_SamOut];%误差函数集合
ErrRate=Err_NetworkOut_SamOut/Err_SamOut;%相对误差
now=Err_NetworkOut_SamOut;
Err_NetworkOut_SamOut
ErrRate
pause
%计算增加量
E_diff_W=0;
E_diff_B=0;
E_diff_A=0;
E_diff_W1=[];
E_diff_B1=[];
E_diff_A1=[];
fori=1:
15
forj=1:
N
tao=(t(j)-B(i,1))/A(i,1);
h=cos(1.75*tao).*exp(-tao^2/2);
f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
s1=SamOut(j)-NetworkOutSet(j);
s2=s1*h;
s3=s1*(W(i,1)/A(i,1))*exp(-tao^2/2).*f;
E_diff_W=E_diff_W+s2;
E_diff_B=E_diff_B+s3;
E_diff_A=E_diff_A+s3*tao;
end
E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_W1=[E_diff_W1,E_diff_W];
E_diff_B1=[E_diff_B1,E_diff_B];
E_diff_A1=[E_diff_A1,E_diff_A];
end
if(now>former)
study_rate=l*study_rate;
else
study_rate=g*study_rate;
end
former=now;
W=W-study_rate*E_diff_W1';
B=B-study_rate*E_diff_B1';
A=A-study_rate*E_diff_A1';
end
W
B
A
ErrRate
count
plot(1:
count,Err_NetworkOut_SamOuts)%误差曲线
%end
Doc1.doc(22.5KB)
改进
申请开设新版须知
Re:
【讨论】小波神经网络的程序流程图
看看改进的程序:
%BP小波神经网络快速学习算法
clear
clc
SamIn=-1:
0.001:
1;
SamOut=2*sin(3*SamIn).*exp(-0.1*SamIn.*SamIn);
%figure;plot(SamIn,SamOut);
%pause
%Bp小波神经网络参数初始化
W=rand(15,1);
B=10*rands(15,1);
%对伸缩因子A进行初始化
temp=rand(15,1);
i=1;
while(i<=15)
iftemp(i,1)<=0.5
A(i,1)=2*temp(i,1);
else
A(i,1)=8*temp(i,1)-3;
end
i=i+1;
end
%BP算法训练小波神经网络
N=2001;
g=1.55;
l=0.0008;
t=SamIn;
study_rate=0.0002;
m=0.2;%动量系数
count=0;
Err_NetworkOut_SamOuts=[]; %全局变量
NetworkOutSet=[]; %局部变量
fori=1:
N
NetworkOut=0; %局部变量
forj=1:
15
tao=(t(i)-B(j,1))/A(j,1);
h=cos(1.75*tao).*exp(-tao^2/2);
NetworkOut=NetworkOut+h*W(j,1);
end
NetworkOutSet=[NetworkOutSetNetworkOut];
end
%计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
former=Err_NetworkOut_SamOut; %记录前一次的误差
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOutsErr_NetworkOut_SamOut];%误差函数集合
Err_SamOut=(1/2)*sumsqr(SamOut); %函数平方和
ErrRate=Err_NetworkOut_SamOut/Err_SamOut; %相对误差
%计算增加量
E_diff_W=0;%局部变量:
梯度
E_diff_B=0;%局部变量:
梯度
E_diff_A=0;%局部变量:
梯度
E_diff_W1=[];%局部变量:
梯度集合
E_diff_B1=[];%局部变量:
梯度集合
E_diff_A1=[];%局部变量:
梯度集合
delt_w=0;
delt_b=0;
delt_a=0; %增加量
deltW=[];
deltB=[];
deltA=[];%增加量集合
fori=1:
15
forj=1:
N
tao=(t(j)-B(i,1))/A(i,1);
h=cos(1.75*tao).*exp(-tao^2/2);
f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
s1=SamOut(j)-NetworkOutSet(j);
s2=s1*h;
s3=s1*(W(i,1)/A(i,1))*exp(-tao^2/2).*f;
E_diff_W=E_diff_W+s2;
E_diff_B=E_diff_B+s3;
E_diff_A=E_diff_A+s3*tao;
end
E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_W1=[E_diff_W1,E_diff_W];
E_diff_B1=[E_diff_B1,E_diff_B];
E_diff_A1=[E_diff_A1,E_diff_A];
end
delt_w=-((1-m)*study_rate*E_diff_W1');
delt_b=-((1-m)*study_rate*E_diff_B1');
delt_a=-((1-m)*study_rate*E_diff_A1');
deltW=[deltW,delt_w];
deltB=[deltB,delt_b];
deltA=[deltA,delt_a];
W=W+delt_w;
B=B+delt_b;
A=A+delt_a;
ErrRate
whileErrRate>=0.0005
%计算前向传播网络
%采用小波函数h(t)=cos(1.75t).*exp(-t^2/2);
NetworkOutSet=[];
fori=1:
N
NetworkOut=0;
forj=1:
15
tao=(t(i)-B(j,1))/A(j,1);
h=cos(1.75*tao).*exp(-tao^2/2);
NetworkOut=NetworkOut+h*W(j,1);
end
NetworkOutSet=[NetworkOutSetNetworkOut];
end
%计算误差函数和相对误差
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOutsErr_NetworkOut_SamOut];%误差函数集合
ErrRate=Err_NetworkOut_SamOut/Err_SamOut;%相对误差
now=Err_NetworkOut_SamOut;
Err_NetworkOut_SamOut
ErrRate
pause
%计算增加量
E_diff_W=0;
E_diff_B=0;
E_diff_A=0;%初始化为0是为了计算各个参数的梯度;
E_diff_W1=[];%局部变量:
梯度集合
E_diff_B1=[];%局部变量:
梯度集合
E_diff_A1=[];%局部变量:
梯度集合
fori=1:
15
forj=1:
N
tao=(t(j)-B(i,1))/A(i,1);
h=cos(1.75*tao).*exp(-tao^2/2);
f=1.75*sin(1.75*tao)+tao*cos(1.75*tao);
s1=SamOut(j)-NetworkOutSet(j);
s2=s1*h;
s3=s1*(W(i,1)/A(i,1))*exp(-tao^2/2).*f;
E_diff_W=E_diff_W+s2;
E_diff_B=E_diff_B+s3;
E_diff_A=E_diff_A+s3*tao;
end
E_diff_W=-E_diff_W;
E_diff_B=-E_diff_B;
E_diff_A=-E_diff_A;
E_diff_W1=[E_diff_W1,E_diff_W];
E_diff_B1=[E_diff_B1,E_diff_B];
E_diff_A1=[E_diff_A1,E_diff_A];
end
if(now>former)%如果这样,减少学习速度,并设动量系数为0
study_rate=l*study_rate;
delt_w=-study_rate*E_diff_W1';
delt_b=-study_rate*E_diff_B1';
delt_a=-study_rate*E_diff_A1';
else%否则,增加学习速度,并恢复动量系数
study_rate=g*study_rate;
delt_w=m*deltW(:
count)-((1-m)*study_rate*E_diff_W1');
delt_b=m*deltB(:
count)-((1-m)*study_rate*E_diff_B1');
delt_a=m*deltA(:
count)-((1-m)*study_rate*E_diff_A1');
end
former=now;
W=W+delt_w;
B=B+delt_b;
A=A+delt_a;
deltW=[deltW,delt_w];
deltB=[deltB,delt_b];
deltA=[deltA,delt_a];
count=count+1;
end
W
B
A
ErrRate
count
plot(1:
count,Err_NetworkOut_SamOuts)%误差曲线
%end
下载次数:
23124
2005-9-2006:
23