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

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

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


好了,这节我们开始讲BP神经网络实际建模中的内容,而在这节,我们先来说一下BP神经网络的简捷建模。为什么说是简捷建模呢,因为往往我们拿到一些数据,只是想简单地看看使用BP神经网络的效果,那么我们就只是图个快、简单,而对效果有个大概、差不多就行了,这其实也算是我们建模的第一步,就是看个大概的效果。好了,闲话不多说,让我们一步一步来看看这个应该怎么搞吧!

一、BP神经网络-快捷建模

好了,我们还是以matlab提供的考试成绩examgrades数据来举例吧。

1.1. BP神经网络-快捷建模-问题与数据

examgrades数据如下:

examgrades数据

假设,我们现在要用前四个科目的成绩,来预测科目五的成绩,那么BP神经网络能不能搞定它呢?当,我们拿到数据时,就可以使用一个简单的BP神经网络来看看BP在这个问题上的大概效果了。这时我们只打算简单看看效果,而不是非常精致的建模,一个字,要快!

1.2. BP神经网络-快捷建模-代码实现

一如继往的,仍然是用三层的BP神经网络,隐层为tanh激活函数,而输出层为purelin输出函数,训练使用lm算法,唯一要确定的,其实就只有隐节点个数,这个也是比较好办的,参考"20个输入变量,使用7-10个隐节点"这个经验,来大概地推测一下就可以了,例如我们上面的这个问题,只有四个输入变量,那我大概地设4个隐节点就好了。

然后就可以编写代码啦,具体如下:

clear all;close all ;                                        % 清空历史变量与窗口
setdemorandstream(88888);                                    % 指定随机种子,实际使用中不需要
% 数据加载                                                   
load examgrades.mat                                          % 加载acetylene数据
X = grades(:,1:4)';                                          % 将前4列作为输入数据
Y = grades(:,5)';                                            % 将第5列作为输出数据

%初始化BP神经网络,并设置一些常用关键参数
net = newff(X,Y,6,{'tansig','purelin'},'trainlm');           % 初始化BP神经网络
net.trainparam.goal        = 0.00001;                        % 训练目标:均方误差低于0.0001
net.trainparam.show        = 400;                            % 每训练400次展示一次结果
net.trainparam.epochs      = 15000;                          % 最大训练次数:15000.
net.divideParam.trainRatio = 0.7;                            % 用于训练的数据占比
net.divideParam.valRatio   = 0.15 ;                          % 用于验证过拟合的数据占比
net.divideParam.testRatio  = 0.15;                           % 用于测试的数据占比
net.trainparam.max_fail    = 6;                              % 过拟合验证失败次数

[net,tr,Z] = train(net,X,Y);                                 % 用数据数训练网络

% ===========画图=========
figure
subplot(2,1,1);                                              % 第1个子图
title('训练数据的拟合效果')                                  % 标题
hold on                                                      % 先hold on
plot(1:length(tr.trainInd), Y(tr.trainInd),'b*-')            % 训练数据的真实值
plot(1:length(tr.trainInd), Z(tr.trainInd),'ro-')            % 训练数据的预测值

subplot(2,1,2);                                              % 第2个子图
title('测试数据的拟合效果')                                  % 标题
hold on                                                      % 先hold on
plot(1:length(tr.testInd),Y(tr.testInd),'b*-')               % 测试数据的真实值
plot(1:length(tr.testInd), Z(tr.testInd),'ro-')              % 测试数据的预测值

% --------指标-------------                                 
train_mae = mean(abs(Y(tr.trainInd)-Z(tr.trainInd)))         % 训练数据的MAE
test_mae  = mean(abs(Y(tr.testInd) -Z(tr.testInd)))          % 测试数据的MAE

% 计算归一化数据的mae                                        
[Yn,ps] = mapminmax(Y,0,1);                                  % 将真实值Y归一化到[0,1]
Zn      = mapminmax('apply',Z,ps);                           % 将预测值Z归一化到[0,1]
train_mae_norm = mean(abs(Yn(tr.trainInd)-Zn(tr.trainInd)))  % 计算归一化后,训练数据的MAE
test_mae_norm  = mean(abs(Yn(tr.testInd) -Zn(tr.testInd)))   % 计算归一化后,测试数据的MAE

%=============模型对新输入的使用============
z = sim(net,X);                                              % 实际与上面train中返回的Z一致

运行结果如下:

模型的拟合结果

train_mae =  2.2375
test_mae =   2.6596
train_mae_norm =   0.0932
test_mae_norm  =   0.1108

小结

好了,这里我们先简单地展示一下问题和代码,以及代码的运行结果,接下来我们再慢慢说说代码是什么意思、要注意什么内容、以及为什么这么做,最后再说说要看些结果和内容。



图标 评论
添加评论