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

【建模】BP神经网络-快捷建模(二)

作者 : 老饼 发表日期 : 2025-11-19 09:57:21 更新日期 : 2026-05-14 23:59:22
老饼讲解-简单易懂,干货满满,爽过嗦螺!


接上文《BP神经网络-快捷建模(一)》,上节我们已经展示了代码,那这节我们逐行解说一下代码,以及要注意的地方。

二、BP神经网络-快捷建模-代码解说

好了,我们先来逐行解说下代码。

2.1. 数据加载

首先4-6行是加载数据,这个没有什么好说的,注意每行代表一个变量,每列代表一个样本就好了。

代码片段-1

2.2. 模型初始化

接下来是第9行,模型的初始化。

代码片段-2

这里需要重点讲一下,首先,隐节点的设置,为什么我会设为6呢,大家只要凭借经验值"20个变量用7个隐节点"去推算就可以了,我们这里共有4个变量,所以应该不需要超过7个隐节点,同时如果隐节点少于3个,拟合能力会极差,所以大概范围在3-7个隐节点,我中肯点,就选择5个隐节点,然后建模后,又随便地试了一下4、6,后来发现6个的效果更好一些,所以最终选择6个隐节点。好了,我们这里只是试探性建模,所以也不用过于纠结。

大家可能会问,"20个变量用7个隐节点"是怎么得出来的,其实没怎么得出来的,就是建模建多了,总结出来的经验值,大家试探性建模时,作为一个参考还是挺实用的,隐节点的设置后面再用一章来详细讲。

然后重点来了,一定是选用三层BP,然后隐层用tansig,输出层用purelin,训练算法用trainlm这样的配置,最好不要去改,改了之后往往还把优化的路堵死了。总的来说,net = newff(X,Y,6,{'tansig','purelin'},'trainlm');只改隐节点个数就好了,其它都不要动。

2.3. 训练参数设置

接下来是第10-16行,设置相关的训练参数了,

代码片段-3

一般来说,这里都是不需要改的,但我们还是简单讲解一下。

先说goalepochs参数,由于trainlm训练基本上很快就会完成训练,它一般会因为validation Check而及早停止训练,它不会真的训练15000步,或者达到0.00001的goal,而我们将goal设为很小、epochs设为很大只是为了让它可以充分训练,不会因为goal或epochs而终止训练。

至于show参数只是用于展示,所以无所谓啦。

下面说说trainRatiovalRatiotestRatio三个参数,由于我们只是试探性建模,训练样本、验证样本、测试样本随机抽就可以了,三个参数按照0.7、0.15、0.15的占比就可以了,当然,如果样本很多,valRatio、testRatio也可以适当的调小一些,三者之和最好为1,这样比较清晰些,如果不为1也没有关系,不为1时matlab会自动将占比归一化。

最后是max_fail了,也就是早停法中validation Check的失败次数,一般用默认值6就可以了,在模型过拟合严重,也就是训练误差小、测试误差较大时,也可以减小validation Check的次数,也就是更早停止训练,但是我尝试这样做,没有太大的效果,大家也可以尝试一下。使用trainlm算法,一般都是因为validation Check的原因而退出训练的,大家不要因为这样而关掉validation Check,这样一般是徒劳无功的,往往只会让模型更加过拟合,虽然也可以尝试把它的值调大些,我一般不会去调它,毕竟一般都是徒劳无功的,总的来说,在理论上max_fail调小些可以抵抗过拟合,调大些可以让训练精度提升(同时测试精度一般会减少),而最终的结论是,不要调它,一般徒劳无功。

2.4. 模型训练

第18行就是训练模型,并返回结果了,这个没什么好说的。

代码片段-4

2.5. 模型训练

第21-32行就是画出训练数据与测试数据的拟合效果了,也没什么好说的。

代码片段-5

最后的最后,是指标计算的相关代码。

代码片段-6

在这里我们计算了两组指标,一个是训练数据、测试数据的MAE(平均绝对误差),另一个是将数据归一化到[0,1]之后,再计算的训练数据、测试数据的MAE。为什么要计算这两组指标?下节我们再来解说,这里的代码只负责计算。

最后一句代码、第45行代码,是模型的预测。

代码片段-7

其实第45行是句废代码,也可以说是备用代码,只是为了在需要使用sim函数时来预测其它值时,方便复制而已。

小结

好了,这节我们大概地看了一下代码,以及解释了代码中一些需要注意的东西,总的来说,整个代码基本没什么要改动的,都非常简单。



图标 评论
添加评论