老饼讲解:一步一步上手学习
好了,都学了几节BP神经网络了,那么这节我们就简单的来玩玩它吧。
我们不妨使用matlab自带的化学反应acetylene数据来玩玩BP神经网络,看看BP神经网络的预测效果,以及它的使用方法,同时熟悉一下在matlab中的代码实现。
acetylene化学反应数据是matlab自带的数据,共16条数据,如下:

x1:反应器温度,x2:H2与正庚烷的比率(摩尔比),x3:接触时间(秒),y:正庚烷制乙炔的转化率(%)。
如表格所示,acetylene数据共包含三个变量和一个,事实上我们也不用太纠结这些x和y到底是什么意思啦,反正知道就是要用三个来预测就好了。
好了,下面我们就可以构建一个BP神经网络来实现化学反应转化率的预测了。
如前面所说,我们就使用三层BP神经网络,隐层用tanh函数,输出层用恒等函数y=x这样的模型结构,而唯一要确定的是隐节点个数,考虑到输入变量只有3个,所以我们隐节点也简单点来就可以了,不妨设为4,然后使用matlab来构建一个BP神经网络,并进行训练,代码如下:
load acetylene.mat % 加载acetylene数据
setdemorandstream(88888); % 指定随机种子,这样每次训练出来的网络都一样
% 数据加载
X = [x1,x2,x3]'; % 将x1,x2,x3作为输入数据
Y = y'; % 将y作为输出数据
% 模型训练
net = newff(X,Y,4,{'tansig','purelin'},'trainlm'); % 初始化BP神经网络
net.trainparam.goal = 0.0001; % 训练目标:均方误差低于0.0001
net.trainparam.show = 400; % 每训练400次展示一次结果
net.trainparam.epochs = 15000; % 最大训练次数:15000.
[net,tr] = train(net,X,Y); % 调用matlab自带的train函数训练网络
% 模型预测
py = sim(net,X); % 调用matlab的sim函数得到网络的预测值
figure; % 新建画图窗口窗口
t = 1:length(py); % 数据的序号
plot(t,Y,'*',t,py,'o') % 画图,对比原来的y和网络预测的y
legend('真实值','预测值') % 展示图例代码运行结果如下:

可以看到,我们的BP神经网络的预测值与样本数据的真实值基本是一致的,说明我们的模型训练成功了。
好了,下面我们一起来逐行解说一下代码,这样也方便熟悉一下代码的意思。
首先看下1-5行代码:
第1行就是加载matlab的acetylene数据,它包含了和的数据。经过这一句代码,我们会看到我们的工作区中会增加了如下的数据:

第2行setdemorandstream(88888)则是设置随机种子,因为BP神经网络训练时,使用了随机数,如果不固定随机种子,每次训练出来的结果是不一样的,这里我是为了让大家能复现这个结果,所以随便设置了个随机种子88888。
第4行就是把合并在一起,作为训练数据X。值得注意的是,matlab的BP神经网络要求X每一行代表一个变量,而原始数据中的都是列向量,所以合并之后还要进行转置,这里X最终是的数据哦。
同样地,第5行把y作为我们建模使用的Y,而原始数据里的y是列向量,所以需要转置后再作为我们的Y。
总的来说,记住记住,matlab的BP神经网络,是每行代表一个变量哦~!
好了,接下来我们看看模型训练的代码。

第8行是初始化一个BP神经网络,newff函数就是matlab里构建BP神经网络的函数了,newff函数第1、2个参数,就是我们的训练数据的X和Y了。然后第3个参数4代表隐节点个数,第4个参数{'tansig','purelin'}则代表第一个隐层用tanh函数,第二个隐层(即输出层)用purelin(y=x)函数,最后呢,我们选择了用trainlm算法进行训练,它所使用的就是LM列文伯格-马跨特算法进行训练,如果不设训练算法,那么默认也是用trainlm算法。
其实matlab已经有新函数构建BP了,但大部分资料仍用newff,用新函数不易找资料,所以继续用newff就好了。
第9-11行是设置一些训练参数。goal=0.0001代表误差达到0.0001时就会停止训练,show=400代表每训练400步就会展示一次结果,而epochs=15000就是最多训练15000步。还有一些其它参数,我们以后再讲。
第12行就是正式训练模型了。好了,train函数共有三个关键入参,其中net就是我们上面初始化好的BP神经网络,而X,Y就是我们用来训练模型(也就是调整模型的参数)所使用的数据。然后经过train后,模型就开始训练了,训练完后就会返回net和tr这两个关键出参,其中net就是训练好的BP神经网络,tr是训练中的一些记录,就是train record的意思,tr具体的使用我们暂时先不管,以后用到再说。
整体来说,第8行newff是初始化模型,第9-11行是设置训练参数,第12行的train才真正用X、Y来训练模型。
上面我们已经训练好模型了,下面我们来看看如何用训练好的模型进行预测。
第15行是使用训练好的模型net来对X进行预测,其中sim函数就是simmulate(模拟)的意思,sim(net,X)就会返回net对X的预测结果,曾经有同学问我,这个X是什么,这个X就是你想预测的X,例如想知道x1=1000,x2=2,x3=5时y的预测结果,那么就需要传入X=[1000,2,5]'。这里我们传入了所有X样本,最终就会得到所有X的预测结果。
16-19行就是画图了,就是画出真实Y与预测Y的散点图,没什么好说的。
事实上,模型的预测,也可以把net中的权重、阈值提取出来,再代入模型表达式来预测,毕竟BP本身就是一个函数嘛,但建模时直接用sim函数就可以了,用模型表达式来预测的方式以后再说。
这里我们简单的玩了一玩BP神经网络,其实只要X,Y的关系比较明确,那么基本都是可以用BP神经网络来进行建模的,而如果自己也不确定X能不能预测Y,那就只能试一试了,输入信息的充分性,永远是建模成功的前提。
评论