老饼讲解-神经网络 机器学习 神经网络 深度学习
BP神经网络入门
1.初识BP神经网络
2.BP基本原理与建模
3.进阶-自实现一个BP神经网络

【讲解】matlab实现BP神经网络的例子讲解

作者 : 老饼 发表日期 : 2022-10-30 06:41:06 更新日期 : 2024-01-19 16:32:42
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com




本文讲解使用matlab神经网络工具箱进行BP神经网络建模流程与具体步骤




  01. matlab的BP神经网络建模步骤  



下面讲述利用matlab神经网络工具箱进行BP神经网络建模的步骤



    matlab工具箱-BP神经网络建模步骤    


BP神经网络建模过程是繁琐的,但matlab神经网络工具箱对BP做了高度封装,   
因此,我们实际使用matlab神经网络工具箱进行建模却是简单的,
一般只需要如下三个操作步骤:

  ● 设置网络        ● 训练网络      ● 查看结果  
matlab-BP神经网络建模流程步骤
可以看到,使用matlab神经网络工具箱训练一个BP网络非常简单,
因为它已经帮我们把归一化、数据分割、训练这些工作都做了
我们只需要直接调用matlab神经网络工具箱的方法就可以






   02. matlab-BP神经网络实例代码   



本节先展示一个matlab神经网络工具箱实现BP神经网络的代码,

下节再讲解每一行代码的具体意义



    matlab-BP神经网络-实例代码    


我们先看一个matlab神经网络工具箱训练BP神经网络的简单例子(matlab2018a)
通过下面的代码,就可以训练一个BP神经网络
最后,通过sim函数,就可以使用训练好的模型进行预测
X = [1,2,3,5,8];                                           % 输入数据X
y= [4,10,20,52,130];                                       % 输出数据y 
net = newff(X,y,3,{'tansig','purelin'},'trainlm') ;        % 构建一个BP神经网络
net.trainparam.goal = 0.00001;                             % 训练目标:均方误差低于0.00001
[net,tr,net_y] = train(net,X,y);                           % 训练网络
train_err = mean(abs(net_y(tr.trainInd)-y(tr.trainInd)));  % 训练数据的误差
test_err  = mean(abs(net_y(tr.testInd)-y(tr.testInd)));    % 测试数据的误差
sim_y = sim(net,X);                                        % 使用训练好的网络对X进行预测
     ✍️ 关于一些matlab老代码的说明    
 一些读者在网上或书上借鉴的matlab实现BP神经网络的代码,
往往这些代码非常长,主要是因为其中包括了归一化等相关处理
事实上,自matlab2012b之后,matlab神经网络工具箱已经作了高度封装,
因此现在使用matlab构建BP神经网络已经节省了非常多的代码,建议初学者先按本文的代码进行学习和理解





    03. matlab-BP神经网络-代码讲解   



本节讲解上述BP神经网络建模matlab代码关键部分的含义



    第1、2行代码解读:数据的输入输出   


第一第二行的matlab代码是训练数据的输入和输出
BP神经网络代码讲解-片段1
 
 BP神经网络工具箱的输入和输出都是矩阵,
matlab-BP神经网络的输入输出
✍️PASS:每一列代表一个样本,每行代表一个变量, 切记


  
 


    第3-5行代码解读:设置与训练   


代码的第3、4、5是BP神经网络的设置与训练
BP神经网络代码讲解-片段2 
 
各行的具体含义如下
  👉 
第三行用于构建一个BP神经网络           
 👉 第四行用于设置训练的参数(可不设置) 
 👉 第五行用于训练网络                           

newff-初始化BP神经网络

 
newff是matlab用于初始化一个BP神经网络的函数,它的参数意义如下:
● 3代表只有一个节点数为3的隐层                                                                                        
 如果换成[4,5]则代表有两个隐层,第一个隐层有4个节点,第二个隐层有5个节点         
● {'tansig','purelin'}则代表隐层、输出层的激活函数分别为tansig和purelin,                          
 如果有两个隐层,就需要给两个隐层设置激活函数,例如{'tansig','tansig','purelin'} 
● trainlm则是我们的训练函数,代表用lm算法训练网络                                                        
 也可设为'traingd',代表用梯度下降算法训练网络,但强烈建议用默认的trainlm       
 
 
关于训练参数的设置
代码第四行net.trainparam.goal是设置训练目标,网络误差小于该值时停止训练
可以设置的参数很多,具体查看《matlab的BP神经网络使用详解》

 
train-训练网络
train代表训练网络,
● train的工作流程如下:                                                                                                 
 调用train后,train就会把X,y进行归一化,                                     
并分割成训练、检验、测试三份数据                                           
然后用训练数据训练模型,                                                   
用检验数据监督模型使之不要走向过拟合                                       
测试数据不参与任何过程                                                     


● train的输出参数意义如下:                                                                                        
 train输出三个参数,这里我们用net,tr,net_y来接收这三个输出,                
net是训练好的网络,                                                       
tr则存放了一些训练过程的记录,                                            
net_y则是网络对X的预测                                                    

● 如何获取三份数据的索引                                                                                           
 怎么知道train把哪些数据划为训练,哪些划为测试?                            
它记录在tr中                                                               
tr.trainInd是训练数据的索引                                               
tr.testInd则是测试数据的索引                                              
用X(:,tr.trainInd)就能获取用于训练的X,其它数据获取类似                    




      第6-8行代码解读:BP神经网络的误差与预测      


代码的第6、7行用于查看网络的误差
第8行则是用训练好的BP神经网络进行预测
 BP神经网络代码讲解-片段3
BP神经网络的误差

第5行网络训练时获得的net_y存放了网络的预测值
只需根据tr.trainInd、tr.testInd获取训练数据、测试数据的索引
就可以计算出相应的训练误差和测试误差
  BP神经网络的预测
最后,我们只需要使用sim函数就可以用训练好的网络对新数据进行预测了 
sim_y = sim(net,X)代表用训练好的net对X进行预测,sim_y就是预测结果  





以上就是使用matlab工具箱实现一个BP神经网络建模的例子了~






 End 





联系老饼