陈颖频的科学网博客分享 http://blog.sciencenet.cn/u/s110500617

博文

1-6-1 神经网络多点学习预测网络 vs 1-6-1单点学习网络

已有 3558 次阅读 2015-6-29 09:38 |系统分类:教学心得|关键词:学者

之前写了一段1-6-1单点学习网络,但该网络只有学习能力没有预测能力,这3天把神经网络原理重新吃透,自己编写了多点学习预测网络代码,其实大同小异,只不过把目标函数从单点误差改成多点误差,其余的阈值、权值梯度全部和单点学习程序一样的,现将两个程序附上,以供大家对比研究,值得提的是,两个程序的输入是大有不同的,第一个输入是要拟合的函数真实的输入,而第二个程序的输入则是随机值,一旦选定,程序运行中则不发生变化,所以第二个程序没有预测功能的,只能学习。

%第一个程序:多点学习拟合预测网络

%功能:1-6-1网络逼近正弦曲线,采取多点逼近学习
%版本号:v2.1
%作者:陈颖频
%版权:闽南师范大学
%时间:2015.10.9
clear all;
clc;
K=5;
w_ij=ones(K,1);w_jk=ones(K,1);h_theta=ones(K,1);
for i=1:K
   w_ij(i)=w_ij(i)*rand(1,1);
   w_jk(i)=w_jk(i)*rand(1,1);
   h_theta(i)=h_theta(i)*rand(1,1);
end
out_theta=.2;    %输出层阈值                            
e2=0;
a1=0.1;a2=0.1;M=40;
%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
o=0;
for  k=1:60000                      %训练次数
 
for m=1:M        
p(m)=2*pi*m/M;  yp(m)=sin(p(m));  
h=tanh(w_ij*p(m)+h_theta).';   %隐层输出
y(m)=tanh(h*w_jk+out_theta);      %输出层输出
o=o+[(yp(m)-y(m))^2]/(2*M);       %当次训练总样本误差
 
deta_k=0.5*(1-y(m)^2)*(yp(m)-y(m));%计算输出层误差反传信号
out_theta=out_theta+a2*deta_k;
 for  i=1:K
     w_jk(i)=w_jk(i)+a2*deta_k*h(i);
 end
 
 for   i=1:K    
     deta_j=(deta_k)*0.5*[1-h(i)^2];
     w_ij(i)=w_ij(i)+a2*deta_j*p(m);
     h_theta(i)=h_theta(i)+a1*deta_j;    
 end  
end
o
if o<0.02, a1=0.006;a2=0.006; end;  
o=0;
end
%测试样本序列
for m=1:M        
p(m)=2*pi*m/M;    
h=tanh(w_ij*p(m)+h_theta).';   %隐层输出
out(m)=tanh(h*w_jk+out_theta);      %输出层输出
end



%第二个程序:单点学习逼近网络

%功能: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');





https://m.sciencenet.cn/blog-684084-901292.html

上一篇:1-6-1学习神经网络编程
下一篇:DIY简易版SVM分类器matlab代码

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 08:21

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部