📄 bp小波神经网络快速学习算法研究.txt
字号:
这是我根据《BP小波神经网络快速学习算法研究》(李金屏,王风涛,杨波的论文)做的MATLAB程序。我感觉还是有点欠缺:表面现象是收敛速度还是不快,没有论文上说的那么快。现在我拿来让大家给我指导指导。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
程序如下:
%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)
if temp(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; %收敛速度跟g,l有关,请自己调节!
l=0.0008; %收敛速度跟g,l有关,请自己调节!
t=SamIn;
study_rate=0.08;
count=0;
Err_NetworkOut_SamOuts=[]; % 全局变量
NetworkOutSet=[]; % 局部变量
for i=1:N
NetworkOut=0; % 局部变量
for j=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=[NetworkOutSet NetworkOut];
end
% 计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); % 误差函数
former=Err_NetworkOut_SamOut; % 记录前一次的误差
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_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=[]; % 局部变量
for i=1:15
for j=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
while ErrRate>=0.005
% 计算前向传播网络
% 采用小波函数h(t)=cos(1.75t).*exp(-t^2/2);
NetworkOutSet=[];
for i=1:N
NetworkOut=0;
for j=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=[NetworkOutSet NetworkOut];
end
%计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_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=[];
for i=1:15
for j=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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
望各路英雄指导迷津,算法中的“BP”不是常规意义上的反向传播。
看看这个改进的程序,给我带来了希望
%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)
if temp(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=[]; % 局部变量
for i=1:N
NetworkOut=0; % 局部变量
for j=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=[NetworkOutSet NetworkOut];
end
% 计算误差函数和相对误差
count=count+1;
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); % 误差函数
former=Err_NetworkOut_SamOut; % 记录前一次的误差
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_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=[];% 增加量集合
for i=1:15
for j=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
while ErrRate>=0.0005
% 计算前向传播网络
% 采用小波函数h(t)=cos(1.75t).*exp(-t^2/2);
NetworkOutSet=[];
for i=1:N
NetworkOut=0;
for j=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=[NetworkOutSet NetworkOut];
end
%计算误差函数和相对误差
Err_NetworkOut_SamOut=(1/2)*sumsqr(NetworkOutSet-SamOut); %误差函数
Err_NetworkOut_SamOuts=[Err_NetworkOut_SamOuts Err_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=[]; % 局部变量:梯度集合
for i=1:15
for j=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
流程图在另一个帖子中
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -