BP神经网络作为人工神经网络中的元老,其应用广泛程度已经不言而喻。本文主要对其具体应用要点进行总结。

数据

数据采用2020年第十届MathorCup高校数学建模挑战赛A题相关数据,原始数据含有60多个因素。经过筛选和量化,最终得到19个因素。将其中的调价比例作为被预测值,即网络的输出值,其余的18个因素作为网络的输入值。

如图所示,本文建立的BP神经网络具有三层,由于输入值有18个,被预测值有1个。因此输入神经元的个数取为18,输出神经元的个数取为1。中间隐含层神经元的个数,BP网络需要根据经验取定,暂时设置为18。

matlab BP神经网络 偏差校正 matlab bp神经网络预测_神经网络

要点

由于题目要求利用附件1中的相关数据预测附件2中的调价比例,因此将附件1中的数据作为BP的训练集和测试集。对模型进行训练后,将附件2的数据输入到网络中进行预测。
(1)注意训练集合测试集的分配,一般按照4:1或3:1的比例划分。
(2)数据的规格化和还原。为了降低不同变量数值大小带来的影响,在训练前将输入X和输出Y都进行规范化,转换到[-1,1]之间,对网络的输出再实施还原。具体过程见下面的代码。应该注意每次输入和输出都要进行转换或还原。
(3)这里将预测输出与真实数据的相对误差作为衡量模型效果的标准。
(4)由于训练好的BP神经网络对同一组输入的输出结果是固定的,为了尽量减小误差。采取训练一次-测试一次-预测一次的组合,重复操作。以测试集的相对误差作为标准,舍弃误差较大时的预测结果。

代码

代码的基础来源于司守奎大神的《数学建模算法与应用》第二版,细节由我自己添加。

clc,clear
data=load('data1.txt');%导入数据,格式为(样本个数)*(变量个数)的矩阵
a=data';               %转置为每一列是一个样本
[m,n]=size(a);         %数据量的大小,m为变量个数,n为样本个数
n1 = n;                %训练集的样本个数
P=a([1:m-1],[1:n1]);   %取出训练集的x
[PN,PS1]=mapminmax(P); %数据规格化到[-1,1]
T=a(m,[1:n1]);         %取出训练集的y
[TN,PS2]=mapminmax(T); %数据规格化到[-1,1]
xt=a(1:m-1,n1+1:n);    %取出测试集的x
xn=mapminmax('apply',xt,PS1); %数据规格化到[-1,1]
yt = a(m,n1+1:n);      %取出测试集的y

%% 训练BP网络
net2=feedforwardnet(18);  %初始化BP网络,隐含层的神经元取为18个
net2 = train(net2,PN,TN); %训练BP网络
yn2 = net2(xn);           %计算测试集的预测
y2=mapminmax('reverse',yn2,PS2);  %预测值数据还原
delta3=abs(yt-y2)/yt      %计算网络预测的相对误差

%% 预测附件2
f0=load('data2.txt');        %把数据保存到纯文本文件
f=f0';
fn=mapminmax('apply',f,PS1); %自变量规格化到[-1,1]
yn3 = net2(fn);              %求预测值
y3=mapminmax('reverse',yn3,PS2); %预测值原
yz=y3';                      %得到一列预测值

参考文献

[1] 司守奎, 孙玺菁. 数学建模算法与应用[M]. 国防工业出版社, 2011.