Press "Enter" to skip to content

数学建模(三):预测

目录

 

2、BP神经网络预测算法

 

:pencil2:2.1 BP神经网络算法基本原理

 

️2.2 基于多指标影响的预测算法

 

️2.3 基于时间序列影响的预测算法

 

三、BP神经网络预测的分析与总结

 

:sparkles:前言

 

在数学建模比赛中,预测也是我们最常见的问题之一,特别是每年的 国赛C题 ,C题不出意外都为统计题。博主在去年的 国赛C题 和今年的 长三角数学建模 中都有遇到预测类的题目,在预测类问题中 时间预测 和 多指标预测 最为常见,接下来就详细讲一下如何利用 BP神经网络 去解决该类问题

 

历史回顾

 

 

数学建模入门篇零基础如何入门数学建模?_小羊不会飞的博客
长三角实战篇长三角数学建模——赛后总结_小羊不会飞的博客
数学建模(一):插值数学建模(一):插值_小羊不会飞的博客-CSDN博客
数学建模(二):优化数学建模(二):优化_小羊不会飞的博客-CSDN博客

 

1、什幺是预测?

 

预测在 百度百科 上的定义:“ 预测 是指人们利用 已经掌握 的知识和手段,预先推知和判断事物 未来发展状况 的一种活动,具体说来,就是人们根据事物过去发展变化的 客观过程 和 某些规律性 ,根据事物 运动 和 变化 的状态,运用各种 定性 和 定量 分析方法,对事物未来可能出现的 趋势 和可能达到的水平所进行的 科学推测 ”。

 

简而言之,就是根据已知的数据然后通过一定的数学手段预测得到未知数据!

 

2、BP神经网络预测算法

 

:pencil2:2.1 BP神经网络算法基本原理

 

关于BP神经网络算法的基本原理,博主有一篇专门的文章讲到,这里不再做赘述,请看下文

 

【数模智能算法】BP神经网络基本算法原理_小羊不会飞的博客

 

关于BP神经网络的预测类问题,博主将主要其分为:

 

1、受相关指标影响的数据预测

 

2、基于历史值影响的数据预测

 

️2.2 基于多指标影响的预测算法

 

例题1:辛烷值的预测

 

【改编】辛烷值是汽油最重要的品质指标,传统的实验室检测方法存在样品用 量大,测试周期长和费用高等问题,不适用于生产控制,特别是在线测试。近年发展起来的近红外光谱分析方法(NIR),作为一种快速分析方法,已广泛应用于农业、制药、生物化工、石油产品等领域。其优越性是无损检测、低成本、无污染,能在线分析,更适合于生产和控制的需要。实验采集得到50组汽油样品(辛烷值已通过其他方法测量),并利用傅里叶近红外变换光谱仪对其进行扫描,扫描范围900~1700nm,扫描间隔为2nm,即每个样 品的光谱曲线共含401个波长点,每个波长点对应一个吸光度。

 

(1)请利用这50组样品的数据,建立这401个吸光度和辛烷值之间的模型。

 

(2)现给你10组新的样本,这10组样本均已经过近红外变换光谱仪扫描,请预测 这10组新样本的辛烷值。

 

样本编号x1x2x3xnTarget(即y)
1
2
n

 

该题目中“辛烷值”的数值受吸光度Xi..Xn的影响,这个吸光度就是属于 多指标 ,这种情况我们需要把数据导入, input 就是各个吸光度的数据, output 就是“辛烷值”这一列的数据,我们只需要把 input 和 output 导入进 matlab 就可;

 

代码参数的调节和数据的获取可以私信博主!

 

%% 此程序为matlab编程实现的BP神经网络
% 清空环境变量
%clear
%close all
%clc
%disp(['-----------------------第一步和第二步自己载入数据--------------------------'])
%%第一步 读取数据
%input=randi([1 20],200,2);  %载入输入数据
%output=input(:,1)+input(:,2);  %载入输出数据
%% 第二步 设置训练数据和预测数据
%input_train = input(1:190,:)';
%output_train =output(1:190,:)';
%input_test = input(191:200,:)';
%output_test =output(191:200,:)';
input_train = input(1:40,:)';
output_train =output(1:40,:)';
input_test = input(41:50,:)';
output_test =output(41:50,:)';
%节点个数
inputnum=2; % 输入层节点数量
hiddennum=5;% 隐含层节点数量
outputnum=1; % 输出层节点数量
%% 第三本 训练样本数据归一化
[inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(output_train);
%% 第四步 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值
W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值
%% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=100000000;         % 训练次数,这里初始设置为1000次,后续自行修改
net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.00001
.......
完整代码:https://download.csdn.net/download/m0_55858611/86404435?spm=1001.2014.3001.5503

 

完整代码: BP神经网络多指标预测算法-机器学习文档类资源-CSDN下载

 

 

结果分析:

 

我取了前50行数据,其中40行数据用来做训练集,后10行用来和预测集作比较,通过结果来看,预测的效果不能用“ 好 ”字来形容了,那是相当的 nice ‍♀️

 

️2.3 基于时间序列影响的预测算法

 

题目:

 

 

这是一道关于肿瘤放疗的问题,其中在第二小题中出现了 预测 的字眼,需要预 测出放疗剂量为 2.5Gy 的 15次放疗数据 ,这部就是妥妥的预测模型嘛,由于 excel 中给出了不同剂量的数据,这个就相当于一个 多指标预测 ,可以直接用上面的算法去预测,但是我想讲的是它每一种剂量中, 肿瘤的大小是与时间相关的 ,我们可以 定量分析 ,当剂量相同时, 预测后面的时间的肿瘤大小 ,这就构成了一个 时间序列模型 , 时间 就成了 唯一的指标 !

时间(天)肿瘤体积(mm^3)
11.0
21.3
31.6
41.8
52.1
62.5
72.9
83.3
93.9
104.5
115.2
126.0
…………..

 

 

因为本文章只针对于 时间序列类问题 ,关于只有 时间 这一个指标时,我们可以认为 y(t)的数据与之前n组数据有关 ,即前n组数据影响到y(t)这个数据的值,从而我们建立一个新模型:

 

y(t)=f(y(t-n),y(t-n+1),….,y(t-1))

 

%% 此程序为matlab编程实现的BP神经网络
% 清空环境变量
%clear
%close all
%clc
disp(['----------------第一步和第二步可以自己载入数据-------------------'])
%关于时间序列,我们要先处理一遍,弄成y(t)=f(y(t-n),y(t-n+1),....,y(t-1))的模型
%% 第一步 读取数据
%input=randi([1 20],200,2);  %载入输入数据
%output=input(:,1)+input(:,2);  %载入输出数据
%% 第二步 设置训练数据和预测数据
%input_train = input(1:190,:)';
%output_train =output(1:190,:)';
%input_test = input(191:200,:)';
%output_test =output(191:200,:)';
input_train = input(1:25,:)';
output_train =output(1:25,:)';
input_test = input(20:27,:)';
output_test =output(20:27,:)';
%节点个数
inputnum=2; % 输入层节点数量
hiddennum=5;% 隐含层节点数量
outputnum=1; % 输出层节点数量
%% 第三本 训练样本数据归一化
[inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(output_train);
%% 第四步 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值
W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值
%% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=100000000;         % 训练次数,这里初始设置为1000次,后续自行修改
net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.00001
%设置只有训练集,关闭自动划分训练集、测试集,如果关闭则可能会出现过拟合现象
    net.dividefcn='';
%% 第六步 BP神经网络训练
net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本
.....
完整代码:https://download.csdn.net/download/m0_55858611/86404438?spm=1001.2014.3001.5501

 

完整代码: BP神经网络时间序列的代码-机器学习文档类资源-CSDN下载

 

 

结果分析:

 

我一共取了27组数据做预测,最后取八组数据做测试集,最后的结果呢也是意料之中的非常好, 拟合优度R2 达到了 99% ,其他的 回归指标 也是非常的nice!

 

三、BP神经网络预测的分析与总结

 

1、大量数据集

 

首先我们在机器学习的时候无论是做预测还是做图像识别,我们都需要大量数据集的支撑,因为小量数据跑出来的网络具有不确定性,跑出来的结果往往不是很好。

 

2、数据预处理

 

在训练网络的时候,我们要保证输入的数据一定是足够干净且准确的,也就是说训练集中不可以出现异常值,空缺值,所以我们在拿到一大堆数据时,先对数据进行预处理,然后再训练网络,这样预测得到的数据精准度会很高。

 

3、n的取值

 

在进行时间序列预测时,上面有提到我们需要取前n个数,那幺这个n值取多少才是最合适的呢,这个需要我们好好去思考一下!

 

数模之路漫漫远兮,以上均为博主个人理解,如有错误,欢迎指正,您的三连就是对俺最大的肯定!

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注