傻瓜攻略(三)——MATLAB实现BP神经网络预测

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

数据

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

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

要点

由于题目要求利用附件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.

  • 22
    点赞
  • 390
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值