📄 nnidbpma.m
字号:
% 自适应学习率的动量bp算法辨识nonlinearFn1.m
% (Gradient descent w/momentum & adaptive lr backpropagation) nnidbpma.m
%
%
%songying, 2005-6-13
% 不会出现nnidbp.m中的仿真异常情况;也不会出现nnidbpa.m中拟合不好的情况
% 最终eta = 0.0153 0.0250 0.0292 0.0283 0.0304
% 0.0339 0.0448 0.0271 0.0320 0.0247 0.0312 0.0310 0.0208 0.0308
% 0.0385 0.0327 0.0274 0.0479 0.0285 0.0380 0.0363 0.0361 0.0465
% 0.0219 0.0375 0.0371 0.0252 0.0366 0.0291 0.0192 0.0325 0.0283
% 0.0393 0.0358 0.0316 0.0281 0.0302 0.0466 0.0314 0.0245 0.0269 0.0297
% 0.0347 0.0267 0.0269 0.0233 0.0357 0.0354
%
clear
clc
close all
eta=0.01;
alpha=0.5;
N=200;
un=2*rand(1,N)-1;
pp=zeros(4,N);
y_1=0;
y_2=0;
u_1=0;
u_2=0;
for i=1:N
tt(i)=feval('nonlinearFn1',[y_1;y_2;u_1;u_2]);
pp(:,i)=[tt(i);y_1;un(i);u_1];
u_2=u_1;
u_1=un(i);
y_2=y_1;
y_1=tt(i);
end
maxt=max(tt);
mint=min(tt);
for i=1:4
PHI(i,:)=2*(pp(i,:)-min(pp(i,:)))/(max(pp(i,:))-min(pp(i,:)))-1;
end
Y=2*(tt-mint)/(maxt-mint)-1;
[inputs,N]=size(PHI);
[outputs,N]=size(Y);
hidden=5;
W1=rand(hidden,inputs)-0.5;
W2=rand(outputs,hidden)-0.5;
maxIter=4000;
PI_vector=zeros(maxIter,1);
outHidden=zeros(hidden,N);
delta1=outHidden;
outNN=zeros(outputs,N);
delta2=outNN;
%终止条件
critmin=0;
gradterm=1e-4;
paramterm=1e-3;
critterm=1e-7;
critdif=critterm+1;
%
dw1_old=0*W1;
dw2_old=0*W2;
tic
%开始训练
for iter=1:maxIter
%hidden-layer output
outHidden=2./(1+exp(-2*W1*PHI))-1;
%output-layer output
outNN=W2*outHidden;
E=Y-outNN;
SSE=sum(sum(E.*E));
%backpropagation error
delta2=E;
E1=W2'*delta2;
delta1=(1-outHidden.*outHidden).*E1;
G2=delta2*outHidden';
G1=delta1*PHI';
%update weights
dw2=alpha*dw2_old+(1-alpha)*eta*G2;
dw1=alpha*dw1_old+(1-alpha)*eta*G1;
W2=W2+dw2;
W1=W1+dw1;
%更新数据
dw2_old=dw2;
dw1_old=dw1;
%******** updates for next iteration********
PI=SSE/(2*N);
PI_vector(iter)=PI;
if iter>1
critdif=abs(PI_vector(iter-1)-PI);
if PI_vector(iter)<PI_vector(iter-1)
eta=1.05*eta;
elseif PI_vector(iter)>1.04*PI_vector(iter-1)
eta=0.7*eta;
else
eta=eta;
end
end
paramdif=eta*max(max(max(abs(G1))),max(max(abs(G2))));
gradmax=paramdif/eta/N;
if (PI<critmin|(critdif<critterm & gradmax<gradterm & paramdif<paramterm))
break;
end
end
% *********end of network training
toc
PI_vector=PI_vector(1:iter);
normY2=(outNN+1)*(maxt-mint)*0.5+mint;
normE=tt-normY2;
t=1:N;
subplot 211
plot(t,Y,'b',t,outNN,'r');
title('归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,E)
title('归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
%
figure
subplot 211
plot(t,tt,'b',t,normY2,'r');
title('未归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,normE)
title('未归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
figure
semilogy(PI_vector); % y axis is logarithmic (base 10)
title('Criterion evaluated after each iteration');
xlabel('Iteration (epoch)');
ylabel('Criterion');
grid;
%test nn
un=2*rand(1,N)-1; %phi样本输入数据,如果仅用rand(4,N),效果不如rand(4,N)-0.5好
pp=zeros(4,N);
y_2=0;
y_1=0;
u_1=0;
u_2=0;
for i=1:N
tt(i)=feval('nonlinearFn1',[y_1;y_2;u_1;u_2]);
pp(:,i)=[tt(i);y_1;un(i);u_1];
u_2=u_1;
u_1=un(i);
y_2=y_1;
y_1=tt(i);
end
maxt=max(tt);
mint=min(tt);
for i=1:4
PHI2(i,:)=2*(pp(i,:)-min(pp(i,:)))/(max(pp(i,:))-min(pp(i,:)))-1;
end
Y2=2*(tt-mint)/(maxt-mint)-1;
yn=W2*(1-2./(1+exp(2*W1*PHI2)));
normYn=(yn+1)*(maxt-mint)*0.5+mint;
En=Y2-yn;
normEn=tt-normYn;
%
figure
subplot 211
plot(t,Y2,'b',t,yn,'r');
title('归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,En)
title('归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
%
figure
subplot 211
plot(t,tt,'b',t,normYn,'r');
title('未归一化的实际输出与网络输出');
xlabel('样本数');ylabel('输出');
legend('y','yn');
subplot 212
plot(t,normEn)
title('未归一化的网络训练误差');
xlabel('样本数');ylabel('误差');
eta
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -