• 备战数学建模34-BP神经网络预测2


    目录

    一、辛烷值的预测

    1-题目分析与原理介绍

    2-神经网络建立过程

    3-预测结果分析


    BP神经网络模型,包含输入层,隐含层和输出层,正向传播过程是通过输入样本到输入层,通过输入层经过各层隐藏层,最后到达输出层;若输出层输出值与期望值的输出不符,然后误差反向传播,修正各个单元的权值,网络输出的误差达到可接受的程度或进行到预设的学习次数时终止。本次就不介绍理论部分了,直接看例题,需要学习理论部分,可以看我的上一篇神经网络的博客。

    一、辛烷值的预测

    1-题目分析与原理介绍

    我们看一下这个例题1, 对于50组数据,我们把它看成大样本,可以考虑建立神经网络模型进行预测,因为辛烷值作为预测对象,我们将吸光度作为输入,辛烷值作为输出。

    使用神经网络进行预测,我们需要知道三个名词:训练集,验证集,测试集,具体如下所示,我们此次选70%作为训练集,剩余30%分别作为验证集和测试集。

    关于刚开始使用Matlab写神经网络出现Input data size does not match net.inputs{1}.size问题,是因为训练数据的输入和输出维度不一致,要保证输入的列数等于输出的列数。

    2-神经网络建立过程

    将吸光度作为输入,辛烷值作为输出,建立神经网络,其中隐藏层神经元的个数为7个,输出层神经元的个数为1个,具体如下:

     50组数据,前面40组作为训练集,后面10组作为测试集,训练集训练模型,测试集进行泛化能力评估,我们计算均方根误差和均值误差。最后对10组数据进行预测。

    对网络进行训练,然后进行预测,MATLAB代码和未来10年的预测结果如下所示:

    1. clear; clc
    2. load data_Octane.mat
    3. %%第一步 读取数据
    4. input=X; %载入输入数据
    5. output=Y; %载入输出数据
    6. %% 第二步 设置训练数据和预测数据
    7. input_train = input(1:40,:)';
    8. output_train =output(1:40,:)';
    9. input_test = input(41:50,:)';
    10. output_test =output(41:50,:)';
    11. input_10 = new_X(1:10,:)' ;
    12. output_10 = zeros(10,1)' ;
    13. %节点个数
    14. inputnum=2; % 输入层节点数量
    15. hiddennum=7;% 隐含层节点数量
    16. outputnum=1; % 输出层节点数量
    17. %% 第三本 训练样本数据归一化
    18. [inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
    19. [outputn,outputps]=mapminmax(output_train);
    20. %% 第四步 构建BP神经网络
    21. net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
    22. W1= net. iw{1, 1};%输入层到中间层的权值
    23. B1 = net.b{1};%中间各层神经元阈值
    24. W2 = net.lw{2,1};%中间层到输出层的权值
    25. B2 = net. b{2};%输出层各神经元阈值
    26. %% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
    27. net.trainParam.epochs=1000; % 训练次数,这里设置为1000次
    28. net.trainParam.lr=0.01; % 学习速率,这里设置为0.01
    29. net.trainParam.goal=0.00001; % 训练目标最小误差,这里设置为0.00001
    30. %% 第六步 BP神经网络训练
    31. net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本
    32. %% 第七步 测试样本归一化
    33. inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化
    34. inputn_10 = mapminmax('apply',input_10,inputps);
    35. %% 第八步 BP神经网络预测
    36. an=sim(net,inputn_test); %用训练好的模型进行仿真
    37. an1 = sim(net,inputn_10) ;%最后10组预测
    38. %% 第九步 预测结果反归一化与误差计算
    39. test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级
    40. output_10 = mapminmax('reverse',an1,outputps);
    41. error=test_simu-output_test; %预测值和真实值的误差
    42. %%第十步 真实值与预测值误差比较
    43. figure(1);
    44. plot(output_test,'bo-')
    45. hold on
    46. plot(test_simu,'r*-')
    47. hold on
    48. plot(error,'square','MarkerFaceColor','b')
    49. legend('期望值','预测值','误差')
    50. xlabel('数据组数')
    51. ylabel('样本值')
    52. title('BP神经网络测试集的预测值与实际值对比图')
    53. [c,l]=size(output_test);
    54. MAE1=sum(abs(error))/l;
    55. MSE1=error*error'/l;
    56. RMSE1=MSE1^(1/2);
    57. disp(['-----------------------误差计算--------------------------']);
    58. disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:']);
    59. disp(['平均绝对误差MAE为:',num2str(MAE1)]);
    60. disp(['均方误差MSE为: ',num2str(MSE1)]);
    61. disp(['均方根误差RMSE为: ',num2str(RMSE1)]);
    62. disp('最后10组辛烷的预测结果为:') ;
    63. disp(output_10) ;
    64. figure(2);
    65. plot(51:60,output_10,'o-') ;
    66. xlabel('样本ID');
    67. ylabel('辛烷预测值') ;

    3-预测结果分析

    我们看一下测试集预测值和真实值的对比分析,可以发现误差很小,几乎接近于0,可以认为模型训练的较好。

    然后我们看一下,最后10组辛烷值的预测结果,具体如下:

     我们看一下预测均方误差和均值误差,具体如下:

    我们看一下训练集、验证集、测试集和总体的均方误差随训练次数的变化图像,基本上验证集和测试集5次就收敛了,训练集要6次以上。

    将拟合值对真实值回归,拟合优度越高,说明拟合的的效果越好,我们可以看出来集合的拟合优度都是接近于1的。

  • 相关阅读:
    Linux-yum
    2023-09-11 mysql-代号m-0930阶段目标-任务列表-记录
    lvs负载均衡
    【牛客】NC107寻找峰值,HJ31单词倒排
    SpringBoot整合百度云人脸识别功能
    cookie和session对http的作用以及区别
    ElasticSearch--整合SpringBoot
    基于Netty的高性能RPC框架(分布式缓存、雪花算法、幂等性)
    Springboot整合Prometheus
    LeetCode 面试题 16.21. 交换和
  • 原文地址:https://blog.csdn.net/nuist_NJUPT/article/details/125464510