|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
6 S U* b+ @( m( z以下是bp神经网络的简单介绍:
/ D; f# x) g8 r0 ~% f# SBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
1 p" [6 {) ]7 g9 r4 U/ W+ a+ T) M* S. S
以下是对给出的代码的详细解释:+ S% c/ T4 J7 N# u) j
clc % 清屏
: Y# C7 R q/ W2 s, s8 qclear all; %清除内存以便加快运算速度. M* E* u5 n, c" F9 g
close all; %关闭当前所有figure图像$ o1 j- _: Q& g5 g# D/ x
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
) Z- w2 A* K7 E
0 n. ?- b$ L5 B8 J7 I0 z3 S3 \" S, T% c7 {7 K; v
SamNum=20; %输入样本数量为20
* ]) Q! ]/ S* ^# b4 rTestSamNum=20; %测试样本数量也是20
- w6 k: q4 z6 pForcastSamNum=2; %预测样本数量为2
. K4 _3 U# z" q1 |/ i1 MHiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个# i& t5 Z4 a; G% f
InDim=3; %网络输入维度为3! o' C# P) S1 Q4 @4 t$ _
OutDim=2; %网络输出维度为2
5 G9 B, H6 \$ A定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
, S: R2 v& ~2 `7 M# R) g3 P
) R" q2 c& a6 Y' N$ s6 o1 r1 K+ `8 W/ @$ \
%原始数据 # X: h5 Y. r2 o! [% |
%人数(单位:万人) T7 X1 _6 w0 j" g e0 A; R* [
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 ...; o0 R* l% p2 ?7 {, e
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
& ~# Q& J2 m( n. w! e v0 b; e9 I%机动车数(单位:万辆)
- O! h, \7 P; K# Wsqjdcs=[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...
; J3 ~2 J* N' H: h: m- l 2.7 2.85 2.95 3.1];
9 a: g: w+ p7 n%公路面积(单位:万平方公里)! z' l3 X2 u/ [2 }9 ]
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 ... 2 J/ W8 L6 v% B/ ]0 f: b2 m2 C
0.56 0.59 0.59 0.67 0.69 0.79];! e9 s/ z; Y. Q9 Y& x7 q
%公路客运量(单位:万人), F- _* {! u2 q/ r! B9 h0 i% A# G
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...2 q. M7 ^1 F, ^ l7 F: G
22598 25107 33442 36836 40548 42927 43462];7 X S% v; U# V( p/ b5 t: l
%公路货运量(单位:万吨)1 c4 d! Y( _( w. W2 X6 V8 v" D
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
3 p3 J2 E C0 C 13320 16762 18673 20724 20803 21804];. F' B+ H; x$ R+ c
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵( r9 q( m( Q/ S. r4 o; j, M
t=[glkyl;glhyl]; %目标数据矩阵
; I( n6 L! q4 a4 }[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化* p4 ^& D% H) Z i
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。: o* N# R6 j' I! O
4 ?, [* S. X) F6 r
8 a, D4 ?9 W* N/ E7 irand('state',sum(100*clock)) %依据系统时钟种子产生随机数 # |- |+ v1 F/ x9 W5 t" n! g; p
NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
: v5 x* I. x# F$ P! I1 Z0 iNoise=NoiseVar*randn(2,SamNum); %生成噪声
& H" M; q3 m* C" xSamOut=tn + Noise; %将噪声添加到输出样本上
4 Q5 f' T" C6 |2 j2 r8 P$ [% A设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。9 P0 O5 X. }+ X) u, x2 w$ j% f! c
( y; u' G4 x+ I3 i! Z* e+ X+ B1 F7 |1 R8 F* Y f
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
$ W! z) ~2 U- `" ~0 z' }TestSamOut=SamOut; %也取输出样本与测试样本相同
: y2 w, \* j& M( ^3 b将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。5 O' C; ?3 T# s3 I: Q- ]1 m
7 ]# I8 u" U9 ~1 |9 ^( l
+ h A. a# k' ~: w7 F1 jMaxEpochs=50000; %最多训练次数为50000
; S$ X# t( p+ M1 qlr=0.035; %学习速率为0.035+ m8 T7 n1 }$ \; |
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)/ U9 q6 F X! v0 P6 H
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值" W% m4 U1 `8 E( f
B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
" M9 S" p; L7 l5 [. Q* ^W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
+ y7 T- b }, VB2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值) Y+ F7 s. H6 B7 p* _2 \
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。2 U/ |9 U5 j% i% j A, Y* o
- m1 _( K$ [1 A' y3 ]6 }6 c
' ]) F8 r8 u2 ^3 U6 gErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存0 \4 F- }4 Y0 ]" ?& V' b' |( \ d5 Q
for i=1:MaxEpochs+ U' ?% D( ~, C8 m- z
3 | N# ]+ g7 ^7 G5 S8 P HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出, a. o& ^6 d( H2 |
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出. Z+ `, t, _5 |9 i. M
Error=SamOut-NetworkOut; % 实际输出与网络输出之差
4 T/ L2 C0 a1 P( b6 z; k SSE=sumsqr(Error); %能量函数(误差平方和)
( ^- k, J V) I3 t; _# L0 J: H ErrHistory(i)=SSE;
+ t$ u7 `. E6 \* }( T$ P+ O
- K- h' N2 | x' Q5 S2 t& m if SSE<E0,break, end %如果达到误差要求则跳出学习循环+ S& [- H) P0 ~4 h' V& q2 r* v
$ t4 z$ o/ V- `- ^9 {
% 以下六行是BP网络最核心的程序 G* l" T$ A" }* v) h3 L/ Z
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
& t2 p+ D2 f& k8 n. v6 K- r Delta2=Error;
- g* m+ v6 Z- U$ Y0 }+ m/ `5 [* \ Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
: E1 p/ |7 R- L! P( ]# ]6 G2 P+ S+ I
dW2=Delta2*HiddenOut';
4 {# P5 b4 E, S dB2=Delta2*ones(SamNum,1);7 n9 |* c$ X! g$ L
4 G. }- `8 y+ N8 b/ J" \# z
dW1=Delta1*SamIn';
5 i1 I. R* j& e1 D5 j" d dB1=Delta1*ones(SamNum,1);
7 R& ~. l/ v! q %对输出层与隐含层之间的权值和阈值进行修正% B& }5 @6 ^4 j1 D
W2=W2+lr*dW2;
/ |# W7 L9 Q- [ B2=B2+lr*dB2;
) Z8 l& }2 L% R- F5 ? e %对输入层与隐含层之间的权值和阈值进行修正
2 O* P6 X: I9 x6 u W1=W1+lr*dW1;
5 v0 m6 ~8 \1 S1 F B1=B1+lr*dB1;- Q8 Q" Q+ l) E1 S" j
end
( [- ?8 E2 p6 {' Y$ p: V7 c9 i7 {; \使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
! D0 g7 N* G1 M4 `/ }: A4 Z; O
8 T1 { r3 y; H+ w$ a. y6 Z2 P% t
8 }. J0 u8 l1 c# \- P% QHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
, a N3 e1 t; Z) ^' ENetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
! h3 Y( U6 g4 x. t. ^a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果9 k/ p+ P m/ q4 g5 C: E% i
x=1990:2009; % 时间轴刻度; Q% P+ d3 \8 U5 n
newk=a(1, ; % 网络输出客运量
+ z ^. [3 k3 I2 n1 knewh=a(2, ; % 网络输出货运量
2 Z0 M z3 Z; \/ o, E" {" [figure ;8 {- i: K% G2 K# m3 e; S! h
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;; D: J3 q- a+ r# n2 S
legend('网络输出客运量','实际客运量');) F7 `9 D3 Y+ v$ r) p( s$ W
xlabel('年份');ylabel('客运量/万人');% K, b3 T/ q4 s0 Y0 M. `
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
* ~/ C7 {# D- |. g8 _7 h N6 Hlegend('网络输出货运量','实际货运量');1 l- s0 E$ _; r3 R- E7 y4 X: e2 S
xlabel('年份');ylabel('货运量/万吨');
% _5 B" f1 p* D" Y% g/ e使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示3 d2 g: H, x% N! B9 y5 b0 t) q1 X
) n V6 i" d# c$ p, I1 `1 p/ `
pnew=[73.39 75.55, `! U9 N2 F% n& |: e0 o9 ^
3.9635 4.0975, n% x6 H# [$ F) a2 ~
0.9880 1.0268]; %2010年和2011年的相关数据;
8 y5 Y; A5 k+ h! h1 j$ \. Jpnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;6 ?% J& S8 n2 x( F4 Z
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果7 k) F+ m3 n1 }( Z
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果. S2 C5 j2 R# v3 I- A; y
%把网络预测得到的数据还原为原始的数量级;! M& t0 `! k7 a
anew=postmnmx(anewn,mint,maxt);' h; p7 z; S B, I. T9 I8 O( u
5 M0 [. D7 |. |0 p给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
- j1 g6 Y" _- K! J# d4 W该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
: F$ B! N4 y- F0 V$ ~ @& ]9 f
- L1 |- K# z9 y对于代码将以附件形式给出+ }+ j) L6 B1 T4 U# B) c# |
5 _& t7 N% F5 |* z$ b
$ @2 S' B, A' s" h, d' Z* L1 ^, s0 A* L6 E' k s! Z U
|