|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
3 U7 r: C( @- R+ {( f$ q以下是bp神经网络的简单介绍:" X U* ]- n% z3 x; B' _
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 4 m0 r) m, n8 T: @: Q* @
* A2 C& Q0 S, `+ |+ p
以下是对给出的代码的详细解释:
6 ]! m: o2 n# l0 cclc % 清屏
. U1 c- p# V9 l( O" \clear all; %清除内存以便加快运算速度4 {* q$ d) q+ e- H7 G1 w5 `) X
close all; %关闭当前所有figure图像; g% L; n5 L* a. B: G- k+ W
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
% \' F% y6 ], i1 a6 @
Z' Y( j, X' u6 H% }, Q
7 A" N8 @6 e' i- c! q# P/ TSamNum=20; %输入样本数量为20! r9 i5 F H: ^8 N1 G: r7 e, l
TestSamNum=20; %测试样本数量也是20
4 z- T: O, |5 ~9 M) m6 iForcastSamNum=2; %预测样本数量为2$ n1 l7 k1 Z/ ~$ [8 A
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个+ x, Z) f, d+ I$ v/ K% p
InDim=3; %网络输入维度为3
7 `5 ^/ c2 T. ]& y- h# \OutDim=2; %网络输出维度为2 T3 u# g s/ N) f' f
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。 g3 b! X3 e9 q: d- K
! \6 v! y {& h+ `# q; i, o
r k5 G; C: A8 ^+ {%原始数据
. q( ~7 i3 `* N/ j9 Y%人数(单位:万人)& X6 h4 J! X$ y Z
sqrs=[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 b6 Q$ s+ X m; E5 R) M3 B
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
3 V& \' R4 \2 Z k, U" P) I%机动车数(单位:万辆)( n/ z. Z* L4 _4 ]0 W
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...6 G9 {9 b+ W) J* {
2.7 2.85 2.95 3.1];
! q2 E6 t- ?7 t& M0 @%公路面积(单位:万平方公里)+ l l7 k1 v8 N5 T5 Y4 X! P( z( \
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 ... 4 u9 g0 w% Y- Y) K
0.56 0.59 0.59 0.67 0.69 0.79];
7 f/ g6 B: l9 D+ u) ]& J% F2 {%公路客运量(单位:万人); D3 l( ^/ h* Z, X' n9 d6 v
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
& M" m5 z3 ` \0 y6 T8 A9 D) q 22598 25107 33442 36836 40548 42927 43462];
' x; c! O i5 b+ t% ]" [6 O%公路货运量(单位:万吨)
* R" z& [9 @' w8 |glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...7 ^! Z# T* Y9 H- n+ m4 k
13320 16762 18673 20724 20803 21804];' P( D& I* @( |" Q
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
5 ?& \6 K* y; O% H' ]6 qt=[glkyl;glhyl]; %目标数据矩阵 e! n- W* r8 z3 g1 P" g' h
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化
! ]8 W- P8 _4 l& c! [给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。9 k: ^5 B- D( N# Y* j& R. }
' _8 ^1 c0 ` W9 C- Y4 ]
% r( A* V# G" O0 I2 z% F
rand('state',sum(100*clock)) %依据系统时钟种子产生随机数
0 m9 i! U1 ?% i* j# n' l# A6 fNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)0 L6 B5 M$ F' f; E" T6 S
Noise=NoiseVar*randn(2,SamNum); %生成噪声/ f: L- ^. O4 i, B1 P9 T- d
SamOut=tn + Noise; %将噪声添加到输出样本上
4 V1 x `) `# R4 R$ ?" h x设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
( i+ G7 O+ v( j4 C$ F1 R
" q: V8 b. e* t& P7 v) n5 s' ~6 u! V5 `5 Z6 k2 e/ w
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
3 V$ }* f ]7 w# STestSamOut=SamOut; %也取输出样本与测试样本相同2 b7 \0 {/ X6 S8 D
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。1 x7 z6 x* C. c6 W, [, X
# Y. S& k2 I5 n8 [' S
; e9 ?1 o, s, @. m4 }& b; G7 f) SMaxEpochs=50000; %最多训练次数为50000
3 |6 [. z6 i# U. v( g, plr=0.035; %学习速率为0.035
! s; m! g( Z/ g1 s1 GE0=0.65*10^(-3); %目标误差为0.65*10^(-3)
7 \" [% Z* x' P; t5 ?$ vW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
0 v: N R6 w+ I- LB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
4 L* ]+ ~: v- o q+ t% ~: j; mW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 - d& D: L* g. J1 `- m
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
- S5 \0 A" i2 c定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
: G$ u# f1 C3 c" J0 `7 M' \8 c; ?2 c9 h8 ]2 N1 n# i, \) R9 @" ~4 k
) l# E# ?( f: I7 F& q$ XErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存
1 _4 a# U1 d$ D/ vfor i=1:MaxEpochs
$ C* J4 q z! t, M5 V. B# n
" H5 d! m/ ~$ x HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出7 ^: h }5 s6 I
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
7 U1 J- ^. F3 a! w$ O: V Error=SamOut-NetworkOut; % 实际输出与网络输出之差7 z$ K4 q3 N7 ~$ W. z
SSE=sumsqr(Error); %能量函数(误差平方和)
! ?6 s' |# e* c" W# E/ S ErrHistory(i)=SSE;
+ j- B/ B: N! ]3 o6 L0 S. D) u8 U
! [" r( y3 y \& Q+ J) V* } if SSE<E0,break, end %如果达到误差要求则跳出学习循环
) ?, Q+ m: }. R: k3 D3 I' h, {: a c7 a$ w, ~
% 以下六行是BP网络最核心的程序
: E( d( l3 `4 {) C % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
3 {1 [' |1 M1 |: S% }/ u. s Delta2=Error;! C; G9 y7 ~6 t3 x. L
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
( i% f$ j# f! \+ I8 [; r: Z8 W. n6 i! T, O. U
dW2=Delta2*HiddenOut';
- B: ~6 \" y$ N9 R2 `! [ dB2=Delta2*ones(SamNum,1);% t+ W8 c! M j8 w' z7 v5 W$ a" x
+ m$ @, P- H6 D9 q5 b# E
dW1=Delta1*SamIn';4 E* O4 O/ s( Y J
dB1=Delta1*ones(SamNum,1);( U/ g, {# I V2 ~
%对输出层与隐含层之间的权值和阈值进行修正
' m! |, P# j3 s) r* V3 l W2=W2+lr*dW2;, C$ R" X7 C; w
B2=B2+lr*dB2;
6 _0 k) u/ ~- V' l! _8 Q %对输入层与隐含层之间的权值和阈值进行修正& Y1 v# l; _6 E% z% P9 M1 W/ Q0 }
W1=W1+lr*dW1;
* _- @% K+ g# m+ y$ C' i# V+ B B1=B1+lr*dB1;
8 `5 @% O1 M @# }7 uend
/ I* ~$ m' ?9 F, V+ u使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。' ~1 m) M9 m. G: |! Y; c
; o( y) }) T6 m
) U! g4 I; L# z$ z
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果$ V0 z$ ]: o+ F$ S
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果3 G0 H) K' f+ C Z) o
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果: ?) i1 M5 C( x5 b/ S0 W' N
x=1990:2009; % 时间轴刻度
9 ^! @+ |$ N' |' N4 v/ |newk=a(1, ; % 网络输出客运量
6 P4 B# y/ x* h0 M# Jnewh=a(2, ; % 网络输出货运量
/ s- W0 i. i- \# J3 `5 B) n, z$ zfigure ;; m% Y3 ^+ F3 D7 r5 I
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;% e% x; r0 x. \0 U* ]6 X
legend('网络输出客运量','实际客运量'); {' T$ K# V0 U
xlabel('年份');ylabel('客运量/万人');
M' l4 L# z& h* w/ H m' Qsubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;) ]8 r9 s( Y* a
legend('网络输出货运量','实际货运量');6 G0 Q4 q5 Z) E: g7 [
xlabel('年份');ylabel('货运量/万吨');$ l/ B2 M$ W& P! Y
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
. C- P; t+ Z" d
/ o4 p; j; J# I2 epnew=[73.39 75.556 G7 s% V" t p( [: R3 `8 v9 m
3.9635 4.0975! e0 o" R. _6 T: _/ o2 e
0.9880 1.0268]; %2010年和2011年的相关数据;! I0 U4 d$ F/ W3 l' h3 n
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
" T$ t9 n* U. E. QHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果* f5 J6 h+ h. W: l* \' j5 |9 {( [3 t5 D
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果 \; c9 K' o8 M
%把网络预测得到的数据还原为原始的数量级;
- H) N2 w# E/ e& R# qanew=postmnmx(anewn,mint,maxt);
V5 D3 `4 q0 _* }1 q; b
" c6 Y! s5 U7 J' Y$ Y# p给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
3 L4 J6 X* T7 c该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。* J5 |/ _* n; {: l! E
5 _# I2 B+ r- v, v- w. f
对于代码将以附件形式给出
) A8 W$ n9 m \* u
; V4 v$ N3 l# e0 L5 F- S5 s: g X/ O0 c4 z
$ n: W5 I% q" c( r% t |