|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。 " g+ ?: h& W. {# m2 `8 p
以下是bp神经网络的简单介绍:0 c9 x+ I/ J6 h3 ]4 B
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
, ?) _! ~& e: Q) Z
1 U6 h2 p5 e: S9 f: h% ? V以下是对给出的代码的详细解释:0 D1 B' S. [0 a& u0 [6 [ k- L' i
clc % 清屏
) b6 l4 a, E5 [( s; Bclear all; %清除内存以便加快运算速度7 K/ a' r: h, R# x+ f! V( [
close all; %关闭当前所有figure图像
1 p% g0 w$ I0 m9 \1 b这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。+ e0 W* C& G6 q- P9 w+ M
1 H" `0 D$ s7 e' x$ }
# [" b, x9 d, aSamNum=20; %输入样本数量为20
5 y# H1 L" `3 A ~( J5 _TestSamNum=20; %测试样本数量也是20
+ d; l4 z. e3 k8 v- \5 cForcastSamNum=2; %预测样本数量为2
" f. Y2 l+ { e5 I+ d* ~HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个2 b2 {; ]2 S5 P: d8 c! D' w" o& ?2 ?
InDim=3; %网络输入维度为3" D5 Z7 R7 W7 T8 h+ a, E) H
OutDim=2; %网络输出维度为2
/ j0 a7 p! q! e. d& J( W. x' C定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。. {3 c! f1 C7 o
: G9 i: B W7 X* X
]6 y% @* F8 X/ D( A7 b! ]
%原始数据
" s0 F+ ?0 s8 x# \! ]7 Z( f%人数(单位:万人)
% z" }4 ^; h7 M: osqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
- G$ M, I5 R4 Q: Q/ \+ h4 o 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
6 W- Z j) l* `* b o- u7 f2 ^. h5 P) G' w%机动车数(单位:万辆). z. |& }+ k5 m" e/ _& 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...
- J9 l* s) g" u. K1 J 2.7 2.85 2.95 3.1];
$ B: S' d( R) E%公路面积(单位:万平方公里)
3 o0 }' h* S! U I4 b7 Fsqglmj=[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 ...
. m: S' ]9 N1 k- z1 T9 k/ F 0.56 0.59 0.59 0.67 0.69 0.79];7 X8 U- d1 S; s- }' q3 I `
%公路客运量(单位:万人)
& y& K' X% P: Oglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...$ }5 O4 e. c- t0 ^ W% |
22598 25107 33442 36836 40548 42927 43462];
6 K, L$ a$ T/ w: R%公路货运量(单位:万吨)
6 ?4 _! e9 c& N+ P3 I: R; gglhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...4 ?, W" W8 ]8 g6 T
13320 16762 18673 20724 20803 21804];
5 M/ S6 C1 H% Gp=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
5 s$ F! C% U' R% gt=[glkyl;glhyl]; %目标数据矩阵1 Z' T% ^; ?/ L& h" @# T
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化5 [2 b3 F2 A" I; N
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
' ]. m/ d3 F" s: z+ ^! o6 m/ H1 f1 N& _3 R) u& z7 z: p! E5 `# y2 W
" I0 l/ H. H* H/ M
rand('state',sum(100*clock)) %依据系统时钟种子产生随机数
: i: y% P# y5 YNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
% a% j( {" e% s# b. ~Noise=NoiseVar*randn(2,SamNum); %生成噪声+ s' {* _) o1 K* a( F
SamOut=tn + Noise; %将噪声添加到输出样本上
- o+ W: t: m- S设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。! @9 W+ f( Y1 d+ Z" D7 ?+ n
8 ~( }2 a% t0 j) ?* M6 i! O/ G5 O9 [( L# _" F4 u5 w2 b0 V
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
4 E4 i/ f [* v& A; d t1 Q( E/ |TestSamOut=SamOut; %也取输出样本与测试样本相同
6 G3 k$ C& B' Y/ O将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
" v3 `2 A* W) z/ k( t) Z4 ~: Z2 a' g6 u% L O2 P8 N3 X
' J1 Z& ]1 Z& n B- ~
MaxEpochs=50000; %最多训练次数为50000" p: P4 L7 ?& @6 t
lr=0.035; %学习速率为0.035
2 {& Y) L% O; E* SE0=0.65*10^(-3); %目标误差为0.65*10^(-3)
3 S. z- f+ w" a! v4 ]2 G' Y) hW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
" T% v& t" }1 p9 l, f2 ?/ H" q9 {4 vB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值% h7 v' d' ~; y, Y- I
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 8 }$ x S7 R' ?% q; }0 J
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
$ z' ~# b$ O a" f定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。" q# ]% \' f8 v% I% R
: m8 z3 N: O2 L1 Y; q' s; Q
" [* L# f, i" F8 a3 t
ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存
/ F2 |; [% A% c$ e2 ]for i=1:MaxEpochs6 r* m. o- H: ~9 S5 c0 m; p
, U' M1 o' s& I" N HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
, h a' j' W- \1 L# A NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
+ t' A) x/ c5 t% x! w( M9 K; k+ c Error=SamOut-NetworkOut; % 实际输出与网络输出之差) u. C8 E) F2 n! q
SSE=sumsqr(Error); %能量函数(误差平方和)3 n# E7 G+ J% i, Q- H Y
ErrHistory(i)=SSE;6 C* G3 K3 N6 \0 o M
& n3 \" w* L8 {" f3 C2 E if SSE<E0,break, end %如果达到误差要求则跳出学习循环
3 o# `8 e5 Q$ s* T' r3 b
/ ~. n I! E8 ?# P; t1 X- a % 以下六行是BP网络最核心的程序: y0 a1 ?/ W6 C; Z* j
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量5 I) D% c3 G8 o( _3 L: y
Delta2=Error; Q# j" N9 ]% S& r; ^0 `9 F, V
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
$ ?5 [+ B1 L" V8 s$ ~5 j) G, f$ f& a
% `/ h3 [3 F5 W/ @9 y; l5 n dW2=Delta2*HiddenOut';
$ ?* O2 N5 x$ i. u4 _" o# P" g7 G dB2=Delta2*ones(SamNum,1);2 r$ K' V; a5 M! U( a: U) |6 s' t n
# o; K( C- a- j( j6 i dW1=Delta1*SamIn';
3 l' m/ m8 @- S0 d dB1=Delta1*ones(SamNum,1);
, j: T5 i! }2 J% |2 R' \ %对输出层与隐含层之间的权值和阈值进行修正
- a& e& z5 I) m* p' U1 k W2=W2+lr*dW2;
" z" l3 q( f7 B+ ^# J. j, e8 u3 ~ B2=B2+lr*dB2;
( ]) m/ E9 s# p2 |4 J %对输入层与隐含层之间的权值和阈值进行修正0 T; Z1 s& A% X# d+ C
W1=W1+lr*dW1;
4 L% w: m8 Z7 N Y ]+ c4 a B1=B1+lr*dB1;# U% e. q* h2 f; F8 e
end
6 F) @+ }0 w \使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。* T* `4 l& d& G; T" p0 q
4 v5 {( }7 v% \
* V) Y6 v- K$ U) z k
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果/ p0 u& o9 _& i. |9 Z2 f" f
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果( n6 [! F8 C. E- O
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
+ M: ~0 C b9 N- B5 K4 l- \x=1990:2009; % 时间轴刻度
+ P' j& d8 q N; i2 Q, snewk=a(1, ; % 网络输出客运量
5 o( u8 e' D: anewh=a(2, ; % 网络输出货运量' q5 j% W& n! b8 m4 K# s
figure ;1 u: Y/ z1 y6 Z
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
9 \9 w2 W3 v3 O w7 N7 u4 `legend('网络输出客运量','实际客运量');9 ^ }7 ^: v( P
xlabel('年份');ylabel('客运量/万人');2 f; ^7 w( w: ^
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
! }& _/ e7 j5 C7 u1 rlegend('网络输出货运量','实际货运量');
~, B7 B6 ?2 _1 |: `$ w0 Xxlabel('年份');ylabel('货运量/万吨');; D9 w7 v% e5 j& K
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
( g. B( L7 G: g- @* l, s9 h! B* ?/ F v t2 i
pnew=[73.39 75.55
- K% Z* F$ Y: x9 { 3.9635 4.09752 c1 @+ p$ I# q Y- i/ Q0 T" i3 p
0.9880 1.0268]; %2010年和2011年的相关数据;: E0 n( x# Y) q. n- u0 r3 g
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
g* d& ^7 @4 a* `- SHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
$ L( P, l" C& {% g1 N) Ranewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
$ n+ _. _7 i8 C4 T7 w4 U/ X9 }%把网络预测得到的数据还原为原始的数量级;' L5 q8 F$ y3 l+ N
anew=postmnmx(anewn,mint,maxt);
9 Z. E' S6 f6 N; R' |$ @5 V& @# a4 h3 C% c8 R! j5 z
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。0 q. A3 l$ B8 p' q |9 [2 ]! w/ a
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。, G( D' j) c: E4 h6 E3 s$ i
; q) U( l7 W1 E, W0 y4 ~7 Y; a对于代码将以附件形式给出
" k. x! {6 }, c( Q+ _ `( L4 s' @+ Q# d4 {( ^9 u! T
- ^+ b4 j7 ]" t2 e/ B: X2 S
4 V, _0 A. o, S' r- Z. }; }5 N |