|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
# O/ L7 Y7 p% u, L以下是bp神经网络的简单介绍:: W6 y3 k; Q9 _" ~! M: g0 F
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
R% V- b# ?. V( l' a0 x) @: X2 F1 I. a. }
以下是对给出的代码的详细解释:: Z Q9 z" s: r% m! j
clc % 清屏9 n5 S8 u7 }8 N( ^/ U: m7 U: e
clear all; %清除内存以便加快运算速度9 k( p1 q& ^' n9 e2 ?! e! u0 ^
close all; %关闭当前所有figure图像
# |4 z+ k& J' w+ r" G$ G* }这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。9 X/ |0 c8 w/ ?! v9 O
/ t L7 u! x/ N& _: h' W
; l; @6 A/ X3 Z- H! g9 nSamNum=20; %输入样本数量为208 r& f3 l! A3 P1 N
TestSamNum=20; %测试样本数量也是20
' i2 x& h, i5 P) n7 O. GForcastSamNum=2; %预测样本数量为2
7 f( n( k9 a: qHiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个 S- V& f" ]$ \5 G& o
InDim=3; %网络输入维度为3% @8 U3 Z( [" ]0 l' W; j( N. S
OutDim=2; %网络输出维度为2/ i6 |8 e/ R) q2 {2 O
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
g, V4 P9 m$ y8 E) X6 d
q- m8 g4 k3 C2 Q( f0 T' s7 ^% }) x
%原始数据
3 U) L9 o0 y# O6 i0 R4 m%人数(单位:万人)
% M7 Z3 e7 k8 J) q+ l3 r: _3 Y' tsqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
5 y) q/ y- F0 b9 p M$ Z7 [ 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
! c" T0 h$ e- C7 j/ Y/ w: Z%机动车数(单位:万辆)2 w; |9 z. z1 U7 X, b, m. v' I4 Z, d
sqjdcs=[0.6 0.75 0.85 0.9 1.05 1.35 1.45 1.6 1.7 1.85 2.15 2.2 2.25 2.35 2.5 2.6...
( ]: H; d- u* g6 a' L) N! r6 Y 2.7 2.85 2.95 3.1]; s& s( d1 `3 N u5 G5 {
%公路面积(单位:万平方公里); v, a4 p9 w+ B9 |( n
sqglmj=[0.09 0.11 0.11 0.14 0.20 0.23 0.23 0.32 0.32 0.34 0.36 0.36 0.38 0.49 ...
% Y, U: j! \+ \5 d4 Q% F# E 0.56 0.59 0.59 0.67 0.69 0.79];# i" R- P6 b/ O0 Q7 m5 }
%公路客运量(单位:万人)
" E1 P2 e8 z; o B1 Zglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
6 ^4 g' I* @9 o% j 22598 25107 33442 36836 40548 42927 43462];
- ^% u E% G) O%公路货运量(单位:万吨)# n6 {7 l( J1 G6 L5 S
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
( {+ K, ~+ H/ C 13320 16762 18673 20724 20803 21804];6 J! g7 A/ W* d( G, K2 A9 a
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵1 F% E- \! L J$ d+ Q" R/ G& U
t=[glkyl;glhyl]; %目标数据矩阵
. g g x- O" S/ A7 X[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化
0 g( f: L! I' A给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
' \. o7 d; f7 r2 {5 ?8 X3 m4 s2 j6 y o! D8 E, D
% d% y4 @' m1 c( l qrand('state',sum(100*clock)) %依据系统时钟种子产生随机数
4 U2 p7 H7 `9 PNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
% O7 J1 m/ s1 [ c) jNoise=NoiseVar*randn(2,SamNum); %生成噪声
6 n; u0 m3 C/ ^0 E- ?SamOut=tn + Noise; %将噪声添加到输出样本上
9 z9 }3 \! b: c8 ]* m+ q设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
0 m3 G& P& P2 ]$ x* y9 z8 r3 y. ?2 U/ M
/ z2 U2 N U( O# ~9 [! U" ^ @TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
8 r. C9 @$ P' B8 {TestSamOut=SamOut; %也取输出样本与测试样本相同
8 \; m4 J* ~- o1 L6 m: y$ j! X将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
4 n' F# V2 a1 \8 T0 i; R
" H7 k) `4 z% U5 ^/ S# \0 C
4 n/ d3 O a, R. l3 v5 t, L1 fMaxEpochs=50000; %最多训练次数为500007 ~) e* m( ~8 i% P/ x9 [
lr=0.035; %学习速率为0.035* Y F- v- Y6 `3 m
E0=0.65*10^(-3); %目标误差为0.65*10^(-3). i* b+ F5 `) V! v# g7 ]7 \8 ]
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
+ c* Q- p, B& o% g J& vB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
1 I1 D. e" O' ^' j: R6 IW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 ( G/ @: A* Y: T* s1 o. r
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值$ w2 W, N3 S. s+ m8 n
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
) E& D1 g6 a$ O, L- O8 Z& [; E' ?2 z7 Z0 @
: i4 p6 b, i* l y9 P2 s+ z7 d. X
ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存
7 j2 S$ s# l' @1 o; F! ]for i=1:MaxEpochs; ^7 j! ?' w1 `4 b# \$ d
9 H/ j- _5 p/ x( h. U! X
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出+ H+ {6 S# w4 ?" k
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出/ A1 E* A/ C$ ]4 x l: M1 a% t+ L
Error=SamOut-NetworkOut; % 实际输出与网络输出之差/ c( ]2 M6 T6 p& k" p+ V+ ~. P
SSE=sumsqr(Error); %能量函数(误差平方和)' p; E; g9 b# _9 s. O
ErrHistory(i)=SSE;. y) |, }6 p" `1 w7 ~4 ^
5 o8 _- N3 V' r9 q6 r4 U6 s: d6 r if SSE<E0,break, end %如果达到误差要求则跳出学习循环
; B1 ~, P* ~+ T' A$ l3 Q' \; S$ ~- m; y7 Z+ |" z
% 以下六行是BP网络最核心的程序
8 ~' j: C4 n3 m: j0 S9 V % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量! o8 C' k9 U7 K& t
Delta2=Error;" W, r, L3 l' z; O
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); ( f: T7 r: j/ P' I
$ q: }5 Z4 C. X2 F& M7 r dW2=Delta2*HiddenOut';, r% u* W, u- x& e* b7 x$ I9 m
dB2=Delta2*ones(SamNum,1);: }! i' d9 K9 R5 D1 P
' K8 N7 F6 o" k' l/ j6 a dW1=Delta1*SamIn';
1 r1 r( ]8 K. c( Z5 i# x dB1=Delta1*ones(SamNum,1);+ I6 ^; q3 {( n9 g5 q9 s
%对输出层与隐含层之间的权值和阈值进行修正 g$ b" D7 i5 d1 Q2 e% e3 K
W2=W2+lr*dW2;, P; A* S' `+ W: J
B2=B2+lr*dB2;4 O6 r4 M" |+ [# e: ^$ ?. @, R- | q
%对输入层与隐含层之间的权值和阈值进行修正
W& B' d+ M2 K; X d+ N W1=W1+lr*dW1;
# t" I; m I t- u B1=B1+lr*dB1;0 x- A, i3 H0 f* @* l! m% R; R2 q
end- k& S; |" o7 R4 E: z. I) J7 v
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
0 O: Y4 i3 \" L/ H- M2 Q! o& o/ b" B
+ H6 |1 |, N, I* S- R
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果 N; ]( C" C) a4 E
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果/ b% y* i& D }4 \5 ^0 v+ T& j& N/ }
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
# s; }& d n% Cx=1990:2009; % 时间轴刻度
* t' ]3 z" X5 u: d' d/ ^; snewk=a(1, ; % 网络输出客运量! K. [) _* k+ ]4 {
newh=a(2, ; % 网络输出货运量9 ]. ~% h6 w1 Q/ \8 I6 u. k+ J2 p' {! o
figure ;
- z! g/ r5 O" [subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
8 c# \7 L1 J7 c) [# _legend('网络输出客运量','实际客运量');
3 G) ?! L) y6 C9 q5 Qxlabel('年份');ylabel('客运量/万人');
( z0 k- `& R4 V/ Zsubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;% \" a! H1 g; t; ?7 M( {- C2 ?
legend('网络输出货运量','实际货运量');
) [/ z7 @0 B( j6 Z( ?+ l% l% exlabel('年份');ylabel('货运量/万吨');
8 D' A; H) \. n使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示6 T- T) J9 q) D6 g4 ]1 j5 h' [
- x/ z2 K' r1 c% N$ Mpnew=[73.39 75.55
# m' R6 y; C4 @1 L+ Y5 } 3.9635 4.0975; x" M9 {4 P1 q/ _, g9 U
0.9880 1.0268]; %2010年和2011年的相关数据;
' R3 a8 z/ m( Z1 c( Spnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
' O0 h8 @% q, I, a* z9 x' zHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果/ ^7 L( X" I6 H. Y Z$ Y
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
2 D5 A; J) B8 M% D% H2 W7 _%把网络预测得到的数据还原为原始的数量级;, @( Y: F- U) m% w$ y& _* L
anew=postmnmx(anewn,mint,maxt);
! y! c ]* b3 ?8 l/ D- w( i
7 ], P1 [$ r9 P0 ?+ Q( j3 b给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
0 ~* ^( I9 |- A+ A该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
E- T4 h% O) t% Y& i3 R+ R! A
8 |8 O6 t% M6 S0 {, m. |% h对于代码将以附件形式给出
3 y1 X" T% t" b$ V! ]- b7 _, A! s
1 G) p7 V# B$ P) V [; t
3 ^: Y, X. F6 r8 X6 r8 E/ n |