个人理解

BP神经网络属于人工智能范畴,在我看来它更多的是一个用于预测的工具,尽管它的用处还不仅于此。在数学建模上,很多时候,题目提供了很多历史数据,我经常用这些历史数据,用BP神经网络训练它,利用训练好的BP神经网络,来预测接下来的未知的值。

BP神经网络

关于该神经网络的繁多的理论这里就不去深究了,百度一查一大把,一堆的理论反正我是看不下去的,所以这里只是讲如何把BP神经网络当成一个工具来用,当然一些必要的知识这里也会大致讲一下。

  1. BP网络结构
    主要3部分组成:输入层、隐层、输出层。
    例子来说明:假设题目提供了很多过去的每一天的天气信息,空气湿度、室外温度、天气状况。天气状况主要是小雨,大雨、晴天等信息。现在要求你预测未来某一天是否下雨。

    那么过去每一天的空气湿度、室外温度即为输入层的输入,天气状况为输出层的输出,隐层主要为这两者的对应关系(这个关系不用太关心),在通过BP神经网络训练后,输入未来某一天的空气湿度、室外温度,之后该网络就会根据历史数据,给出一个天气状况的预测值,这就是BP神经网络的经常用法。

输入层、隐层、输出层的参数设置

关于这些参数的设置主要是激励函数的选取,这里用matlab工具箱来说明:
此次预测选用MATLAB中的神经网络工具箱进行网络的训练,预测模型的具体实现步骤如下:
将训练样本数据归一化后输入网络,设定参数:

  1. 网络隐层激励函数为tansig函数
  2. 输出层激励函数为logsig函数
  3. 网络训练函数为traingdx
  4. 网络性能函数为mse
  5. 隐层神经元数量初设为6
  6. 网络参数。网络迭代次数epochs为5000次
  7. 期望误差goal为0.00000001
  8. 学习速率lr为0.01
    设定完参数后,开始训练网络

以上参数说明不懂?没关系,为了简单化,这些不用去深究,matlab已经帮你设置好了,只要了解一下即可。

还有一个隐层中神经元数目的确定,这个可以知道一下,也不难,对于隐层中神经元数目的确定并没有明确的公式, 只有一些经验公式, 神经元个数的最终确定还是需要根据经验和多次实验来确定。本文在选取隐层神经元个数的问题上参照了以下的经验公式:

其中,n为输入层神经元个数,m为输出层神经元个数,a为[1,10]之间的常数,a可取1-10中的任意数值。

到这里为止对BP神经网络了解得差不多了,可能激励函数那里看不懂,不过也没关系,不懂激励函数,后面matlab代码直接设置好了,不妨碍对BP神经网络得使用。

matlab求解案例(来自“MATLAB在数学建模中的应用(第2版)134页”)

题目:

题目提供的历史数据:

说明:利用年份、人数、机动车数量、公路面积预测公路客运量和公路货运量

代码说明:代码量其实不多,主要是对代码的分析多,就在代码开头,很重要,一定要看。
很多时候遇到类似的预测方面的题目,可以直接修改输入层和输出层的数据,试着将它看成一个工具就行了

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% matlab有关BP网络的模块:
% 1.   mapminmax函数:用于归一化或反归一化数据
%     (1) [Y,PS] = mapminmax(X)
%         X:原矩阵
%         Y:对矩阵X进行规范化得到的矩阵
%         PS:存放关于原矩阵规范化过程中的相关映射数据的结构体
%     (2) [Y,PS] = mapminmax(X,FP)
%         X:原矩阵
%         FP:含有字段FP.ymin和FP.ymax的结构体
%         Y:对矩阵X进行规范化得到的矩阵(使用在FP的ymin和ymax规定下的算法)
%         PS:存放关于原矩阵规范化过程中的相关映射数据的结构体
%     (3) Y = mapminmax(‘apply’,X,PS)
%         ’apply’:必写
%         X:原矩阵
%         PS:存放关于某个矩阵规范化过程中的相关映射数据的结构体
%         Y:对矩阵X进行规范化得到的矩阵(使用PS中的规范化方式)
%     (4) X = mapminmax(‘reverse’,Y,PS)
%         ’reverse’:必写
%         Y:某个矩阵
%         PS:存放关于某个矩阵规范化过程中的相关映射数据的结构体
%         X:将矩阵Y反规范化得到的矩阵(使用PS中的规范化方式,这里指将矩阵X转换为矩阵Y的规范化方式)
% 2.   newff函数(新版本):建立一个前馈反向传播(BP)网络
%     (1) net=newff(P,T,S)
%         P: 输入数据矩阵。(RxQ1),其中Q1代表R元的输入向量。其数据意义是矩阵P有Q1列,每一列都是一个样本,而每个样本有R个属性(特征)。一般矩阵P需要事先归一化好,即P的每一行都归一化到[0 1]或者[-1 1]。
%         T:目标数据矩阵。(SNxQ2),其中Q2代表SN元的目标向量。数据意义参考上面,矩阵T也是事先归一化好的。
%         S:第i层的神经元个数。(新版本中可以省略输出层的神经元个数不写,因为输出层的神经元个数已经取决于T)
%     (2) net = newff(P,T,S,TF,BTF,BLF,PF,IPF,OPF,DDF)(提供了可选择的参数)
%         TF:相关层的传递函数,默认隐含层使用tansig函数,输出层使用purelin函数。
%         BTF:BP神经网络学习训练函数,默认值为trainlm函数。
%         BLF:权重学习函数,默认值为learngdm。
%         PF:性能函数,默认值为mse。
%         PF,OPF,DDF均为默认值即可。
%     (3) 常用的传递函数:
%         purelin:线性传递函数
%         tansig:正切 S 型传递函数
%         logsig: 对数 S 型传递函数
%         (注意:隐含层和输出层函数的选择对BP神经网络预测精度有较大影响,一般隐含层节点传递函数选用tansig函数或logsig函数,输出层节点转移函数选用tansig函数或purelin函数。)
% 3.   train函数:训练一个神经网络
%     (1) [NET2,TR] = train(NET1,X,T)(也可[NET2] = train(NET1,X,T) )
%         NET1:待训练的网络
%         X: 输入数据矩阵(已归一化)
%         T:目标数据矩阵(已归一化)
%         NET2:训练得到的网络TR:存放有关训练过程的数据的结构体
% 4.   sim函数:模拟Simulink模型,进行数据仿真
%     (1) SimOut = sim(‘MODEL’, PARAMETERS)
%         (见名知意,不必再解释)
% 5.   关于net.trainParam的常用属性:(假定已经定义了一个BP网络net)
%     (1)* net.trainParam.show: 两次显示之间的训练次数
%     (2)* net.trainParam.epochs: 最大训练次数
%     (3)* net.trainParam.lr: 网络的学习速率
%     (4)* net.trainParam.goal: 训练网络所要达到的目标误差
%     (5)* net.trainParam.time: 最长训练时间(秒)
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% matlab实现BP网络步骤(以"BP神经网络.docx"里的公路运输为例):
% BP网络创建:
% 1.准备好训练集(以矩阵的方式存储)
%   输入层数据:p = [numberOfPeople; numberOfAutomobile; roadArea];
%   输出数据:t = [passengerVolume; freightVolume];
% 2.对训练集中的输入数据矩阵和目标数据矩阵进行归一化处理
%   [pn, inputStr] = mapminmax(p);
%   [tn, outputStr] = mapminmax(t);
% 3.建立BP神经网络
%   net = newff(pn, tn, [3 7 2], {'purelin', 'logsig', 'purelin'});
%   [3 7 2]:3为输入层的节点个数,7为隐含层的“神经元”节点个数(可由l =
%   sqrt(n+m)+a得出,具体可看“BP神经网络.docx”),2为输出层的节点个数
% 4.神经网络参数设置
%   net.trainParam.show = 10;%每10轮回显示一次结果
%   net.trainParam.epochs = 5000;%最大训练次数
%   net.trainParam.lr = 0.05;%网络的学习速率
%   net.trainParam.goal = 0.65 * 10^(-3);%训练网络所要达到的目标误差
%   net.divideFcn = '';%网络误差如果连续6次迭代都没变化,则matlab会默认终止训练。为了让程序继续运行,用以下命令取消这条设置
% 5.开始训练网络
%   net = train(net, pn, tn);
% 到此BP网络训练完成!!!!!
%
%
% 使用BP网络进行预测:
% 1.新输入要用于预测的数据
%   newInput = [73.39 75.55; 3.9635 4.0975; 0.9880 1.0268];
%2.利用原始输入数据(训练集的输入数据)的归一化参数对新输入数据进行归一化
%  newInput = mapminmax('apply', newInput, inputStr);
%3.进行仿真
%  newOutput = sim(net, newInput);
%4.反归一化得到结果
%  newOutput = mapminmax('reverse',newOutput, outputStr);
% newOutput为预测的结果,以矩阵的方式存储
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %clc
clear
%准备好训练集
%人数(单位:万人)
numberOfPeople=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
%机动车数(单位:万辆)
numberOfAutomobile=[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6 2.7 2.85 2.95 3.1];
%公路面积(单位:万平方公里)
roadArea=[0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36 0.36 0.38 0.49 0.56 0.59 0.59 0.67 0.69 0.79];
%公路客运量(单位:万人)
passengerVolume = [5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 22598 25107 33442 36836 40548 42927 43462];
%公路货运量(单位:万吨)
freightVolume = [1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 13320 16762 18673 20724 20803 21804];%输入数据矩阵
p = [numberOfPeople; numberOfAutomobile; roadArea];
%目标(输出)数据矩阵
t = [passengerVolume; freightVolume];%对训练集中的输入数据矩阵和目标数据矩阵进行归一化处理
[pn, inputStr] = mapminmax(p);
[tn, outputStr] = mapminmax(t);%建立BP神经网络
net = newff(pn, tn, [3 7 1], {'purelin', 'logsig', 'purelin'});%每10轮回显示一次结果
net.trainParam.show = 10;%最大训练次数
net.trainParam.epochs = 5000;%网络的学习速率
net.trainParam.lr = 0.05;%训练网络所要达到的目标误差
net.trainParam.goal = 0.65 * 10^(-3);%网络误差如果连续6次迭代都没变化,则matlab会默认终止训练。为了让程序继续运行,用以下命令取消这条设置
net.divideFcn = '';%开始训练网络
net = train(net, pn, tn);%使用训练好的网络,基于训练集的数据对BP网络进行仿真得到网络输出结果
%(因为输入样本(训练集)容量较少,否则一般必须用新鲜数据进行仿真测试)
answer = sim(net, pn);
%
% %反归一化
answer1 = mapminmax('reverse', answer, outputStr);%-----------------绘制测试样本神经网络输出和实际样本输出的对比图(figure(1))--------------------
t = 1990:2009;%测试样本网络输出客运量
a1 = answer1(1,:);
%测试样本网络输出货运量
a2 = answer1(2,:);figure(1);
subplot(2, 1, 1);
plot(t, a1, 'ro', t, passengerVolume, 'b+');
legend('网络输出客运量', '实际客运量');
xlabel('年份'); ylabel('客运量/万人');
title('神经网络客运量学习与测试对比图');
grid on;subplot(2, 1, 2); plot(t, a2, 'ro', t, freightVolume, 'b+');
legend('网络输出货运量', '实际货运量');
xlabel('年份'); ylabel('货运量/万吨');
title('神经网络货运量学习与测试对比图');
grid on;
%-----------------绘制测试样本神经网络输出和实际样本输出测试结束--------------------%-----------------开始新输入数据进行预测的对比图(figure(2))--------------------
%使用训练好的神经网络对新输入数据进行预测
%新输入数据(2010年和2011年的相关数据)
newInput = [73.39 75.55; 3.9635 4.0975; 0.9880 1.0268]; %利用原始输入数据(训练集的输入数据)的归一化参数对新输入数据进行归一化
newInput = mapminmax('apply', newInput, inputStr);%进行仿真
newOutput = sim(net, newInput);%反归一化
newOutput = mapminmax('reverse',newOutput, outputStr);disp('预测2010和2011年的公路客运量分别为(单位:万人):');
newOutput(1,:)
disp('预测2010和2011年的公路货运量分别为(单位:万吨):');
newOutput(2,:)%在figure(1)的基础上绘制2010和2011年的预测情况-------------------------------------------------------
figure(2);
t1 = 1990:2011;subplot(2, 1, 1);
plot(t1, [a1 newOutput(1,:)], 'ro', t, passengerVolume, 'b+');
legend('网络输出客运量', '实际客运量');
xlabel('年份'); ylabel('客运量/万人');
title('神经网络客运量学习与测试对比图(添加了预测数据)');
grid on;subplot(2, 1, 2); plot(t1, [a2 newOutput(2,:)], 'ro', t, freightVolume, 'b+');
legend('网络输出货运量', '实际货运量');
xlabel('年份'); ylabel('货运量/万吨');
title('神经网络货运量学习与测试对比图(添加了预测数据)');
grid on;

运行结果:




结果说明:“+”为实际的数据,圆圈为该网络的预测值。

以上就是个人对BP神经网络的学习理解,有错误的地方望指出。

菜鸟的数学建模之路(四):BP神经网络相关推荐

  1. 菜鸟的数学建模之路(二):线性与非线性回归

    回归分析 根据回归方法中因变量的个数和回归函数的类型(线性或非线性),可将回归方法分为一元线性回归.一元非线性回归和多元回归. 简单粗暴理解:可以理解为找到一个从特征空间X到输出空间Y的最优的线性映射 ...

  2. 菜鸟的数学建模之路(零):我的数学建模之路

    更新说明 更新时间:2019/9/8 最近有人问我要数学数学建模资源,由于之前我还没有整理好就没上传,现在已经上传在我的个人主页"已上传资源"那里. 声明:里面的资源整理来自网络和 ...

  3. 菜鸟的数学建模之路(六):层次分析法

    层次分析法(AHP):一种层次权重决策分析方法,日常生活中比如:冰箱品牌的选购(考虑到价格,性能,售后等因素):旅游景点的选择(交通,居住环境,饮食等). 解题步骤: (1).建立层次结构模型 (2) ...

  4. 菜鸟的数学建模之路(一):最短路径算法

    最短路径算法主要有两种,Dijkstra算法和floyd算法,当时在学习这两种算法时经常弄混了,关于这两种算法,记得当时是在交警平台设置的那一道题目上了解到的,就去查很多资料,花了不少时间才基本了解了 ...

  5. 菜鸟的数学建模之路(七):灰色预测方法

    灰色预测的概念 灰色系统.白色系统和黑色系统 (1)白色系统是指一个系统的内部特征是完全已知的,既系统信息是完全充分的. (2)黑色系统是一个系统的内部信息对外界来说是一无所知的,只能通过它与外界的联 ...

  6. 数学建模经验谈(四)-参加国赛的几点建议

    第一部分,比赛须知类(这决定你是否应该报名): 1.想学习建模,却苦于没有各种资料的,可以常登陆www.madio.net,搜索你想要的各种资源. 2.为了国赛备战几个月的童靴们,可以在http:// ...

  7. python画函数求交点_python3数学建模基础(四)多个函数图像求交点

    python3数学建模基础(四)多个函数图像求交点,多个,交点,生姜,建模,函数 python3数学建模基础(四)多个函数图像求交点 python3数学建模基础(四)多个函数图像求交点 本文以sin( ...

  8. Python数学建模系列(四):数值逼近

    文章目录 前言 往期文章 1. 一维插值 ​1.1 线性插值与样条插值(B-spline) 1.2 高阶样条插值 2. 二维插值 2.1 图像模糊处理--样条插值 2.2 二维插值的三维图 3. 最小 ...

  9. 【数学建模】“华为杯”高级神经网络Keras(Python代码实现)

    目录 1 Keras概述 1.1 简介 1.2 设计原则 2 Keras的模块结构 2.1 底层库Theano或TensorFlow 2.2 两类模型:序贯模型(Sequential)和函数式模型(M ...

最新文章

  1. matlab检测图片马赛克,python 检测图片是否有马赛克
  2. 【数据挖掘笔记三】数据预处理
  3. java web: Servlet JSP MVC
  4. Oracle收购Sun
  5. 联想即将推出预装 Fedora 的 ThinkPad 笔记本电脑
  6. 怎么在线直接将多张CAD图纸转换成高质量黑白PNG格式?
  7. ASP.NET MVC Model验证
  8. Redis主从配置,哨兵,集群的设计原理
  9. 格兰杰检验的基本步骤_Toda-Yamamoto 格兰杰因果检验 TY-Granger方法
  10. mysql outer apply_使用 CROSS APPLY 与 OUTER APPLY 连接查询
  11. 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?...
  12. 空气质量天气质量数据来源整理
  13. windows下rainbond 安装unable to find image locally docker errot response from daemon
  14. ISO/IEC 14443、射频、PICC
  15. [Usaco2009 Nov]lights
  16. python爬取微信制作照片墙
  17. leetcode java 大厂基础面试题附答案(二)
  18. 负载均衡技术原理浅析
  19. 【投资心经】一位资深操盘手的吐血总结
  20. 施密特正交方法例题(用于学习)

热门文章

  1. 服务器系统电源管理,企业IT节能 巧用Windows系统电源管理
  2. React 原理揭秘总结
  3. uniapp手动实现国际化【中英文】
  4. 怎样做研究(四) 刘挺
  5. 详细讲解C语言经典例题:有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子, 问最后留下的是原来第几号的那位
  6. NBU网络备份大全之oracle系统热备份
  7. ExcelKit导出
  8. Latex学习笔记(六)——自定义Latex模板
  9. Kaggle(L3) - Stochastic Gradient Descent Notebook
  10. 把马赛克变成逼真大片,英伟达又出黑科技