目录
✨前言
在数学建模比赛中,预测也是我们最常见的问题之一,特别是每年的国赛C题,C题不出意外都为统计题。博主在去年的国赛C题和今年的长三角数学建模中都有遇到预测类的题目,在预测类问题中时间预测和多指标预测最为常见,接下来就详细讲一下如何利用BP神经网络去解决该类问题
👉🏻历史回顾👈🏻
数学建模入门篇 | 零基础如何入门数学建模?_小羊不会飞的博客 |
长三角实战篇 | 长三角数学建模------赛后总结_小羊不会飞的博客 |
数学建模(一):插值 | 数学建模(一):插值_小羊不会飞的博客-CSDN博客 |
数学建模(二):优化 | 数学建模(二):优化_小羊不会飞的博客-CSDN博客 |
🔍1、什么是预测?
预测在百度百科上的定义:“预测是指人们利用已经掌握的知识和手段,预先推知和判断事物未来发展状况的一种活动,具体说来,就是人们根据事物过去发展变化的客观过程和某些规律性,根据事物运动和变化的状态,运用各种定性和定量分析方法,对事物未来可能出现的趋势和可能达到的水平所进行的科学推测”。
简而言之,就是根据已知的数据然后通过一定的数学手段预测得到未知数据!
📑2、BP神经网络预测算法
✏️2.1 BP神经网络算法基本原理
关于BP神经网络算法的基本原理,博主有一篇专门的文章讲到,这里不再做赘述,请看下文👇🏻
关于BP神经网络的预测类问题,博主将主要其分为:
1、受相关指标影响的数据预测
2、基于历史值影响的数据预测
🗝️2.2 基于多指标影响的预测算法
样本编号 | x1 | x2 | x3 | … | xn | Target(即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
🗝️2.3 基于时间序列影响的预测算法
时间(天) | 肿瘤体积(mm^3) |
---|---|
1 | 1.0 |
2 | 1.3 |
3 | 1.6 |
4 | 1.8 |
5 | 2.1 |
6 | 2.5 |
7 | 2.9 |
8 | 3.3 |
9 | 3.9 |
10 | 4.5 |
11 | 5.2 |
12 | 6.0 |
...... | ........ |
%% 此程序为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神经网络预测的分析与总结
📝1、大量数据集
首先我们在机器学习的时候无论是做预测还是做图像识别,我们都需要大量数据集的支撑,因为小量数据跑出来的网络具有不确定性,跑出来的结果往往不是很好。
📝2、数据预处理
在训练网络的时候,我们要保证输入的数据一定是足够干净且准确的,也就是说训练集中不可以出现异常值,空缺值,所以我们在拿到一大堆数据时,先对数据进行预处理,然后再训练网络,这样预测得到的数据精准度会很高。
📝3、n的取值
在进行时间序列预测时,上面有提到我们需要取前n个数,那么这个n值取多少才是最合适的呢,这个需要我们好好去思考一下!