BP神经网络预测实例(matlab代码,神经网络工具箱)

目录

参考学习b站资源:

数学建模学习交流

bp神经网络预测matlab代码实现过程

神经网络简介

1.项目源码

可在github下载(含原始样品数据):

https://github.com/chenshunpeng/BP-neural-network

2.神经网络介绍

最早的神经网络模型, 单层感知器perceptron,结构如下:

BP神经网络预测实例(matlab代码,神经网络工具箱)
这是一个两层的神经网络,第一层为输入层,第二层为输出层。因为只有在输出层需要进行计算,就是说只有一层计算层,所以称之为单层感知器。从形式上看,仅仅是将MP模型中的输入信号当作了独立的一层神经元,但是本质上却有很大差别。

感知器模型中权重和阈值不再是固定的了,而是计算机”学习”出来的结果。引入了损失函数的概念,通过迭代不断调整权重和阈值,使得损失函数最小,以此来寻找最佳的权重和阈值。

单层感知器只可以解决线性可分的问题,在单层感知器的基础上,再引入一层神经元,构成一个2层的神经网络(要刨去输入层),结构如下:

BP神经网络预测实例(matlab代码,神经网络工具箱)
这样的一个神经网络模型,适用范围更广,涵盖了线性和非线性可分的场景。其中的每一层称之为layer, 除了输出层和输出层之外,还有中间的隐藏层。这样的神经网络模型,通过反向传播算法来求解。

增加一层的好处在于更好的数据表示和函数拟合的能力,在3层的基础上,再引入更多的隐藏层,就变成了深度神经网络,图示如下:

BP神经网络预测实例(matlab代码,神经网络工具箱)
可以看到,每增加一层,模型的参数数量急剧增加,所以深度学习对计算资源的要求特别高,在实际使用中,模型训练时间非常的久。

虽然耗费计算资源,但是深度学习的优点也很突出,相比机器学习,模型自动完成特征提取,不需要人工的特征工程,这一点对于高维数据的处理特别重要

; 3.辛烷值的预测

【改编】辛烷值是汽油最重要的品质指标,传统的实验室检测方法存在样品用量大,测试周期长和费用高等问题,不适用于生产控制,特别是在线测试。近年发展起来的近红外光谱分析方法(NIR),作为一种快速分析方法,已广泛应用于农业、制药、生物化工、石油产品等领域。其优越性是无损检测、低成本、无污染,能在线分析,更适合于生产和控制的需要。

实验采集得到50组汽油样品(辛烷值已通过其他方法测量),并利用傅里叶近红外变换光谱仪对其进行扫描,扫描范围900~1700nm,扫描间隔为2nm,即每个样品的光谱曲线共含401个波长点,每个波长点对应一个吸光度。

  1. 请利用这50组样品的数据,建立这401个吸光度和辛烷值之间的模型。
  2. 现给你10组新的样本,这10组样本均已经过近红外变换光谱仪扫描,请预测这10组新样本的辛烷值。

Excel截图:

BP神经网络预测实例(matlab代码,神经网络工具箱)
BP神经网络预测实例(matlab代码,神经网络工具箱)

3.1.原始样品数据

因为数据太多,博客只放了一部分,完整Excel可以在github项目中下载:

https://github.com/chenshunpeng/BP-neural-network

首先导入数据:

new_X:需要预测的输入层数据
X:样品的输入层数据
Y:样品的输出层数据

BP神经网络预测实例(matlab代码,神经网络工具箱)

; 3.2.matlab代码实现

%% 此程序为matlab编程实现的BP神经网络
% 清空环境变量
% clear
close all  %关闭所有图形窗口
clc

%%第一步 读取数据
input=X;   %载入输入数据
output=Y;  %载入输出数据

%% 第二步 设置训练数据和预测数据
% 注意要将指标变为列向量
input_train = input(1:40,:)';
output_train =output(1:40,:)';
input_test = input(41:50,:)';
output_test =output(41:50,:)';
%节点个数
inputnum=401; % 输入层节点数量
hiddennum=10; % 隐含层节点数量
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=1000;         % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;             % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001;        % 训练目标最小误差,这里设置为0.00001

%% 第六步 BP神经网络训练
net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本

%% 第七步 测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps); % 对样本数据进行归一化

%% 第八步 BP神经网络预测
an=sim(net,inputn_test);                           %用训练好的模型进行仿真

%% 第九步 预测结果反归一化与误差计算
test_simu=mapminmax('reverse',an,outputps);        %把仿真得到的数据还原为原始的数量级
error=test_simu-output_test;                       %预测值和真实值的误差

%%第十步 真实值与预测值误差比较
figure('units','normalized','position',[0.119 0.2 0.38 0.5])
plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('BP神经网络测试集的预测值与实际值对比图')

[c,l]=size(output_test);
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])

关于 隐含层数的确定(这里是10),需要注意的是:

  • 如果不用公式的话,可以逐步试验得到隐层节点数,就是先设置一个初始值,然后在这个值的基础上逐渐 增加,比较每次网络的预测性能,选择性能最好的对应的节点数作为隐含层神经元节点数(逐步增加是因为 确定隐含层节点数的基本原则是:在满足精度的前提下,取尽可能紧凑的结构,即取尽可能少的隐含层节点数)
  • 如果用公式的话,一般有几个 经验公式(建议了解一下神经网络的数学/理论部分),带入看哪个效果好,就取哪个为基准,再结合 逐步试验法确定隐层节点数,但因为权值和阈值是每训练一次,调整一次,所以只能尽量趋于最优(好像也可以通过遗传算法、粒子群算法这样的 优化算法来确定,就比较高深了)

训练结果:

隐含层节点数为10时的误差结果如下:
平均绝对误差MAE为:0.28223     0.28882     0.16351     0.17373    0.078239     0.15954    0.045716     0.11022     0.16083     0.16366
α的均方误差MSE为:       1.8212   -0.021202
β的均方误差MSE为:       -0.021202     0.42378
α的均方根误差RMSE为:  1.3495   -0.010599
β的均方根误差RMSE为:  -0.010599      0.6509

进行预测,竟然报错了:

BP神经网络预测实例(matlab代码,神经网络工具箱)

错误代码(就当教训了):

clc;
predict_y = zeros(10,2); % 初始化predict_y
pre_test=mapminmax('apply',new_X(:,:)',inputps);% 对预测数据进行归一化
for i = 1: 10
    result = sim(net, pre_test(:,i));
    predict_y(i,1) = result(1);
    predict_y(i,2) = result(2);
end
disp('预测值为:')
predict_y=mapminmax('reverse',predict_y,outputps); %把预测结果还原
disp(predict_y)

我们查看predict_y,没问题:

BP神经网络预测实例(matlab代码,神经网络工具箱)

那么就是 mapminmax函数的问题,修改如下:

clc;
predict_y = zeros(10,2); % 初始化predict_y
pre_test=mapminmax('apply',new_X(:,:)',inputps);% 对预测数据进行归一化
for i = 1: 10
    result = sim(net, pre_test(:,i));
    predict_y(i,1) = result(1);
    predict_y(i,2) = result(2);
end
disp('预测值为:')
predict_y=predict_y';
predict_y=mapminmax('reverse',predict_y,outputps); %把预测结果还原
disp(predict_y)

结果:

预测值为:
   77.9596   80.1580   78.4421   77.6802   79.4339   79.4779   77.8803   79.3454   78.7957   77.8469
   92.1225   91.6629   93.0518   92.4459   92.6326   92.3652   93.6457   93.1900   93.0095   93.6050

看一下predict_y,也没问题:

BP神经网络预测实例(matlab代码,神经网络工具箱)

我们再转置回来得到正确结果:

BP神经网络预测实例(matlab代码,神经网络工具箱)

那么为啥要这么修改呢,我们细细品(#^.^#) ,这要回到神经网络构建的时候了:

BP神经网络预测实例(matlab代码,神经网络工具箱)

这两部分要对应上哇,哈哈,完结撒花

4.2.工具箱实现

类比之前实现的方法,其实是不难实现的,读者可以自行完成

目前课业压力较大,这段时间大概率会忽略博客评论,敬请谅解

Original: https://blog.csdn.net/qq_45550375/article/details/122955089
Author: csp_
Title: BP神经网络预测实例(matlab代码,神经网络工具箱)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/652183/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球