||
之前写了一段1-6-1单点学习网络,但该网络只有学习能力没有预测能力,这3天把神经网络原理重新吃透,自己编写了多点学习预测网络代码,其实大同小异,只不过把目标函数从单点误差改成多点误差,其余的阈值、权值梯度全部和单点学习程序一样的,现将两个程序附上,以供大家对比研究,值得提的是,两个程序的输入是大有不同的,第一个输入是要拟合的函数真实的输入,而第二个程序的输入则是随机值,一旦选定,程序运行中则不发生变化,所以第二个程序没有预测功能的,只能学习。
%第一个程序:多点学习拟合预测网络
%第二个程序:单点学习逼近网络
%功能:1-6-1网络逼近正弦曲线,采取单点逼近法
%版本号:v1.3
%作者:陈颖频
%版权:闽南师范大学
%时间:2015.6.27
clear all;
clc;
w_ij=[.011; -.019; -.016;.017; .021; .013]; %输入层到隐层权值
w_jk=[.018;.09;.09;.07;.08;.09] ; %隐层到输出层权值
h_theta=[-0.1 ;0.02; 0.012; 0.014 ;-0.02 ;0.02]; %隐层阈值
out_theta=.2; %输出层阈值
e2=0;
a1=0.02;a2=0.02;M=60;
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for m=1:M
yp=sin(pi*0.04*m);
p=0.3; %这个输入可以是0到1的随机值,和上面的预测拟合网络大有不同
for k=1:4000 %训练次数
h=tanh(w_ij*p+h_theta).'; %隐层输出
y=tanh(h*w_jk+out_theta); %输出层输出
e2=[(yp-y)^2]/2; %当次训练误差
if e2<0.00005, a1=0;a2=0; else, a1=0.02;a2=0.02; end;
deta_k=(1+y)*(1-y)*(yp-y);%计算输出层误差反传信号
out_theta=out_theta+a2*deta_k;
w_ij=w_ij+a1*deta_k*p;
for i=1:6
w_jk(i)=w_jk(i)+a2*deta_k*h(i);
end
for i=1:6
deta_j=(1+h(i))*[1-h(i)]*deta_k*w_jk(i);
h_theta(i)=h_theta(i)+a1*deta_j;
end
if e2<=.00005 break;end
end
ypp(m)=yp;
yom(m)=y;
e3(m)=e2;
end
%grapher
m=1:M;subplot(4,1,1);plot(ypp);ylabel('ypp'),
subplot(4,1,2);plot(m,yom,m,yom,'rx');ylabel('yom'),
subplot(4,1,3);plot(e3);ylabel('e3');
subplot(4,1,4);plot(m,ypp,m,yom,'gx');xlabel('m'),ylabel('ypp&yom'),
legend('ypp=sin(2*pi*m/50)','yom=output of NN');
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-4-24 08:21
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社