基于BP神经网络与GRNN对比的货运量预测案例分析

一、引言

在货运量预测领域,选择合适的预测模型至关重要。广义回归神经网络(GRNN)已经在前面的文章中有所介绍,它在处理非线性问题上有独特优势。而反向传播神经网络(BP神经网络)也是一种广泛应用的经典神经网络模型。本文将结合之前GRNN的货运量预测案例,引入BP神经网络进行对比分析,详细介绍BP神经网络的原理、代码实现,并对两种模型的预测结果进行评估。

二、BP神经网络原理

(一)网络结构

BP神经网络是一种多层前馈神经网络,通常由输入层、隐藏层和输出层组成。输入层接收外界数据,隐藏层对输入数据进行非线性变换,输出层输出最终的预测结果。设输入层有 mmm 个神经元,隐藏层有 nnn 个神经元,输出层有 lll 个神经元。

(二)前向传播

在BP神经网络中,信息从输入层经过隐藏层传递到输出层,这一过程称为前向传播。对于输入层的第 iii 个神经元的输入 xix_ixi,隐藏层第 jjj 个神经元的输入 netjnet_jnetj 为:
netj=∑i=1mwjixi+bjnet_j=\sum_{i = 1}^{m}w_{ji}x_i + b_jnetj=i=1mwjixi+bj
其中 wjiw_{ji}wji 是输入层第 iii 个神经元到隐藏层第 jjj 个神经元的连接权重,bjb_jbj 是隐藏层第 jjj 个神经元的偏置。经过激活函数 φ\varphiφ 处理后,隐藏层第 jjj 个神经元的输出 yjy_jyj 为:
yj=φ(netj)y_j=\varphi(net_j)yj=φ(netj)
常见的激活函数有Sigmoid函数 φ(x)=11+e−x\varphi(x)=\frac{1}{1 + e^{-x}}φ(x)=1+ex1 和双曲正切函数 tanh⁡(x)=ex−e−xex+e−x\tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}tanh(x)=ex+exexex 等。

对于输出层第 kkk 个神经元,其输入 netknet_knetk 为:
netk=∑j=1nvkjyj+cknet_k=\sum_{j = 1}^{n}v_{kj}y_j + c_knetk=j=1nvkjyj+ck
其中 vkjv_{kj}vkj 是隐藏层第 jjj 个神经元到输出层第 kkk 个神经元的连接权重,ckc_kck 是输出层第 kkk 个神经元的偏置。输出层第 kkk 个神经元的输出 oko_kok 为:
ok=ψ(netk)o_k = \psi(net_k)ok=ψ(netk)
这里 ψ\psiψ 是输出层的激活函数,对于回归问题,常使用线性函数 ψ(x)=x\psi(x)=xψ(x)=x

(三)反向传播

BP神经网络通过反向传播算法来调整网络的权重和偏置,以最小化预测输出与实际输出之间的误差。误差函数通常采用均方误差(MSE):
E=12∑k=1l(tk−ok)2E=\frac{1}{2}\sum_{k = 1}^{l}(t_k - o_k)^2E=21k=1l(tkok)2
其中 tkt_ktk 是输出层第 kkk 个神经元的实际输出。

根据链式法则,对误差函数 EEE 关于权重 vkjv_{kj}vkj 求偏导数:
∂E∂vkj=(tk−ok)ψ′(netk)yj\frac{\partial E}{\partial v_{kj}}=(t_k - o_k)\psi'(net_k)y_jvkjE=(tkok)ψ(netk)yj
对误差函数 EEE 关于权重 wjiw_{ji}wji 求偏导数:
∂E∂wji=∑k=1l(tk−ok)ψ′(netk)vkjφ′(netj)xi\frac{\partial E}{\partial w_{ji}}=\sum_{k = 1}^{l}(t_k - o_k)\psi'(net_k)v_{kj}\varphi'(net_j)x_iwjiE=k=1l(tkok)ψ(netk)vkjφ(netj)xi

然后根据梯度下降法更新权重和偏置:
vkj(t+1)=vkj(t)−η∂E∂vkjv_{kj}(t + 1)=v_{kj}(t)-\eta\frac{\partial E}{\partial v_{kj}}vkj(t+1)=vkj(t)ηvkjE
wji(t+1)=wji(t)−η∂E∂wjiw_{ji}(t + 1)=w_{ji}(t)-\eta\frac{\partial E}{\partial w_{ji}}wji(t+1)=wji(t)ηwjiE
ck(t+1)=ck(t)−η∂E∂ckc_k(t + 1)=c_k(t)-\eta\frac{\partial E}{\partial c_k}ck(t+1)=ck(t)ηckE
bj(t+1)=bj(t)−η∂E∂bjb_j(t + 1)=b_j(t)-\eta\frac{\partial E}{\partial b_j}bj(t+1)=bj(t)ηbjE
其中 η\etaη 是学习率,控制着权重和偏置更新的步长。

三、案例分析

(一)数据准备

在本案例中,我们使用之前GRNN案例中保存的数据。通过 load best 加载保存的数据,其中包含了经过交叉验证得到的最佳输入 desired_input 和最佳输出 desired_output,以及测试数据 p_testt_test,还有归一化所需的参数 mintmaxt

(二)MATLAB代码实现

clear all
load best
n = 13
p = desired_input
t = desired_output
% 创建BP神经网络
net_bp = newff(minmax(p), [n, 3], {'tansig', 'purelin'}, 'trainlm');
% 设置训练参数
net.trainParam.show = 50;
net.trainParam.epochs = 2000;
net.trainParam.goal = 1e-3;
% 调用TRAINLM算法训练BP网络
net_bp = train(net_bp, p, t);
% 进行预测
bp_prediction_result = sim(net_bp, p_test);
bp_prediction_result = postmnmx(bp_prediction_result, mint, maxt);
bp_error = t_test - bp_prediction_result';
disp(['BP神经网络三项流量预测的误差为', num2str(abs(bp_error))])

代码解释:

  1. 网络创建:使用 newff 函数创建BP神经网络,minmax(p) 表示输入数据的范围,[n, 3] 表示隐藏层有 nnn 个神经元,输出层有 3 个神经元,{'tansig', 'purelin'} 分别表示隐藏层和输出层的激活函数,'trainlm' 表示使用Levenberg - Marquardt算法进行训练。
  2. 训练参数设置net.trainParam.show = 50 表示每 50 个训练周期显示一次训练信息,net.trainParam.epochs = 2000 表示最大训练周期为 2000 次,net.trainParam.goal = 1e-3 表示训练的目标误差为 1×10−31\times10^{-3}1×103
  3. 训练网络:使用 train 函数调用 trainlm 算法对BP网络进行训练。
  4. 预测与误差计算:使用 sim 函数对测试数据进行预测,然后对预测结果进行反归一化处理,最后计算预测误差并显示。

(三)结果对比

在之前的GRNN案例中,我们得到了GRNN网络的预测误差 grnn_error。将BP神经网络的预测误差 bp_error 与GRNN的预测误差进行对比,可以评估两种模型在货运量预测任务中的性能。如果 bp_error 较小,说明BP神经网络在该任务中表现更好;反之,则说明GRNN更适合该任务。

四、结论

通过本案例的分析,我们可以看到BP神经网络在货运量预测中的应用过程。BP神经网络通过前向传播和反向传播算法不断调整权重和偏置,以实现对非线性关系的拟合。与GRNN相比,两种模型各有优劣。BP神经网络需要更多的训练时间和参数调整,但在合适的参数设置下可以获得较好的预测效果;GRNN则具有训练速度快、对参数不太敏感等优点。在实际应用中,需要根据具体问题和数据特点选择合适的模型。

五、参考文献

[1] Haykin S. Neural Networks and Learning Machines[M]. Pearson Prentice Hall, 2009.
[2] 史忠植. 神经网络[M]. 机械工业出版社, 2016.
[3] Rumelhart D E, Hinton G E, Williams R J. Learning internal representations by error propagation[J]. Parallel Distributed Processing: Explorations in the Microstructure of Cognition, 1986.

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐