|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
) N6 d% k: P* N$ Z1 @$ T以下是bp神经网络的简单介绍:
' C- S( }1 B3 X. u& p' e2 XBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 / {/ h! a* p) Y
4 I1 `3 U9 ~) Q$ }
以下是对给出的代码的详细解释:/ Z5 A' _3 e w1 {* D) I# f5 w
clc % 清屏# s3 P8 X) O1 L% ?0 o
clear all; %清除内存以便加快运算速度
& b: a% S& M# N/ t5 Xclose all; %关闭当前所有figure图像
/ ]- F1 J# Z8 |这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
/ Y# f0 } e1 w$ M# C s5 m5 r+ i
7 b5 w9 l; ^" R" ~- k( Z, l- x1 f9 Q4 F/ g" z
SamNum=20; %输入样本数量为20/ j V: t# o& v# O
TestSamNum=20; %测试样本数量也是20
, L' ]; u, k3 M8 I, J" z5 x) h& pForcastSamNum=2; %预测样本数量为2# g6 w/ O2 E' V0 h; w
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个! E* z/ J/ v* k, ^8 q9 K# H
InDim=3; %网络输入维度为3
7 e2 U# ]4 ~. {/ x& K- fOutDim=2; %网络输出维度为27 z& n" H5 ~- P6 ]
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。 K6 i% a( Z+ I5 n \
% P# |* s2 O) f! J3 w% _) {
* L+ h* v2 Y0 k( g1 |
%原始数据
( Q1 ~# e) k: P) X0 B" O' `7 U%人数(单位:万人)
; u7 q, _) T% \( l h( a' xsqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...& e9 v8 }- n& N# Q
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];' g0 u$ C* f3 M3 c: M
%机动车数(单位:万辆)
9 W6 {2 s' H9 x7 V9 y6 v6 u) ?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..., i% L0 N5 X7 L( _* t( m
2.7 2.85 2.95 3.1];9 c% v. {& ?. ^: v
%公路面积(单位:万平方公里)
o0 n. L9 g% B( g( F& ~' ?* vsqglmj=[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 ... + w: t* x. V Q0 `0 X
0.56 0.59 0.59 0.67 0.69 0.79];
; k9 j7 C9 O$ Z%公路客运量(单位:万人)/ i0 A: E. c* J8 _2 {
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
% E- I0 }) g1 }6 E& ^ 22598 25107 33442 36836 40548 42927 43462];
* ]( y u! s* C6 ?%公路货运量(单位:万吨)& L' }7 N$ E) Q: b. y
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...* G) w+ N5 g% n) ?- k7 ]: w
13320 16762 18673 20724 20803 21804];5 K4 o0 I2 }- y6 @6 @5 Q0 n
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
% }. P. H2 f, c9 Et=[glkyl;glhyl]; %目标数据矩阵
; G) E3 |. ?* n. w# O[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化
/ E' H7 z0 l/ m" I/ G+ K! k' m给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
, K; r( l: Q6 T P
u' P# ~: T! m( k( [5 F. m( {9 {4 r) |/ \
rand('state',sum(100*clock)) %依据系统时钟种子产生随机数
! X3 @3 j% P* ANoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)! ^! A; t- B1 C$ \( O$ `5 J
Noise=NoiseVar*randn(2,SamNum); %生成噪声
I" p1 f- h. h6 ^' YSamOut=tn + Noise; %将噪声添加到输出样本上
2 u1 R% i# f! V( c设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。. t9 A$ l- f2 C' H
: T, M6 E& A& e# I6 G
h" Y$ o5 S% c" d9 sTestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少* Q+ ~# q& E y) e, m C# n
TestSamOut=SamOut; %也取输出样本与测试样本相同
( E. {, O# \& H0 R2 A$ _6 [将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
6 d3 `. G5 D5 l% f% I4 P; g- o% U4 B. h6 W8 u$ f6 c+ @
! X/ `+ D# J0 [8 K
MaxEpochs=50000; %最多训练次数为50000+ F: J5 p" U5 v2 g/ d. v+ n+ S
lr=0.035; %学习速率为0.035& J% y6 ^: Y1 H- p
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)0 L, H, b3 q- Q$ [( M p" ?; U1 Z4 J
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值9 g8 B8 Y- [8 m7 D
B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值# Z! B! ?, m# E2 t
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 8 Z2 p) a% E1 M& X0 S: v
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
3 B* d/ m: \: s, ?定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。 \; k/ W5 T6 M! [
7 T) h7 u3 g' n
6 V9 C4 k! ^' y% u7 [ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存- x) e, a4 \5 S4 A3 t0 d
for i=1:MaxEpochs
$ i4 Z! V" v, B4 w* M! n: c+ o# u, D V9 s6 f" P% c8 b) Y
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出4 t9 `2 g% l, Y( O6 c, {( T
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
6 j: J5 M2 }: `8 E% t' S Error=SamOut-NetworkOut; % 实际输出与网络输出之差
9 j; o5 [, ^2 j9 R6 V7 H SSE=sumsqr(Error); %能量函数(误差平方和) N, X( D# c8 K
ErrHistory(i)=SSE;& j6 h; ^, }1 g0 }& W. A
_' {; r- f9 _/ @, B- ^# ` if SSE<E0,break, end %如果达到误差要求则跳出学习循环, H" R5 ~; E0 ~2 F( y& a
3 `( s0 K/ ~& A9 Z! q. ]$ ` K % 以下六行是BP网络最核心的程序" e, K! g6 X: `& n
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量2 T: c5 J2 S; \2 P
Delta2=Error;; {2 _8 Q5 L$ D
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); 4 `, L% b2 e% S6 Q' ^8 l
( C% b+ D, ~$ M5 W5 K$ a1 Z* R3 g dW2=Delta2*HiddenOut';, \7 x; i+ Q6 C1 Y/ {% L# Z
dB2=Delta2*ones(SamNum,1);
3 S X q5 A. R! ]% I" ]# D- g: ~& P
% ?: @) ~! \8 x; U: I* X- s! s% V2 D dW1=Delta1*SamIn';
% D) X- V" r+ Q3 b" g dB1=Delta1*ones(SamNum,1);
8 Q! ]. p$ s! ?' ] %对输出层与隐含层之间的权值和阈值进行修正3 R7 G9 n9 p4 j* @8 W+ \) u. ~, q
W2=W2+lr*dW2;
9 S; t& m8 l0 g; h D B2=B2+lr*dB2;
0 i- X1 \; W& ~/ J- m4 |3 `4 ? %对输入层与隐含层之间的权值和阈值进行修正0 T* Y+ D4 K! K# \
W1=W1+lr*dW1;. v# E; A( N3 |+ Y2 [
B1=B1+lr*dB1;1 X8 S3 E4 Q8 Z8 ~& u: `; f( |; c
end1 Z+ S2 W. R( |3 S. f
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。# k1 `2 K. z, i# [( W* ?
* q3 v+ H2 }3 I9 W: j) {+ ?+ u/ T6 W
* j9 S: I4 Q3 H+ G( U) V
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果2 Z4 D2 Q" T1 o3 F. \
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果) o2 e3 x3 Q* ~( T+ H0 ~& m
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
/ R; ~' y+ q8 yx=1990:2009; % 时间轴刻度
# Y& i& ]) q* a$ b! b |newk=a(1, ; % 网络输出客运量
! ~6 M' q1 }: I unewh=a(2, ; % 网络输出货运量
7 D: Y1 _3 C7 Zfigure ;
* c8 K9 V6 Y5 W: I a3 D9 Dsubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
/ Q* J7 z) T( {/ K \5 Y" flegend('网络输出客运量','实际客运量');
/ O1 Q; X! a5 R$ u' qxlabel('年份');ylabel('客运量/万人');
9 W4 `- L' O+ z. D* V! f" j0 ~subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
/ n8 v% j2 N8 _- m `" s# xlegend('网络输出货运量','实际货运量');1 a7 c$ P$ f, \- j z1 P
xlabel('年份');ylabel('货运量/万吨');
, o, E( D) t) q9 C9 H9 j6 X使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示- Q, C. U; P, R: g# g
/ {+ E- I) u3 f/ Y( [pnew=[73.39 75.55
# H6 B8 A0 j! p 3.9635 4.0975
. U% }: Y' G7 h6 v, U$ j4 a 0.9880 1.0268]; %2010年和2011年的相关数据;/ N4 m5 V0 ^: a# r
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;% h. Z, [ w l {
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
! N+ {7 m: o$ s: o. m" C2 ^/ qanewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
! [+ M( f; v) Q- d%把网络预测得到的数据还原为原始的数量级;5 U7 J+ q1 ?" y/ {2 x$ b/ L* f
anew=postmnmx(anewn,mint,maxt);
+ C" ^) o: I* E% ^- V0 k7 ]) J& g! P) S* J# m' @" Q d% e r; H/ b' i
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
& @6 v4 x( b% b% e该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
# {+ Y- s0 }' K3 P- `1 `9 Z5 L% C8 N" G
对于代码将以附件形式给出
: N% S* j' j$ G4 o! ?+ K: g1 G8 ^( t/ P4 a
8 w z7 x Y8 }* R
! ~7 }4 s* D% S& t
|