神经网络

不问归期 提交于 2020-03-07 19:59:07

一、BP神经网络

BP算法(即反向传播算法)是在有导师指导下,适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。其缺点为收敛速度慢,容易陷入局部最小

BP算法包括信号的前向传播和误差的反向传播两个过程。即计算误差输出时按从输入到输出的方向进行,而调整权值和阈值则从输出到输入的方向进行,使实际输出和期望输出间的误差均方值(即损失函数,损失函数也可用其它方式表示,比如交叉墒)最小。

BP神经网络激活函数一般采用sigmoid。

BP神经网络隐藏层神经元个数由设计者决定,有经验公式K=1+[M*(N+2)]^0.5,MN分别为输入层、输出层节点数目。

实现过程参考:https://blog.csdn.net/zhaomengszu/article/details/77834845

https://blog.csdn.net/weixin_42555080/article/details/94293064

Matlab实现代码举例:

%******************************%
%======原始数据输入========
p=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;...
3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;...
4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;...
2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;...
2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;...
3489 3172 4568;3172 4568 4015;]';  

%===========期望输出=======
t=[4554 2928 3497 2261 6921 1391 3580 4451 2636 3471 3854 3556 2659 ...
4335 2882 4084 1999 2889 2175 2510 3409 3729 3489 3172 4568 4015 ...
3666]; 

ptest=[2845 2833 4488;2833 4488 4554;4488 4554 2928;4554 2928 3497;2928 3497 2261;...
3497 2261 6921;2261 6921 1391;6921 1391 3580;1391 3580 4451;3580 4451 2636;...
4451 2636 3471;2636 3471 3854;3471 3854 3556;3854 3556 2659;3556 2659 4335;...
2659 4335 2882;4335 2882 4084;4335 2882 1999;2882 1999 2889;1999 2889 2175;...
2889 2175 2510;2175 2510 3409;2510 3409 3729;3409 3729 3489;3729 3489 3172;...
3489 3172 4568;3172 4568 4015;4568 4015 3666]'; 
 

[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);  %将数据归一化 

NodeNum1 =20; % 隐层第一层节点数 
NodeNum2=40;   % 隐层第二层节点数 

TypeNum = 1;   % 输出维数  
TF1 = 'tansig';
TF2 = 'tansig'; 
TF3 = 'tansig';
net=newff(minmax(pn),[NodeNum1,NodeNum2,TypeNum],{TF1 TF2 TF3},'traingdx');
%网络创建traingdm 
net.trainParam.show=50; 
net.trainParam.epochs=50000; %训练次数设置 
net.trainParam.goal=1e-5; %训练所要达到的精度
net.trainParam.lr=0.01;   %学习速率      
net=train(net,pn,tn); 

p2n=tramnmx(ptest,minp,maxp);%测试数据的归一化
an=sim(net,p2n);

[a]=postmnmx(an,mint,maxt)   %数据的反归一化 ,即最终想得到的预测结果

V=net.iw{1,1};%输入层权值
theta1=net.b{1}%输入层阈值
W=net.lw{2,1};%输出层权值
theta2=net.b{2};%输出层阈值

plot(1:length(t),t,'o',1:length(t)+1,a,'+'); 
title('o表示预测值--- *表示实际值')
grid on
m=length(a);    %向量a的长度
t1=[t,a(m)];
error=t1-a;     %误差向量
figure
plot(1:length(error),error,'-.') 
title('误差变化图') 
grid on  

结果:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!