在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
` i; e9 Z! h" I# W) G以下是bp神经网络的简单介绍:, G: j+ I. Z" k0 p. f
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 + w7 c2 _% f& N8 }& ?0 d
# X$ t V/ O5 x2 N# Y1 `) m! R7 [以下是对给出的代码的详细解释:! T3 U2 S" }6 b! r
clc % 清屏
3 {; s' v0 A* H' Qclear all; %清除内存以便加快运算速度# [ Z Q6 x, {
close all; %关闭当前所有figure图像
* l7 e7 I. P$ z+ y这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
" h+ S9 G: c( v6 `! `2 E9 _' T5 X6 w1 s. D6 @
4 v. X, Z+ |2 dSamNum=20; %输入样本数量为20
- w" J3 S6 [- f6 oTestSamNum=20; %测试样本数量也是20
8 @: V2 U" y+ q$ E n* yForcastSamNum=2; %预测样本数量为2
5 G3 f) l- a8 L7 J, P {9 }HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
; b8 R- m" `' A; t1 eInDim=3; %网络输入维度为3- B7 C1 J7 @6 d/ z+ u- Q" v& T
OutDim=2; %网络输出维度为2, p$ Q9 z; q5 x# k" F% A! D! ]/ s
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
8 I/ l2 L- ?" V: G. e
9 G- `0 a8 U- m- U" D. K
l# f* E7 y' _, r |% K* a%原始数据 9 x$ Y, Q6 N9 {0 s. i- y
%人数(单位:万人)& G; D3 K$ ~7 F% t. O( y) m- N
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 ...+ }) s s1 e% f5 | V1 A
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
% b: C7 [- A6 L/ `! |' B: E%机动车数(单位:万辆)
/ @7 b* }( g& \. j, 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...
( Y) ]9 E6 ?& N9 t: b' W Q 2.7 2.85 2.95 3.1];
( z- V. q3 Y2 x/ a/ X6 {8 M0 \* S%公路面积(单位:万平方公里)0 W! Z. l) M: `6 L5 p
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 ...
, S# c5 M$ W" u6 ]( x 0.56 0.59 0.59 0.67 0.69 0.79];) u. k1 j9 v) Q/ T& u c M" G" [
%公路客运量(单位:万人)
* E' A; W/ S: F1 _ A2 k; i2 tglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...9 ? l- w/ z2 S& ]" M$ S
22598 25107 33442 36836 40548 42927 43462];
" A- H, l7 ?# L- ^- l& t v5 w; `%公路货运量(单位:万吨)7 o5 D3 K j; T$ O" u8 n
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...6 c8 V4 O- l2 r. e& U
13320 16762 18673 20724 20803 21804];4 A) }; D. v' W% ^2 S3 ]
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵: j+ q, J4 b' @5 h; z9 s
t=[glkyl;glhyl]; %目标数据矩阵
4 W* N8 _. U' R; ][SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化/ ?) W O, S/ \# T t8 i% }, ^* k
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。& i+ Y; Z7 V/ z& A
/ d8 v: X& L0 V7 Q2 \ e3 W
$ U1 P' w/ f5 A0 @- Y3 K$ I# K; R' Grand('state',sum(100*clock)) %依据系统时钟种子产生随机数
" Z6 a6 ~2 ?2 \) ?9 `NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)/ H! a) I& Y V$ r9 B1 _0 g9 I, K
Noise=NoiseVar*randn(2,SamNum); %生成噪声
! h' T5 ~7 C: J9 f9 o7 Q/ f+ XSamOut=tn + Noise; %将噪声添加到输出样本上
. E, p# g8 Q" x! B. @设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。* z7 J+ ]0 \. }( d+ q
. M* a8 @3 C! d# ^
' L; n7 W1 Y+ m5 g9 {, p, H: z
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少( o% K/ z) i9 F; o& r* ^8 `
TestSamOut=SamOut; %也取输出样本与测试样本相同, }4 a6 F- n( u* V) _
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。+ f3 Z! B5 S) F2 A$ Y& L# [, V
; U' Q# ]( w- w" h9 `
9 r/ ~( g' f6 v ZMaxEpochs=50000; %最多训练次数为50000
3 H: ~. g9 Z& `lr=0.035; %学习速率为0.035+ ?* p2 j0 a( l3 W/ C1 v- h/ Y$ |/ _
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)
& W# C* b+ o/ yW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值+ A% N& N3 ]; a" s% M5 J# O5 V
B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值( q z! f) T% w6 }2 o& u
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
+ t2 w! S! y- O SB2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值: b( h0 R% H* `# {/ V
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
. V Z9 K" Z; d- W- {/ @& Y" g! \% ]" y6 @! L6 n1 p2 V4 t
4 s7 J3 ~0 L+ d3 ?7 Z$ \ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存+ F! o3 g, j9 N" L( k
for i=1:MaxEpochs
; j6 l5 P/ m; X& c! T$ k5 ^( R8 T' Y$ {! Q6 j. C# ` s
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出6 B& o4 x/ O2 s. ?$ A' V- F4 P
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
7 |, W1 R; O/ ]. o4 H; N3 m. j Error=SamOut-NetworkOut; % 实际输出与网络输出之差
, `( v+ A0 c7 Y: K' `& g SSE=sumsqr(Error); %能量函数(误差平方和)
& u/ X6 Q4 _+ ]8 \% ^% S+ H ErrHistory(i)=SSE;2 H/ V" _; V9 w) J3 F3 u! q
! v& G4 h( M: g
if SSE<E0,break, end %如果达到误差要求则跳出学习循环6 l9 X5 }; k" T9 }% B4 |
( ?" ]+ p, |) B6 n5 r % 以下六行是BP网络最核心的程序
! e" Y' T6 n- O) J; @% Q % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量1 d# D8 C3 T! v1 j5 x9 w
Delta2=Error;
; t7 L4 j: g7 N+ `" h Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); & m% R+ E% x, o$ Z
( z# N* o+ [* I; C9 r8 i
dW2=Delta2*HiddenOut';! v s! h/ M7 L- U+ S& E2 u
dB2=Delta2*ones(SamNum,1);6 o$ h- s8 m7 ^& z r& p6 \
% _1 G3 l% U1 @* ~
dW1=Delta1*SamIn';
" Z/ V2 V& s4 G% J2 P+ i/ c, m dB1=Delta1*ones(SamNum,1);5 A; ~& v0 [( V- v0 }! F, e; w, O
%对输出层与隐含层之间的权值和阈值进行修正/ |( I' N9 K# _/ R: j+ z, N# n
W2=W2+lr*dW2;7 p( U7 Q5 q1 |3 l) a" X
B2=B2+lr*dB2;- h' g; v! C6 y2 q& @
%对输入层与隐含层之间的权值和阈值进行修正; r% ~( i/ J! X1 @: ?, g$ Q% _, ~/ ^
W1=W1+lr*dW1;
+ U( `9 K5 \7 f1 ?1 ? B1=B1+lr*dB1;7 _1 r/ X( ]0 J3 Q5 V+ L$ ]- \: {/ K5 @
end) u. Z2 I' y ]' |
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
# [9 w3 z8 _) P
. F* G- M; M) c5 A# L- `$ ^8 u" ]$ i% p( R6 b
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
/ u* O$ Z" i+ s# `! X6 H) INetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
; @. a$ [1 C% V2 |2 d" Qa=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
: K, `. [' I8 T, p3 z& P: h9 rx=1990:2009; % 时间轴刻度& X( |1 i( ?$ x0 T( ~( \. f
newk=a(1, ; % 网络输出客运量
: w1 b- d2 g3 \newh=a(2, ; % 网络输出货运量
2 `* q. f5 I# z0 X o3 F1 Q- ffigure ;( ~/ X2 {& ^3 {4 E3 y, L$ L2 R
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
1 _; j. R! y$ b0 wlegend('网络输出客运量','实际客运量');. s# K; \) P8 u" ?, X! |
xlabel('年份');ylabel('客运量/万人');
9 C! N+ [+ o% f# _subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
' \, p% j! }4 F1 R( e7 Clegend('网络输出货运量','实际货运量');3 }* \ x& l! W$ F- b
xlabel('年份');ylabel('货运量/万吨');
, D# E" b- Z% b, |使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示4 Q+ L9 L# c3 v' I; B7 G v
( E$ f: \3 v: _- w6 y6 ~
pnew=[73.39 75.551 _$ K; H- T3 @/ p0 L+ |% c) \
3.9635 4.0975" l' x1 @0 U2 Q
0.9880 1.0268]; %2010年和2011年的相关数据;! ~3 U/ [: y* U6 e% W3 C
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;& p& t- S0 u4 t1 C' N
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
- _# N7 e$ s, A, w9 yanewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果0 F k0 z: C1 P% ]9 |1 P3 F
%把网络预测得到的数据还原为原始的数量级;* ]; p8 k1 h6 R% y$ c* ]6 K1 @: L' E
anew=postmnmx(anewn,mint,maxt);
; r" Z o8 v0 u( j: _" Q( S# E
3 d9 K9 u; S; Q0 @* u$ ?给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。- G0 r4 M' K9 T( B* s; A# I" M
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
6 L+ W1 P& E, G/ @+ E& Z' ]- T& s# d! n9 n" ^
对于代码将以附件形式给出$ N* I7 V; M: J7 v* Q2 `
+ o6 Z" C- |% I% d3 B
- A' i* }+ `1 C( ] m
! e$ R( u& n: t, m H |