目录
老饼讲解:一步一步上手学习

【例子】BP神经网络-简单玩玩

作者 : 老饼 发表日期 : 2025-11-17 18:04:33 更新日期 : 2026-05-14 14:49:49
老饼讲解-简单易懂,干货满满,爽过嗦螺!


好了,都学了几节BP神经网络了,那么这节我们就简单的来玩玩它吧。

一、BP神经网络-简单例子

我们不妨使用matlab自带的化学反应acetylene数据来玩玩BP神经网络,看看BP神经网络的预测效果,以及它的使用方法,同时熟悉一下在matlab中的代码实现。

1.1. BP神经网络例子-数据说明

acetylene化学反应数据是matlab自带的数据,共16条数据,如下:

acetylene.mat数据示例

x1:反应器温度,x2:H2与正庚烷的比率(摩尔比),x3:接触时间(秒),y:正庚烷制乙炔的转化率(%)。

如表格所示,acetylene数据共包含三个变量和一个,事实上我们也不用太纠结这些x和y到底是什么意思啦,反正知道就是要用三个来预测就好了。

1.2. BP神经网络例子-代码实现

好了,下面我们就可以构建一个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神经网络的预测值与样本数据的真实值基本是一致的,说明我们的模型训练成功了。

二、代码逐行解说

好了,下面我们一起来逐行解说一下代码,这样也方便熟悉一下代码的意思。

2.1. 代码解说-数据导入

首先看下1-5行代码:代码片段-1

第1行就是加载matlab的acetylene数据,它包含了的数据。经过这一句代码,我们会看到我们的工作区中会增加了如下的数据:

各个变量的维度

第2行setdemorandstream(88888)则是设置随机种子,因为BP神经网络训练时,使用了随机数,如果不固定随机种子,每次训练出来的结果是不一样的,这里我是为了让大家能复现这个结果,所以随便设置了个随机种子88888。

第4行就是把合并在一起,作为训练数据X。值得注意的是,matlab的BP神经网络要求X每一行代表一个变量,而原始数据中的都是列向量,所以合并之后还要进行转置,这里X最终是的数据哦。

同样地,第5行把y作为我们建模使用的Y,而原始数据里的y是列向量,所以需要转置后再作为我们的Y。

总的来说,记住记住,matlab的BP神经网络,是每行代表一个变量哦~!

2.2. 代码解说-模型训练

好了,接下来我们看看模型训练的代码。

代码片段-2

第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后,模型就开始训练了,训练完后就会返回nettr这两个关键出参,其中net就是训练好的BP神经网络,tr是训练中的一些记录,就是train record的意思,tr具体的使用我们暂时先不管,以后用到再说。

整体来说,第8行newff是初始化模型,第9-11行是设置训练参数,第12行的train才真正用X、Y来训练模型。

2.3. 代码解说-模型预测

上面我们已经训练好模型了,下面我们来看看如何用训练好的模型进行预测。代码片段-3

第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,那就只能试一试了,输入信息的充分性,永远是建模成功的前提。



图标 评论
添加评论