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

目录

参考学习b站资源:

数学建模学习交流

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

神经网络简介

项目源码

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

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

神经网络介绍

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

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

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

单层感知器只能解决线性可分性问题。在单层感知器的基础上,引入一层神经元,形成两层神经网络(剥离输入层)。其结构如下:

[En]

Single-layer perceptrons can only solve the problem of linear separability. On the basis of single-layer perceptrons, a layer of neurons is introduced to form a two-layer neural network (to strip out the input layer). The structure is as follows:

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

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

BP神经网络预测实例(matlab代码,神经网络工具箱)
可以看出,每增加一层,模型的参数数量就会急剧增加,因此深度学习对计算资源的要求特别高。在实际应用中,该模型的训练时间很长。
[En]

It can be seen that with each additional layer, the number of parameters of the model increases sharply, so deep learning requires particularly high computing resources. In practical use, the training time of the model is very long.

虽然它消耗了计算资源,但深度学习的优势也非常突出。与机器学习相比,该模型自动完成特征提取,不需要人工进行特征工程,这对于高维数据处理尤为重要。

[En]

Although it consumes computing resources, the advantages of deep learning are also very prominent. compared with machine learning, the model automatically completes feature extraction and does not require manual feature engineering, which is particularly important for high-dimensional data processing.

; 辛烷值的预测

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

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

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

Excel截图:

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

原始样品数据

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

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

首先导入数据:

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

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

; 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),需要注意的是:

  • 如果不使用公式,可以逐步实验得到隐含层节点数,即先设置一个初始值,然后在这个值的基础上逐步增加,然后比较各个网络的预测性能。选择性能最好的对应节点数作为隐含层神经元的个数(逐渐增加,因为确定隐含层节点数的基本原则是:在满足精度的前提下,结构尽量紧凑,即取尽可能少的隐含层节点)
    [En]

    if you do not use the formula, you can gradually experiment to get the number of hidden layer nodes, that is, first set an initial value, and then gradually increase * on the basis of this value, and then compare the prediction performance of each network. Select the corresponding node number with the best performance as the number of hidden layer neurons (gradually increase because the basic principle for determining the number of hidden layer nodes is : on the premise of meeting the accuracy Take the structure as compact as possible, that is, take as few hidden layer nodes as possible)
  • 如果用公式的话,一般有几个 经验公式(建议了解一下神经网络的数学/理论部分),带入看哪个效果好,就取哪个为基准,再结合 逐步试验法确定隐层节点数,但因为权值和阈值是每训练一次,调整一次,所以只能尽量趋于最优(好像也可以通过遗传算法、粒子群算法这样的 优化算法来确定,就比较高深了)

训练结果:

隐含层节点数为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代码,神经网络工具箱)

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

工具箱实现

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

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

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

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

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

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总