• 基于BP神经网络的含水率预测模型matlab仿真


    欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程

    目录

    一、理论基础

    二、核心程序

    三、测试结果


    一、理论基础

           在人工神经网络的发展历史上,感知机(Multilayer Perceptron,MLP)网络曾对人工神经网络的发展发挥了极大的作用,也被认为是一种真正能够使用的人工神经网络模型,它的出现曾掀起了人们研究人工神经元网络的热潮。单层感知网络(M-P模型)做为最初的神经网络,具有模型清晰、结构简单、计算量小等优点。但是,随着研究工作的深入,人们发现它还存在不足,例如无法处理非线性问题,即使计算单元的作用函数不用阀函数而用其他较复杂的非线性函数,仍然只能解决线性可分问题.不能实现某些基本功能,从而限制了它的应用。增强网络的分类和识别能力、解决非线性问题的唯一途径是采用多层前馈网络,即在输入层和输出层之间加上隐含层。构成多层前馈感知器网络。
          20世纪80年代中期,David Runelhart。Geoffrey Hinton和Ronald W-llians、DavidParker等人分别独立发现了误差反向传播算法(Error Back Propagation Training),简称BP,系统解决了多层神经网络隐含层连接权学习问题,并在数学上给出了完整推导。人们把采用这种算法进行误差校正的多层前馈网络称为BP网。
    BP神经网络具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或(Exclusive OR,XOR)和一些其他问题。从结构上讲,BP网络具有输入层、隐藏层和输出层;从本质上讲,BP算法就是以网络误差平方为目标函数、采用梯度下降法来计算目标函数的最小值。

          BP神经网络,即Back Propagation神经网络,其本质是一种基于误差反馈传播的神经网络算法。从结构上讲,BP神经网络是由一个信息的正向传播网络和一个误差的反向传播网络两个模块构成。BP神经网络的基本结构如下图所示:

           从图2的结构可知,BP神经网络主要由输入层,隐含层以及输出层构成。来自外界的信息通过输入层传输进入到隐含层进行处理,并由输出层输出处理结果。当BP神经网络的输出结果和其期望结果之间的误差较大的时候,则进入反向传播阶段,并进行进行审计网络权值的修正,直到输出结果和期望结果误差满足一定条件为止。

     

     

     BP神经网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。

    二、核心程序

    1. clc;
    2. clear;
    3. close all;
    4. warning off;
    5. rand('state',0);
    6. %%
    7. %输入数据为温度T,风速V,厚度h以及时间t
    8. Ni = 4;
    9. No = 1;
    10. Num_Hidden = 8;%隐含层数量
    11. %输出为水分比FSB
    12. Num = Ni + No;
    13. %%
    14. %训练数据设置
    15. data = xlsread('datas\data.xlsx');
    16. [R,C] = size(data);
    17. for i = 1:C/Num
    18. tmps = [];
    19. tmps = data(:,Num*(i-1)+1:Num*(i));
    20. tmps_check = tmps(:,1);
    21. tmps(isnan(tmps_check),:)=[];
    22. Train_input1{i} = tmps(:,1:Ni);
    23. Train_output1{i} = tmps(:,Ni+1:Ni+No);
    24. end
    25. %%
    26. %输入BP神经网络进行训练
    27. P = [];
    28. T = [];
    29. for i=1:length(Train_input1);
    30. P = [P;Train_input1{i}];
    31. T = [T;Train_output1{i}];
    32. end
    33. %BP神经网络参数
    34. net = newff(P',T',Num_Hidden);
    35. net.adaptFcn='adaptwb';
    36. net.trainParam.mu=1.0000e-05;
    37. net.trainParam.mu_dec=0.1000;
    38. net.trainParam.mu_inc=10;
    39. net.trainParam.mu_max=1e10;
    40. net.trainparam.mc=0.2;
    41. net.trainparam.lr=0.005;
    42. net.trainparam.epochs=2000;
    43. net.trainparam.goal=1e-9;
    44. % net.trainParam.max_fail=6;
    45. % net.trainParam.min_grad=1e-7;
    46. % net.performFcn='mse';
    47. net.trainFcn ='trainlm';
    48. net = train(net,P',T');
    49. save model.mat net
    50. %输出BP神经网络的参数
    51. Input_W = net.IW{1,1}
    52. LayerOne_Bias = net.b{1}
    53. LayerOneToTwo_W= net.LW{2,1}
    54. LayerTwo_Bias = net.b{2}
    55. %%
    56. %通过BP神经网络训练后测试
    57. for i = 1:length(Train_input1);
    58. y1{i} = sim(net,Train_input1{i}');
    59. end
    60. %%
    61. %各种指标的输出分析
    62. NAME{1} = ['T=55,v=0.3,h=3'];
    63. NAME{2} = ['T=55,v=0.6,h=3'];
    64. NAME{3} = ['T=55,v=0.7,h=3'];
    65. NAME{4} = ['T=55,v=1.2,h=3'];
    66. NAME{5} = ['h=3,T=55,v=0.9'];
    67. NAME{6} = ['h=6,T=55,v=0.9'];
    68. NAME{7} = ['h=9,T=55,v=0.9'];
    69. NAME{8} = ['h=12,T=55,v=0.9'];
    70. NAME{9} = ['T=45,v=0.9,h=3'];
    71. NAME{10}= ['T=55,v=0.9,h=3'];
    72. NAME{11}= ['T=65,v=0.9,h=3'];
    73. NAME{12}= ['T=60,v=0.9,h=3'];
    74. NAME{13}= ['T=50,v=0.9,h=3'];
    75. for i = 1:13;
    76. figure;
    77. subplot(211);
    78. plot(y1{i},'ro');
    79. hold on
    80. plot(Train_output1{i},'b');
    81. xlabel('times');
    82. ylabel('水分比');
    83. legend('BP神经网络输出水分比','实际测量水分比');
    84. title(NAME{i});
    85. grid on
    86. subplot(212);
    87. plot(y1{i}-Train_output1{i}' ,'b-*');
    88. xlabel('times');
    89. ylabel('水分比误差');
    90. grid on
    91. ylim([-1,1]);
    92. end
    93. %风速变化显示
    94. figure;
    95. subplot(121);
    96. plot(y1{1},'r-o');
    97. hold on
    98. plot(y1{2},'b-s');
    99. hold on
    100. plot(y1{3},'k-*');
    101. hold on
    102. plot(y1{4},'m-^');
    103. hold on
    104. xlabel('times');
    105. ylabel('水分比');
    106. legend('T=55,v=0.3,h=3','T=55,v=0.6,h=3','T=55,v=0.9,h=3','T=55,v=1.2,h=3');
    107. grid on
    108. title('BP神经网络输出');
    109. ylim([0,1.2]);
    110. subplot(122);
    111. plot(Train_output1{1},'r-o');
    112. hold on
    113. plot(Train_output1{2},'b-s');
    114. hold on
    115. plot(Train_output1{3},'k-*');
    116. hold on
    117. plot(Train_output1{4},'m-^');
    118. hold on
    119. xlabel('times');
    120. ylabel('水分比');
    121. legend('T=55,v=0.3,h=3','T=55,v=0.6,h=3','T=55,v=0.9,h=3','T=55,v=1.2,h=3');
    122. grid on
    123. title('测量值');
    124. grid on
    125. ylim([0,1.2]);
    126. %厚度变化显示
    127. figure;
    128. subplot(121);
    129. plot(y1{5},'r-o');
    130. hold on
    131. plot(y1{6},'b-s');
    132. hold on
    133. plot(y1{7},'k-*');
    134. hold on
    135. plot(y1{8},'m-^');
    136. hold on
    137. xlabel('times');
    138. ylabel('水分比');
    139. legend('h=3,T=55,v=0.9','h=6,T=55,v=0.9','h=9,T=55,v=0.9','h=12,T=55,v=0.9');
    140. grid on
    141. title('BP神经网络输出');
    142. ylim([0,1.2]);
    143. subplot(122);
    144. plot(Train_output1{5},'r-o');
    145. hold on
    146. plot(Train_output1{6},'b-s');
    147. hold on
    148. plot(Train_output1{7},'k-*');
    149. hold on
    150. plot(Train_output1{8},'m-^');
    151. hold on
    152. xlabel('times');
    153. ylabel('水分比');
    154. legend('h=3,T=55,v=0.9','h=6,T=55,v=0.9','h=9,T=55,v=0.9','h=12,T=55,v=0.9');
    155. grid on
    156. title('测量值');
    157. grid on
    158. ylim([0,1.2]);
    159. %温度变化显示
    160. figure;
    161. subplot(121);
    162. plot(y1{9},'r-o');
    163. hold on
    164. plot(y1{10},'b-s');
    165. hold on
    166. plot(y1{11},'k-*');
    167. hold on
    168. plot(y1{12},'m-^');
    169. hold on
    170. plot(y1{13},'c->');
    171. hold on
    172. xlabel('times');
    173. ylabel('水分比');
    174. legend('T=45,v=0.9,h=3','T=55,v=0.9,h=3','T=65,v=0.9,h=3','T=60,v=0.9,h=3','T=50,v=0.9,h=3');
    175. grid on
    176. title('BP神经网络输出');
    177. ylim([0,1.2]);
    178. subplot(122);
    179. plot(Train_output1{9},'r-o');
    180. hold on
    181. plot(Train_output1{10},'b-s');
    182. hold on
    183. plot(Train_output1{11},'k-*');
    184. hold on
    185. plot(Train_output1{12},'m-^');
    186. hold on
    187. plot(Train_output1{13},'c->');
    188. hold on
    189. xlabel('times');
    190. ylabel('水分比');
    191. legend('T=45,v=0.9,h=3','T=55,v=0.9,h=3','T=65,v=0.9,h=3','T=60,v=0.9,h=3','T=50,v=0.9,h=3');
    192. grid on
    193. title('测量值');
    194. grid on
    195. ylim([0,1.2]);

    三、测试结果

     

     

     A05-60

  • 相关阅读:
    华为云云耀云服务器L实例评测|无人值守羽毛球馆预约小程序系统搭建方案 | 在线场馆预订 | 共享空间
    lock_icon_container LockIconContainer的显示
    学习笔记——路由网络基础——浮动静态路由(路由备份和冗余)
    c++学习笔记3_函数模板的使用并实现自己定义的队列
    【编程题】【Scratch四级】2022.09 三个数排序
    软件测试不行了?互联网内卷严重?我看未必吧
    校园论坛(Java)—— 校园周边模块
    Java代理
    MongoDB CRUD操作:批量写操作
    开发库介绍
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/127942646