首先,本人是个matlab小白,也是在参加数模的时候才接触到matlab,暑期在巩固matlab的时候,根据网上找的数据,边做边学matlab。
此外,这是本人第一次撰写文章,必定会有很多疏漏。如果有侵权的地方,本人会立马删除此文章;如果有幸大佬能看到此文章,也欢迎大佬提出意见。
前言
这次BP神经网络的练习数据来源是《人工神经网络》HZAU数模基地,我以此为基础进行BP神经网络训练,得到的代码可以作为后期参加比赛是直接参考使用。
一、数据获取
实验号 | 臭氧浓度(mg/L) | 入口UV254 | UV254去除率(%) |
1 | 1.16 | 0.116 | 50.2 |
2 | 1.35 | 0.104 | 59.5 |
3 | 1.72 | 0.078 | 58.8 |
4 | 1.86 | 0.107 | 66.2 |
5 | 1.97 | 0.136 | 65.5 |
6 | 2.15 | 0.082 | 64.5 |
7 | 2.23 | 0.125 | 73.6 |
8 | 2.48 | 0.076 | 76.4 |
9 | 2.79 | 0.122 | 78.5 |
10 | 2.85 | 0.092 | 79.2 |
11 | 3.07 | 0.081 | 81.4 |
12 | 3.45 | 0.068 | 90.3 |
13 | 3.59 | 0.077 | 93.1 |
14 | 3.8 | 0.108 | 98.2 |
15 | 3.93 | 0.128 | 97.3 |
16 | 4.14 | 0.063 | 98.1 |
17 | 4.46 | 0.135 | 97.3 |
18 | 4.55 | 0.07 | 98.8 |
19 | 4.84 | 0.126 | 96.9 |
20 | 5.03 | 0.087 | 98.6 |
二、BP神经网络代码
1.训练
其中我取了上表前19组数据进行训练,代码如下:
%自行导入输入数据x和输出数据y。
input_x = [x1'; x2'];
output_y = y';
%注意将列向量转置成行向量!!!
%本模板的输入数据x1,x2,输出数据为y,。可根据实际情况删改
%可用“setdemorandstream(114514);”固定随机种子,防止每次训练结果不一样
%隐藏节点数可以根据经验公式n=2m+1确定,其中n为隐藏节点数,m为输入个数;我这里直接取了3。
%隐层的传递函数为tansig,输出层的传递函数为purelin
%使用trainlm方法训练
net = newff(input_x,output_y,3,{'tansig','purelin'},'trainlm');
%常用参数的设置
net.trainparam.goal = 0.001; %训练目标:均方误差低于0.001
net.trainparam.show = 200; %每训练200次展示一次结果
net.trainparam.epochs = 10000; %最大训练次数为10000
[net,tr] = train(net,input_x,output_y); %调用matlab神经网络工具箱自带的train函数训练网络
simout = sim(net,input_x); %调用matlab神经网络工具箱自带的sim函数得到的网络的预测值
2.画图对比原本数据和预测的数据
figure; %新建画图窗口
t=1:length(simout);
plot(t,y,t,simout,'r') %画图,对比原来的y和网络预测
3.预测数据
x = [5.03;0.087]; %表中第20个实验的数据
simy = sim(net,x) %得到的预测值
原本的20个实验的结果是98.6,而预测出来的时99.6385,有细微差别。
三、总结
练习的过程中发现,要将导入的数据转置成行向量(一般matlab导入的都是列向量)
预测结果还是有一些误差的,不过这个应该可以通过调参数来提高准确度的(后续我还是得反复摸索改进)