|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
* Z" j+ h) D# `6 B以下是bp神经网络的简单介绍:! c) J/ @, @7 i m+ {
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 R4 e8 W& O- c' T! d: K! x
) q, f( I- r' Q e以下是对给出的代码的详细解释:
& J; I' d+ y# s$ ]% F( Hclc % 清屏& T2 x4 `, d8 E' o6 j
clear all; %清除内存以便加快运算速度$ X5 ^- A; O+ j
close all; %关闭当前所有figure图像
, d5 M$ V* b; T* J8 N; U( P2 W4 y这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
$ J8 }7 y* E: p# h: v# A
$ f! K& b9 X* Y( [& o) O+ ^+ b7 \
SamNum=20; %输入样本数量为20" B& V' c$ w) \
TestSamNum=20; %测试样本数量也是200 Q/ `4 Z$ r; {# ^" |
ForcastSamNum=2; %预测样本数量为24 _5 s# Y( q: L6 \- X6 N* ]) f. ?
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
. D/ k5 [! l9 i8 p2 f% a4 e1 ^# s% ~6 \InDim=3; %网络输入维度为3
' n: x8 ?0 k# ZOutDim=2; %网络输出维度为2
. x5 Y d% e% Y% }定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。: C. M; V6 [9 A1 z! E$ r% N
- G( i$ d! s6 t, n `3 L! q& e4 X& `- o1 G
%原始数据
7 z% _& ^3 C2 ~% w& c2 O%人数(单位:万人)
: D! c, H+ j/ qsqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
! Q. z7 u6 X8 K; v 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];# ?' u- F' N( ]0 m0 T: h: D# E
%机动车数(单位:万辆)
/ L2 G" ]1 q. d' d2 L4 q: Hsqjdcs=[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...
! D5 j9 p1 O- m. b0 v 2.7 2.85 2.95 3.1];8 g. a- L8 _6 ]* a9 h7 w/ o& z
%公路面积(单位:万平方公里)7 E; A+ W. j* z8 W; v/ X) H, ]
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# w+ `. K4 v1 x2 K% J& ]" | 0.56 0.59 0.59 0.67 0.69 0.79];- I. J7 H7 h, V8 e: l( {
%公路客运量(单位:万人)
8 z, N7 d3 j2 v" eglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
$ G9 Q5 r/ K) y" t' Z* ?2 p7 l" H( l4 F 22598 25107 33442 36836 40548 42927 43462];0 H4 d6 u" |/ L9 P$ f" k5 U
%公路货运量(单位:万吨)
& b5 ~& {9 z5 o% S7 E. W# ?glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...+ t3 `" e: P! s+ X
13320 16762 18673 20724 20803 21804];3 V# N: W4 }3 {* I1 V# r' H
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
, N4 \ v! N* `! k2 j2 C2 [4 Tt=[glkyl;glhyl]; %目标数据矩阵3 m, Y5 K1 R6 r6 O$ o) @
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化) @- I. m4 }6 C. h; s |
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
% }+ \ a* `/ E* E, c+ a, K5 N' g& ]- p/ d- w, F
4 Z# t3 s2 Q1 `3 \9 u
rand('state',sum(100*clock)) %依据系统时钟种子产生随机数
8 p; t. b9 Z! o! O* FNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
3 E+ b9 y' s" I5 L* mNoise=NoiseVar*randn(2,SamNum); %生成噪声
$ {/ v5 X9 B7 i, s; tSamOut=tn + Noise; %将噪声添加到输出样本上( p/ O: i& W: M5 r! h9 f
设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
1 _7 j, U: i: @) @4 ~( {: Z7 `$ @ c1 j. S( P8 J
7 f9 [9 {* ?7 e+ q4 c- _
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
3 f% I+ w) \# G) zTestSamOut=SamOut; %也取输出样本与测试样本相同/ N. `1 u$ L7 }- h+ E! n2 Q
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
& e/ C7 W7 s# e3 w
3 G/ D2 ^0 h; z+ i% T2 U, M, ?. p& |6 m5 h. N C" V8 {+ O
MaxEpochs=50000; %最多训练次数为50000
) _+ ], e T7 E5 x, w( [lr=0.035; %学习速率为0.0356 S% l! H* U3 s7 T
E0=0.65*10^(-3); %目标误差为0.65*10^(-3) {; j$ ^+ `7 H1 d7 U; q& J3 M% X
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
0 m K6 M' E5 f' ~+ q0 m) SB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值 ]0 L. Y' ~4 v. v& S: N
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 9 H4 s, B7 T0 s7 w* @ P
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值1 Y/ Q" o# b6 L& b# J, R0 y
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。% A9 D* ^% V3 j* y( D, y
# B. x; G1 l# `/ N4 y- X# I1 c" o* U$ p! }5 J
ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存: a6 s8 H" g* R0 k5 I
for i=1:MaxEpochs( h/ k$ x0 Q+ G: N7 J, J
1 B0 l# L, @7 D4 z* K. N6 Q HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出8 K4 F0 |/ E) i. ~& _' \" a
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
4 H( |# o5 [# T3 E% G Error=SamOut-NetworkOut; % 实际输出与网络输出之差
# n W) K* ~3 H) W1 y# Y ~7 U SSE=sumsqr(Error); %能量函数(误差平方和)
O6 j1 N3 t% E) Z/ ~7 g4 ~ ErrHistory(i)=SSE;
7 T5 H6 H* _8 D- v4 g( X. I7 v' C
if SSE<E0,break, end %如果达到误差要求则跳出学习循环
; X! U( T. E5 ~! ~$ D
0 L, ]" Q- k3 f) U: L+ g % 以下六行是BP网络最核心的程序) g/ s7 H8 u% x9 [% Z
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量$ A7 M5 ~% F2 Q9 z* a; R
Delta2=Error;
0 l8 l6 d0 G$ L' h3 M; } Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
' K* N: O" R1 s0 c* y
/ x" |4 \! K' M: v3 ^ _ dW2=Delta2*HiddenOut';7 O4 A8 _) K3 B% \5 n9 o z# o3 ~7 Z
dB2=Delta2*ones(SamNum,1);
* k2 h$ x5 G- ^6 |) w, N$ I( i) b( R& g2 ?3 h, v- V
dW1=Delta1*SamIn';# X% f' a1 [& S# G' b8 N1 Q
dB1=Delta1*ones(SamNum,1);/ x$ [. t5 Q+ q# A! m! G# L
%对输出层与隐含层之间的权值和阈值进行修正
9 P0 C' @! d1 C7 g& N+ h W2=W2+lr*dW2;
|8 n9 O8 P- R) Q B2=B2+lr*dB2;
( C K/ s- @8 h+ q/ f %对输入层与隐含层之间的权值和阈值进行修正 n" I6 j8 L- K% G
W1=W1+lr*dW1;& E7 _$ N7 w8 m/ G' G7 _
B1=B1+lr*dB1;
) ^: R; A/ r% C: Wend! ~! c3 Y8 d3 |5 G. L4 S
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
7 a2 i; g5 ]3 ?& _1 H- l- l$ o5 S% T0 E( `& H. G
9 D* T' j/ V4 h6 t
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
' H) Z4 h; w5 ^0 o" _7 vNetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
2 Y! g0 v4 e9 z; Pa=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
( F6 ?! }: E+ p# s4 ]0 Wx=1990:2009; % 时间轴刻度
; P& Q$ T. L: w! H. Gnewk=a(1, ; % 网络输出客运量9 v9 D+ K( j7 v( K
newh=a(2, ; % 网络输出货运量
* k% L6 p/ U0 V/ dfigure ;8 p# Z$ Q$ C8 E; \' L' d. I
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
2 |$ u% q {0 O) [legend('网络输出客运量','实际客运量');, [( T7 u0 d! ^4 C9 O3 J0 D* s$ g4 ^
xlabel('年份');ylabel('客运量/万人');7 b5 [, |6 h n! I6 s
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
7 T- S' W M0 t; q4 Tlegend('网络输出货运量','实际货运量');
, X0 k& W. g: I3 b- \- i) D9 ?xlabel('年份');ylabel('货运量/万吨');
& L4 e# M' R* O3 u& v! Y使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示( Y. e P8 x! {7 k; c7 r/ n
* i$ m8 O7 Q2 B# s: }4 W; L
pnew=[73.39 75.55
* w* o8 i9 k: u& h3 Y; ~: e 3.9635 4.0975
+ r" [/ T" B$ ^5 u& S* D 0.9880 1.0268]; %2010年和2011年的相关数据;
' w# t! @- D; j7 q9 O Epnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
$ s$ ?% N0 {5 ~, K; P" |5 YHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果6 |; @9 _& a! [* A" B) F9 d
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
% W: Z( ]( D" r3 d. {%把网络预测得到的数据还原为原始的数量级;" J% B# k' |7 x+ @: J, N1 q& {
anew=postmnmx(anewn,mint,maxt);/ R5 ?) R0 Z/ `* u
) e$ S/ r; N: s# h* w' I
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
4 {& @, N% F V0 U! B该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
3 g9 R# Q0 s+ O7 D1 B
5 {8 i! R3 a5 z7 X8 L8 @. r1 q对于代码将以附件形式给出
9 A" i6 N' {4 F# I f4 ^
* z8 v! t+ |* p& n
. A' L# G" q# {0 f% p+ @& j% i) f# N& ~/ R( i
|