基于 BP 神经网络的预测模型:原理、代码与案例分析
一、引言
在机器学习和数据分析领域,BP(Back Propagation)神经网络是一种广泛应用的人工神经网络模型,它能够对复杂的非线性关系进行建模和预测。本文将详细介绍使用MATLAB实现基于BP神经网络的函数预测的过程,包括数据的提取与归一化、BP网络的训练、预测以及结果分析等步骤。
二、BP神经网络基本原理
2.1 神经网络结构
BP神经网络通常由输入层、隐藏层和输出层组成。设输入层有 n n n 个神经元,隐藏层有 m m m 个神经元,输出层有 p p p 个神经元。输入层的神经元接收外部输入信号 x i x_i xi( i = 1 , 2 , ⋯ , n i = 1,2,\cdots,n i=1,2,⋯,n),隐藏层的神经元对输入信号进行加权求和并通过激活函数进行非线性变换,输出层的神经元则对隐藏层的输出进行再次加权求和并输出最终结果。
隐藏层第
j
j
j 个神经元的输入
n
e
t
j
net_j
netj 为:
n
e
t
j
=
∑
i
=
1
n
w
j
i
x
i
+
b
j
net_j=\sum_{i = 1}^{n}w_{ji}x_i + b_j
netj=i=1∑nwjixi+bj
其中,
w
j
i
w_{ji}
wji 是输入层第
i
i
i 个神经元到隐藏层第
j
j
j 个神经元的权重,
b
j
b_j
bj 是隐藏层第
j
j
j 个神经元的偏置。
隐藏层第
j
j
j 个神经元的输出
y
j
y_j
yj 为:
y
j
=
f
(
n
e
t
j
)
y_j = f(net_j)
yj=f(netj)
其中,
f
f
f 是激活函数,常用的激活函数有Sigmoid函数、ReLU函数等。
输出层第
k
k
k 个神经元的输入
n
e
t
k
net_k
netk 为:
n
e
t
k
=
∑
j
=
1
m
v
k
j
y
j
+
c
k
net_k=\sum_{j = 1}^{m}v_{kj}y_j + c_k
netk=j=1∑mvkjyj+ck
其中,
v
k
j
v_{kj}
vkj 是隐藏层第
j
j
j 个神经元到输出层第
k
k
k 个神经元的权重,
c
k
c_k
ck 是输出层第
k
k
k 个神经元的偏置。
输出层第
k
k
k 个神经元的输出
o
k
o_k
ok 为:
o
k
=
g
(
n
e
t
k
)
o_k = g(net_k)
ok=g(netk)
其中,
g
g
g 是输出层的激活函数。
2.2 误差反向传播算法
误差反向传播算法是BP神经网络的核心训练算法,其基本思想是通过计算输出层的误差,然后将误差反向传播到隐藏层和输入层,根据误差调整网络的权重和偏置,使得网络的输出尽可能接近期望输出。
设期望输出为
t
k
t_k
tk,输出层的误差
E
E
E 为:
E
=
1
2
∑
k
=
1
p
(
t
k
−
o
k
)
2
E=\frac{1}{2}\sum_{k = 1}^{p}(t_k - o_k)^2
E=21k=1∑p(tk−ok)2
根据梯度下降法,权重和偏置的更新公式为:
Δ
w
j
i
=
−
η
∂
E
∂
w
j
i
\Delta w_{ji}=-\eta\frac{\partial E}{\partial w_{ji}}
Δwji=−η∂wji∂E
Δ
b
j
=
−
η
∂
E
∂
b
j
\Delta b_{j}=-\eta\frac{\partial E}{\partial b_{j}}
Δbj=−η∂bj∂E
Δ
v
k
j
=
−
η
∂
E
∂
v
k
j
\Delta v_{kj}=-\eta\frac{\partial E}{\partial v_{kj}}
Δvkj=−η∂vkj∂E
Δ
c
k
=
−
η
∂
E
∂
c
k
\Delta c_{k}=-\eta\frac{\partial E}{\partial c_{k}}
Δck=−η∂ck∂E
其中,
η
\eta
η 是学习率,控制权重和偏置的更新步长。
三、代码实现步骤及分析
假设我们有一个实际的数据集,用于预测某种商品的销售量。输入数据 input 包含影响销售量的因素,如价格、广告投入、季节等;输出数据 output 是对应的销售量。
3.1 训练数据和预测数据提取及归一化
% 清空环境变量
clc
clear
% 下载输入输出数据
load data input output
% 从1到2000间随机排序
k = rand(1, 2000);
[m, n] = sort(k);
% 找出训练数据和预测数据
input_train = input(n(1:1900), :)';
output_train = output(n(1:1900));
input_test = input(n(1901:2000), :)';
output_test = output(n(1901:2000));
% 训练样本输入输出数据归一化
[inputn, inputps] = mapminmax(input_train);
[outputn, outputps] = mapminmax(output_train);
在这段代码中,首先清空了MATLAB工作区中的变量,然后加载了名为 data
的数据文件,其中包含输入数据 input
和输出数据 output
。接着,通过随机排序将数据分为训练数据和预测数据。最后,使用 mapminmax
函数对训练数据进行归一化处理,将数据映射到
[
−
1
,
1
]
[-1, 1]
[−1,1] 区间,这样可以加快网络的训练速度和提高训练效果。
3.2 BP网络训练
% 初始化网络结构
net = newff(inputn, outputn, 5);
net.trainParam.epochs = 100;
net.trainParam.lr = 0.1;
net.trainParam.goal = 0.00004;
% 网络训练
net = train(net, inputn, outputn);
newff
函数用于创建一个前馈BP神经网络,其中 inputn
是输入数据,outputn
是期望输出数据,5
表示隐藏层的神经元个数。通过设置 trainParam
参数来控制网络的训练过程,epochs
表示最大训练次数,lr
表示学习率,goal
表示训练目标误差。最后,使用 train
函数对网络进行训练。
3.3 BP网络预测
% 预测数据归一化
inputn_test = mapminmax('apply', input_test, inputps);
% 网络预测输出
an = sim(net, inputn_test);
% 网络输出反归一化
BPoutput = mapminmax('reverse', an, outputps);
在进行预测之前,需要对预测数据进行归一化处理,使用 mapminmax
函数的 'apply'
选项,将预测数据按照训练数据的归一化参数进行归一化。然后,使用 sim
函数对归一化后的预测数据进行预测,得到网络的输出。最后,使用 mapminmax
函数的 'reverse'
选项将网络的输出反归一化,得到最终的预测结果。
3.4 结果分析
figure(1)
plot(BPoutput, ':og')
hold on
plot(output_test, '-*');
legend('预测输出', '期望输出')
title('BP网络预测输出', 'fontsize', 12)
ylabel('函数输出', 'fontsize', 12)
xlabel('样本', 'fontsize', 12)
% 预测误差
error = BPoutput - output_test;
figure(2)
plot(error, '-*')
title('BP网络预测误差', 'fontsize', 12)
ylabel('误差', 'fontsize', 12)
xlabel('样本', 'fontsize', 12)
figure(3)
plot((output_test - BPoutput)./ BPoutput, '-*');
title('神经网络预测误差百分比')
errorsum = sum(abs(error))
通过绘制预测输出和期望输出的对比图、预测误差图以及预测误差百分比图,可以直观地观察网络的预测效果。最后,计算预测误差的绝对值之和,用于评估网络的整体预测性能。
四、参考文献
[1] Haykin, S. (1998). Neural Networks: A Comprehensive Foundation. Prentice Hall.
[2] Bishop, C. M. (1995). Neural Networks for Pattern Recognition. Oxford University Press.
通过以上步骤和代码,我们可以使用BP神经网络对函数进行预测,并对预测结果进行分析。在实际应用中,可以根据具体问题调整网络的结构和训练参数,以获得更好的预测效果。