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

博文

DIY神经网络Matlab代码

已有 2588 次阅读 2015-10-8 22:49 |系统分类:科研笔记

经过4周的《神经网络》、《计算智能导论》、《数据挖掘与模式识别》三门课的学习,结合前一段时间写的后向传播人工神经网络代码,重新做了修改,总算小有提高,先附图吧,第一幅是要拟合的曲线,第二幅是神经网络学习后的拟合曲线,效果只能说跑出点味道了,但是始终搞不懂为什么教材上总说可以任意精度逼近任意曲线,我反正尽力了,anyway,我希望有一天能真的实现传说中的万能逼近,

                                                          图1 欲拟合曲线

                                      图2 BP网络经过几万次拟合出来的曲线
  貌似两种波形有点像亲娘生的,但又没像教材上说的那么神,不过,让我欣慰的是,随着迭代次数增加,总误差是一直在下降的,还是隐隐约约感觉编程中对某些变量的求导有错。

代码如下:
%功能:1-K-1网络逼近正弦曲线,采取多点逼近学习
%版本号:v2.4
%作者:陈颖频
%版权:闽南师范大学
%时间: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




https://blog.sciencenet.cn/blog-684084-926648.html

上一篇:首位中国籍科技诺奖得主的科研故事
下一篇:关于粒子滤波的几则比喻
收藏 IP: 202.115.10.*| 热度|

0

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

数据加载中...

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

GMT+8, 2022-8-18 22:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部