|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
/ q" } K1 e' w. ^以下是bp神经网络的简单介绍:
. [8 u* b* Y7 j" P7 Z# u2 TBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 " R; Z8 e% K0 d1 v$ z
0 K7 V8 z+ C. Q7 Y4 m以下是对给出的代码的详细解释:& v" r6 a3 B3 \/ E+ W& F* N7 M
clc % 清屏6 X3 X% j, ~* _- w0 n+ V% ^
clear all; %清除内存以便加快运算速度
& L ?8 J7 i7 pclose all; %关闭当前所有figure图像
8 j2 F) ~" ~" s# O) L+ k: T7 m这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。/ Q, G) p9 n( v4 F( M* R$ E
: @2 q- Q+ C1 Z3 Y& ], Z* m- P E1 @
# M/ v. t- ?4 f0 Z# bSamNum=20; %输入样本数量为20
* f! e& e+ E; i# B! z. ETestSamNum=20; %测试样本数量也是205 \0 \% p% B* Y0 D1 q) i! u1 ~
ForcastSamNum=2; %预测样本数量为2
3 S: A5 T4 {! sHiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
/ q$ j2 p1 `; p: U, J* C: rInDim=3; %网络输入维度为3
. {7 P; b, T$ XOutDim=2; %网络输出维度为2
1 A* h4 q$ y' @- p定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。/ j% b3 j( S6 O* t5 ?! Q, S
4 P6 S* R' B/ q+ w$ P2 G" ?7 |
5 F7 _4 M; r2 X5 c3 H# Q%原始数据
; h( Z$ `6 L+ M; ~ f0 P% R! [$ X6 w%人数(单位:万人)5 i% ~3 m* ? I$ a8 f! u
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 ...
) ?& w5 }/ \' n# y9 M- W) o( r 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];& n/ q. C* F1 z% ?; p! M. g
%机动车数(单位:万辆)
# t1 p+ C0 P8 lsqjdcs=[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..." T. i2 c& y+ J
2.7 2.85 2.95 3.1];+ R: o: E$ U2 F
%公路面积(单位:万平方公里)0 j: J- X0 I8 o; m# j1 R% r) x
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 ... 3 Y3 D: A9 H1 {% ~4 v/ t
0.56 0.59 0.59 0.67 0.69 0.79];
8 p/ E9 Y: N6 z/ H%公路客运量(单位:万人). g1 ~+ G7 Y) e2 C0 I
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...7 c6 h, M* m+ X
22598 25107 33442 36836 40548 42927 43462];
2 G& `7 N7 \, C% v. b- w. O%公路货运量(单位:万吨)/ e. O1 O, n$ c* Z: E) \: y) v$ Z
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...6 B a1 ^; L+ Z1 e+ _. |6 M
13320 16762 18673 20724 20803 21804];
8 K, h. \$ b1 b3 U* W2 ~0 w' A; Ap=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵4 a# f: K1 }- ]1 ~6 Z) L2 ?
t=[glkyl;glhyl]; %目标数据矩阵: m- j/ c& s. g
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化9 ?) J! o" _+ V0 P
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
$ b* H0 K5 z N6 o3 p& d6 E" b2 m' @5 e. U4 C" i q
2 d3 m1 M: ^9 y8 {6 {# N8 yrand('state',sum(100*clock)) %依据系统时钟种子产生随机数 1 Y4 z+ j+ X0 w9 `% C
NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
, \9 E% J. o- Z1 G; eNoise=NoiseVar*randn(2,SamNum); %生成噪声) A) o. f p e5 B, C: h1 t
SamOut=tn + Noise; %将噪声添加到输出样本上
1 ^) }7 L; R8 D" T: k设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。+ J0 a' H- F4 g) o! ^, v
M* ?. B" I/ P. Y1 u# j9 G! P4 e! l+ w5 W4 ^
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
! J2 r r$ w; {. CTestSamOut=SamOut; %也取输出样本与测试样本相同2 T$ Q) j0 e. H
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。* H* \) l) |, |9 ]& @
. V7 N& T6 M0 H1 a
, f4 Z H( L, x7 h7 o8 pMaxEpochs=50000; %最多训练次数为500006 Q$ w K7 j! Y0 E
lr=0.035; %学习速率为0.0357 j& K8 }) r; g" i5 Q+ l) M4 T
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)
* w0 U, R" T+ {. i2 qW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值, b7 e. G$ C( g2 M6 L
B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
: N, |# c+ J4 H7 ?3 f7 R- PW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
* y, O2 |! F+ X- B- e9 t% SB2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
' c, A/ C1 P4 E' p定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。. k6 f' q" p* Q l" j5 N
: N; {6 d& y# X2 g
/ K9 Z6 y+ }) [( f- XErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存
) r0 k, J E) _0 xfor i=1:MaxEpochs+ I% }6 E% D9 m/ x1 C" w: p
3 f/ w5 {- D, s$ t K0 n HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
7 ]' r% y/ r) `& c+ w NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出9 M1 D* p, R& L9 O: ~9 s
Error=SamOut-NetworkOut; % 实际输出与网络输出之差, B0 c3 Z4 e- i' B7 b/ }1 b1 P. d
SSE=sumsqr(Error); %能量函数(误差平方和)
# x3 Y8 F& W9 q ErrHistory(i)=SSE;7 t: [ D" u8 w6 H6 ~ t. s% B! ~
' e5 D$ ?/ K! G8 k, g5 i. }, ~
if SSE<E0,break, end %如果达到误差要求则跳出学习循环& z" i( A& H! M: n5 b z
/ R( a& P) _7 L% w3 V
% 以下六行是BP网络最核心的程序6 s0 ~0 `' X) ~9 q0 d$ o9 `7 t
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量& `; K- m4 c0 W( [
Delta2=Error;
% a5 ?5 `# ]7 H Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); ' B0 N; X; u/ p6 C! r
, ?. A4 z# x7 c2 d& q' ^8 E, v dW2=Delta2*HiddenOut';! V% M3 L9 c: [; E6 ], C9 e5 n
dB2=Delta2*ones(SamNum,1);. ~0 G4 g1 s7 A/ R! c* K+ w
- B1 T5 M& }1 d8 R0 B/ ~0 Y dW1=Delta1*SamIn';
, s1 c$ @! {7 D2 ~" g* J dB1=Delta1*ones(SamNum,1);& x4 f% w* a% `* c
%对输出层与隐含层之间的权值和阈值进行修正% w/ L l* O$ \) ]. F! |, T
W2=W2+lr*dW2;$ C ~/ l# v6 B0 n' r2 Y+ M/ e
B2=B2+lr*dB2;
) J$ b6 v# ]4 P+ Y* i9 o2 P9 m! _ %对输入层与隐含层之间的权值和阈值进行修正3 m& d; O! O7 e" a8 J* ^* ?
W1=W1+lr*dW1;+ i2 A5 e2 \4 L
B1=B1+lr*dB1;
* A* S- O1 K3 [' X! fend* R6 y8 {2 p4 Z4 e1 S, q/ g
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
* w! U( s6 M0 D: I+ P p% S) K+ Q4 A5 G2 Y% h4 }* ? O. X# j
9 F& v) {' M* x3 hHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
& F5 R3 y. k y& K$ S eNetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
8 C0 F, v5 c% |1 H) P- K! xa=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果7 N, F- [ X3 S6 I
x=1990:2009; % 时间轴刻度
; G3 L9 y' B3 b- Znewk=a(1, ; % 网络输出客运量2 }. r+ i2 P t; R9 L) B R# b
newh=a(2, ; % 网络输出货运量
; k5 o2 L: m6 v2 a$ c9 Q+ D! hfigure ;
9 S1 [4 ?( ?& X' l' Rsubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;1 Y' I" a9 d4 k
legend('网络输出客运量','实际客运量');+ t" \* i# A8 L
xlabel('年份');ylabel('客运量/万人');
[3 X9 f+ L- u, T2 K. D2 psubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;" K6 h8 P) D1 C5 @1 _3 x
legend('网络输出货运量','实际货运量');' j y& w7 L+ i/ R, o
xlabel('年份');ylabel('货运量/万吨');$ ] @) u3 p0 P) H# a
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
% l& C& ]5 h% J3 \4 {( S
) ~2 Z6 e) B B$ d' [pnew=[73.39 75.55- i. Q _! H5 V0 r6 v
3.9635 4.09751 Z" B# J' b9 |& ]( e
0.9880 1.0268]; %2010年和2011年的相关数据;9 r& |* Y+ q( `! O
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;! r% A# R/ T" _' @
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
8 y2 ~" j& ? Lanewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果& D, w' U a6 h3 y9 M" w7 z4 @8 p
%把网络预测得到的数据还原为原始的数量级;7 t. H" l( b1 |. d' D- V. Z
anew=postmnmx(anewn,mint,maxt);2 d+ j6 b) z2 Q3 X$ a
9 d! M4 Y, {5 ?- l8 J
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。6 x8 e0 `7 Y6 s6 U) ~. G6 C
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
. |4 m& N. C. d/ t3 ]
. L0 p. e7 J& J& K6 j9 b对于代码将以附件形式给出
2 o6 n" G* g% n
; _5 t8 @/ R' [/ `7 |1 P7 t! n9 S- u7 ?* y0 Z
7 e* `8 f! P' g1 s% g8 t |