|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
0 t" \$ u9 r: e4 f {以下是bp神经网络的简单介绍:
( x& F5 T: N5 L2 R- _; m9 zBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 - h/ P6 W `1 |
5 c0 w8 S. D2 X' w以下是对给出的代码的详细解释:7 o+ ^6 R) x& L L' X% p
clc % 清屏
/ ^3 F5 o- u+ q. U2 z3 f$ k* p# fclear all; %清除内存以便加快运算速度
7 ]( K7 X& Y. T5 ^7 Eclose all; %关闭当前所有figure图像) k/ d) u- Z8 @( Z/ G3 @& i3 a
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
$ N1 P& T' y; L' O0 b5 r
) S" M" Q5 z' y7 x9 ~
* N1 p) N1 b \6 g% {" m* Y2 `6 U: wSamNum=20; %输入样本数量为20
/ m, j0 g" o. r7 Q+ @) @TestSamNum=20; %测试样本数量也是20
. j' n6 |, i; d; W9 b. h6 KForcastSamNum=2; %预测样本数量为24 K! z3 |, T4 d. a7 a" |+ }; J+ h+ y
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个 D% a' u/ l8 l3 Y
InDim=3; %网络输入维度为3 g: I- N) T& K/ q1 z* G/ R+ r: q2 X
OutDim=2; %网络输出维度为2; B9 b5 }" g- Z1 [) M) V1 ~
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
/ N$ f+ E0 [1 D5 J) l4 J
6 ?5 y$ U4 L8 N1 }" R
0 }( T: m. |' J$ ^! r% P4 g! s& ^% F%原始数据 & q2 D4 R" q* F3 q
%人数(单位:万人)
1 O' E: w3 s/ L+ osqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
9 [6 B" U. L+ f" z 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
7 X1 A8 Z& {8 a%机动车数(单位:万辆)
' |6 c/ A8 Q* l& Y4 z& v3 ysqjdcs=[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... l9 q7 F1 {! H2 I0 @
2.7 2.85 2.95 3.1];1 }. n3 X$ e, W8 J
%公路面积(单位:万平方公里)
0 L7 x: n) [" X& Gsqglmj=[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 ...
/ @: @* L. t1 T/ v2 p! t- U 0.56 0.59 0.59 0.67 0.69 0.79];( E" \ g; t1 o
%公路客运量(单位:万人)' D2 z) x$ A2 U1 b1 }+ z3 y. c) l/ Q) |
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ..., @4 f6 d* e) U
22598 25107 33442 36836 40548 42927 43462];
4 i4 B- ?# p" U( G i3 E i' B9 x$ e; U%公路货运量(单位:万吨)
5 V( Z4 A% |& ]8 G+ G4 n5 C8 cglhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
( b. O7 }) Z# o# k" `: j 13320 16762 18673 20724 20803 21804];' J# u/ K% Y) g
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵" t4 \& Y* o$ I- l- \* H7 R
t=[glkyl;glhyl]; %目标数据矩阵
% [5 {- Y! ]! w7 t4 u[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化7 g, \3 e: Y4 C+ }; e8 Z
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。) P3 P/ \) k4 j0 d, ^* ^( P
* y" v0 x" G! k6 D
6 v- c% }1 }, a! prand('state',sum(100*clock)) %依据系统时钟种子产生随机数
8 P9 r$ o: B, I% G3 P) QNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
* B3 u9 Y( } k4 x# d) aNoise=NoiseVar*randn(2,SamNum); %生成噪声4 k8 \" b' o3 V8 ~! D3 `4 I
SamOut=tn + Noise; %将噪声添加到输出样本上6 E3 [! c V# u" O- i. V
设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。# q0 B- M4 M* ~# K0 s. @# q C; x
! @% D% B3 m4 z" D
* O1 L$ C* J; b/ |# i5 L+ STestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
$ U& t4 r& X3 {. pTestSamOut=SamOut; %也取输出样本与测试样本相同8 o2 o1 g6 p1 t" u! U# Q% M8 e
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
. d( s# O+ C3 y; K" ^4 J; A# u& u* m/ t! P
I5 U% i- i- a6 t& C6 R& _! v# z
MaxEpochs=50000; %最多训练次数为50000
/ l- B0 u/ l4 W% ]0 F, Z, nlr=0.035; %学习速率为0.035% h3 _* H/ t( H8 G5 I% E) t8 A }- ^
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)7 ?; m0 G4 o- c
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
: n1 _& G+ W! M$ g% YB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值6 U- O* l- ~* L2 W& o0 P
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
, @0 }5 e( j( W+ @* _% aB2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值+ Z- i9 E" ~$ J4 X; |6 e
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
- @6 Y1 ?- }& U8 j4 y
6 }- k4 \1 t& g+ o# `
; z' U! ?4 x$ C# sErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存6 F2 y' k7 e7 c4 \
for i=1:MaxEpochs. E3 w6 K9 J3 |3 u
( F& q& P5 f6 w9 K
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
! N+ R0 H2 T% B1 W" p+ w* t, F NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
" x# M N" h( Y/ n9 P) N Error=SamOut-NetworkOut; % 实际输出与网络输出之差
7 C2 _1 h. }$ h& o8 F) c$ D SSE=sumsqr(Error); %能量函数(误差平方和)
4 o9 G1 z& l+ s+ \, |2 K ErrHistory(i)=SSE;0 R( ]2 |2 Z t2 f2 q+ {
/ Y$ D* V0 b! q7 Q5 h8 K0 T5 g if SSE<E0,break, end %如果达到误差要求则跳出学习循环 n: @8 L6 X6 ?% T
$ u8 a2 A- Z! x3 e % 以下六行是BP网络最核心的程序
- D9 b0 W3 w3 h* ]: t; d1 V % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
$ \1 [' r& ~, u9 N Delta2=Error;8 h- B( l9 k; c. ~$ g; z# }
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
! i; H8 `8 |- T; f5 e5 \8 T8 C6 C- V/ K; N \
dW2=Delta2*HiddenOut';
+ R& b1 {5 c' B- _ dB2=Delta2*ones(SamNum,1); S% |) e+ C# q6 |) D+ k. h- m
; t; f9 _% P& h$ {# I$ z) Y9 ]. k9 a
dW1=Delta1*SamIn';
4 K" m1 B! M) _3 G# s: K dB1=Delta1*ones(SamNum,1);4 k% w, @& v6 m* o/ S
%对输出层与隐含层之间的权值和阈值进行修正7 R' l: Z0 D6 ^5 S3 V4 C9 P) w
W2=W2+lr*dW2;
5 l+ U0 P$ F# \ B2=B2+lr*dB2;! m8 F; k) _2 V! E, A# c1 Q; @, z
%对输入层与隐含层之间的权值和阈值进行修正/ l( [ m0 U7 ]. t: N1 |# `# I! f
W1=W1+lr*dW1;
; K% J0 l% m7 T7 D" ]1 q B1=B1+lr*dB1;
3 y; p z# x( t- Qend
4 r3 P8 K0 L/ K5 J0 c使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。. z }4 y( j# v! _$ z
2 l6 D' t# K( n; A
( F8 ]$ `# _1 _HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
9 A& w2 v, b; e1 t& P# o+ R- ONetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果( o, f! R3 w7 X# x2 H& c# }
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果1 A6 o' X8 E( x) S# W: o) r
x=1990:2009; % 时间轴刻度9 n, V* ?4 M* X4 [1 ~% I9 ^
newk=a(1, ; % 网络输出客运量1 A& i7 h8 G/ m% g: C6 i
newh=a(2, ; % 网络输出货运量1 `6 ^1 {2 m5 [0 ]! @* @& g7 P
figure ;
' v" L0 ?3 \$ w3 o7 [subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
+ [2 z# e* C/ ]9 E9 m. Slegend('网络输出客运量','实际客运量');
( [: K$ n9 c# A# b4 Axlabel('年份');ylabel('客运量/万人');
U4 _( w1 o, _9 V( q- Bsubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
2 f& r. m% `" t1 _% P" v. \4 r ulegend('网络输出货运量','实际货运量');$ F- d. O7 z6 a) l* i7 j
xlabel('年份');ylabel('货运量/万吨');
' C) s, Y2 c1 E/ C4 m* Z4 R% ?使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示 t* C5 W( m* w) M H" l) n
+ P0 e, c9 r4 {" n+ K. Lpnew=[73.39 75.55( B. }+ r( P. }: w0 a
3.9635 4.0975
' O. O; V6 j# w3 G6 L6 B; X, [ 0.9880 1.0268]; %2010年和2011年的相关数据; h# ~' n7 d! q# T4 V# f$ n
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
+ X9 K+ Q% b! T* |$ W* p+ a' g2 H7 [HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
0 N" H) N+ o' B4 g6 manewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果. \9 {- I3 C% Y
%把网络预测得到的数据还原为原始的数量级;# A: E; C6 I& |. d3 I3 @/ Q
anew=postmnmx(anewn,mint,maxt);
. V7 L' Z+ [ s2 X: \& u1 h% ]2 o3 o! d2 P( r
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。, l7 H- r) l$ y; B" H# X* a
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
( u W0 A1 w) J* n- i/ K7 q$ H0 ?# h+ B
对于代码将以附件形式给出; b8 \9 c0 g2 W
0 K O; e. u0 ~; }6 f
( W3 h! L1 ~) H3 t- q" H
% E! s$ ]8 |/ |+ Z& m- s5 {4 w |