赞
踩
文章内容部分参考自:数学建模--BP神经网络算法及Matlab实现 - 知乎 (zhihu.com)
(9条消息) 数学建模——人口预测模型公有木兮木恋白的博客-CSDN博客数学建模人口预测模型
这个算法功能很强大用起来却又很冒险。它模拟的是人脑的神经元突触,以达到信息并行处理、自学习、推理能力(模拟人脑的反射运动)。神经网络是深度学习中的非常重要的算法,现在有非常多的种类(如前向反馈网络BP、径向基网络RBF等等),这里总结对ANN的一些理解。
以BP网络为例,该网络按数据传递的路线分有输入层、隐含层、输出层(隐含层可能不只有一层,也可以有很多层),其建模流程大致为:输入数据-确定网络规模、规定激励函数(三种形态:阀值型、线性型、S型)-确定调整权值的方式(BP网络的核心是梯度下降法)-训练网络。
ANN是一种拟合,这种拟合源于数学却又不限于数学,源于数学是因为它有背后的数学逻辑,如和多项式拟合一样,拟合的结果是否符合实际受到所用数据的真实性与数据量的影响,而且影响程度很大(数据越多,拟合效果越好,类比一些深度学习的例子),说它不限于数学是因为数学的拟合是严谨的、符合数据规律与数学规则的(简单的理解是拟合时的“多对一”,即拟合时多种数据输入、一种数据输出,最终求出的结果也是单一数据)而神经网络的拟合是可以做到“多对少”(输出可以不是一种数据)
BP网络(Back-Propagation Network)是1986年被提出的,是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一,用于函数逼近、模型识别分类、数据压缩和时间序列预测等。
输入信号从输入层经过各个隐含层向输出层传播,在输出层得到实际的响应值,若实际值与期望值误差较大,就会转入误差反向传播阶段。
按照梯度下降的方法从输出层经过各个隐含层并逐层不断地调整各神经元的连接权值和阈值,反复迭代,直到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数。
BP神经网络通过有指导的学习方式进行训练和学习。标准的BP算法采用误差函数按梯度下降的方法学习,使网络的设计输出值和期望输出值之间的均方误差最小。BP神经网络的传输函数通常采用sigmoid函数,而输出层则采用线性传输函数。
题目:创建BP神经网络
散点图如下:
代码:
- P = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
- T = [0, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4];
- %由于feedforwardnet函数自动对样本进行归一化和划分训练、验证、测试集,
- %所以就不用手动将数据进行归一化处理,但不知道有没有打乱顺序
- % n=size(P,2); temp=randperm(n); P_train=P(temp(1:8));
- % T_train=T(temp(1:8)); P_test=P(temp(9:end)); T_test=T(temp(9:end));
- %
- % [p_train,p_input]=mapminmax(P_train,0,1);
- % [t_train,t_output]=mapminmax(T_train,0,1);
- % p_test=mapminmax(P_test,p_input);
- net = feedforwardnet(5, 'traingd');
- %是'5'是指隐含层有5个神经元,这里只有一个隐含层,多个隐含层神经元的个数设置为[5,3,...]
-
- net.trainParam.lr = 0.01; %学习速率
- net.trainParam.epochs = 10000; %最大训练次数
- net.trainParam.goal = 1e-6; %最小误差,达到该精度,停止训练
- net.trainParam.show = 50; %每50次展示训练结果
- net = train(net, P, T); %训练
- Y = net(P); %输出
- perf = perform(net, Y, T);%误差
- plot(P, T, P, Y, 'r-')
由于训练的样本太少,所以结果不是很令人满意。
题目:依据的资料是触角和翅膀的长度,已经测得了9 支Af 和6 支Apf 的数据如下: Af: (1.24,1.72),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70), (1.48,1.82),(1.54,1.82),(1.56,2.08). Apf: (1.14,1.78),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
试对触角和翼长分别为(1.24,1.80),(1.28,1.84)与(1.40,2.04)的3 个标本加以识别。
Matlab代码:
- clearvars; close all; %清空工作环境
- %导入数据,第一列为触角长度,第二列为翅膀长度
- x_1 = [1.24, 1.72; 1.36, 1.74; 1.38, 1.64; 1.38, 1.82;
- 1.38, 1.90; 1.40, 1.70; 1.48, 1.82; 1.54, 1.82; 1.56, 2.08]; %Af蠓虫
- x_2 = [1.14, 1.78; 1.18, 1.96; 1.20, 1.86; 1.26, 2.00; 1.28, 2.00;
- 1.30, 1.96]; %Apf蠓虫
- x = [x_1; x_2]'; %合并转置,因为feedforwardnet函数以一列为单个样本
-
- goal = [ones(1, 9), zeros(1, 6); zeros(1, 9), ones(1, 6)]; %(1,0)表示为
- %Af蠓虫,(0,1)表示Apf蠓虫
- x_recognize = [1.24, 1.80; 1.28, 1.84; 1.40, 2.04]'; %识别的样本
-
- plot(x_1(:, 1), x_1(:, 2), 'ro', 'DisplayName', 'Af'); %绘制Af的散点图
- hold on;
- plot(x_2(:, 1), x_2(:, 2), 'bo', 'DisplayName', 'Apf'); %绘制Apf的散点图
- plot(x_recognize(1, :), x_recognize(2, :), 'yo', 'DisplayName', '识别' ); %绘制识别样本的散点图
- xlabel('触角长度');
- ylabel('翅膀长度');
- legend;
-
- net = feedforwardnet([3, 2], 'trainlm'); %两层隐含层,相应神经元个数分别为3和2,采用L-M优化算法,效果比较好
- net.trainParam.max_fail = 1000;
- net.trainParam.lr = 0.05; %学习速率
- net.trainParam.epochs = 10000; %最大训练次数
- net.trainParam.goal = 1e-15; %最小误差,达到该精度,停止训练
- net.trainParam.show = 50; %每50次展示训练结果
- net = train(net, x, goal); %训练
- y0 = sim(net, x) %输出
- perf = perform(net, goal, y0)%误差
- ym = sim(net, x_recognize) %识别
BP神经网络预测人口模型不需要任何假设
BP神经网络根据已有的数据推算数据内部之间的关系
BP神经网络是非线性的方法
实现思路
采用三层BP神经网络,利用已有数据推算出关系式,然后推算出下一年的人口,然后以下一年的人口为基础继续推算下下一年的人口
代码
- clearall
-
- close
-
- clc
-
- %原始数据
-
- P=[97.42102.36105.78 111.16 116.04 121.71 126.26 134.93 137;
-
- 102.36105.78 111.16 116.04 121.71126.26134.93137139;
-
- 105.78111.16 116.04 121.71 126.26134.93137139141.89];
-
- T=[111.16 116.04 121.71 126.26 134.93137139141.89146];
-
- %归一化处理
-
- [P,Pmin,Pmax,T,Tmin,Tmax]=premnmx(P,T);
-
- %神经网络
-
- net=newff(minmax(P),[5,1],{'tansig','purelin'});
-
- net.trainFcn='trainbr';
-
- %设置训练参数
-
- net.trainParam.show=50;
-
- net.trainParam.lr=0.05;
-
- net.trainParam.epochs=500;
-
- net.trainParam.goal=1e-5;
-
- %训练
-
- [net,tr]=train(net,P,T);
-
- %仿真
-
- A=sim(net,P);
-
- a=postmnmx(A,Tmin,Tmax);
-
- T=postmnmx(T,Tmin,Tmax);
-
- %优化后输入层权值和阙值
-
- inputWeights=net.IW{1,1};
-
- inputbias=net.b{1};
-
- %优化后网络层权值和阙值
-
- layerWeights=net.LW{2,1};
-
- layerbias=net.b{2};
-
- %画图输出
-
- x=2011:2019;
-
- newk=a(1,:);
-
- figure(1)
-
- plot(x,newk,'r-o',x,T,'b--*')
-
- xlabel('年份')
-
- ylabel('人口数量/万人')
-
- legend('预测人口数量','实际人口数量')
预测未来几年的人口数量
- Pnew=[139;141.89;146];
-
- OldNum=zeros(15,1);
-
- fori=1:15
-
- SamNum=size(Pnew,2);
-
- Pnewn=tramnmx(Pnew,Pmin,Pmax);
-
- HiddenOut=tansig(inputWeights*Pnewn+repmat(inputbias,1,SamNum));
-
- anewn=purelin(layerWeights*HiddenOut+repmat(layerbias,1,SamNum));
-
- anewn=postmnmx(anewn,Tmin,Tmax);
-
- Pnew(1:3,:)=[Pnew(2:3,:);anewn];
-
- OldNum(i)=anewn;
-
- end
-
- %画图输出
-
- x1=2011:2034;
-
- figure(2)
-
- NUM=[newk,OldNum'];
-
- plot(x1,NUM,'r--o')
-
- xlabel('年份')
-
- ylabel('人口数量/万人')
-
- legend('预测人口数量')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。