在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。 / ]9 \+ n+ Q5 \; L# O
以下是bp神经网络的简单介绍:
- r& c" t* p- o5 r; u# tBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 # ?1 ]7 q6 l' |5 }: [
1 h! M6 B" T" h+ o8 c
以下是对给出的代码的详细解释:9 s& a, L# x+ V2 q$ P8 e q
clc % 清屏
" {+ j3 X* g3 Y! t' |9 Y. P4 B2 V: W/ `clear all; %清除内存以便加快运算速度
z8 H; P1 y, e mclose all; %关闭当前所有figure图像$ i6 V1 ?* G/ m- a3 N7 B0 l
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
$ i+ | l6 {" ~9 P* _
; U, V, d: S. L6 E1 P
+ s% T0 t! P; h* ]SamNum=20; %输入样本数量为20
. n3 o7 v8 g" m8 T! `1 ETestSamNum=20; %测试样本数量也是20
3 k' ?: Q2 T, c2 {0 rForcastSamNum=2; %预测样本数量为2
% a& i# b& u/ c4 vHiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
* t: ]. s* y& i, _/ \3 {InDim=3; %网络输入维度为3
6 ~9 o' Y+ s2 q _# m3 rOutDim=2; %网络输出维度为2& f2 @, c- ~, Y% f: ~, m) j
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。- w! C8 p4 _8 ?7 X) h5 K0 ~2 r
* K( B, K, G: C2 A
0 G$ O5 Q, C) `! u: v% r2 `%原始数据 ) o6 s& c2 L% ~$ s5 ^
%人数(单位:万人)( u5 _, }& h5 ?3 Y
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 ...0 W F9 ~: B# ?! q7 W; C4 {0 {
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
c! a6 T. h1 v- H( q%机动车数(单位:万辆)7 v2 S/ M9 s. F- a% z/ S' b' `
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/ d% X. `0 s2 s
2.7 2.85 2.95 3.1];0 I5 @5 [2 u/ O9 S( w2 R/ i
%公路面积(单位:万平方公里)) h/ r: i% D K+ L5 h8 n
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 ... 8 r3 H& `' o; E% M+ ~
0.56 0.59 0.59 0.67 0.69 0.79];
" \0 I. {5 n: I4 l0 _ s) p! g) v8 x%公路客运量(单位:万人)
1 n1 N/ U' a$ p* cglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 .... L8 v0 p: n: i& h
22598 25107 33442 36836 40548 42927 43462];' Q3 ~$ Z8 D. E
%公路货运量(单位:万吨)
3 ]9 g$ i+ c+ b- [glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...4 ^+ v" y% b; k2 c3 A T- m
13320 16762 18673 20724 20803 21804];
7 v4 u/ | m6 P3 \/ Jp=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
5 ~1 c, i# `2 t! Pt=[glkyl;glhyl]; %目标数据矩阵2 \6 j3 ]7 M) h3 s! V
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化
4 v/ x6 |; c. C5 j" ~; q给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
' U/ F% U- X# B6 C, f3 e3 \- u7 t$ {; d
# Z. o( J: K/ D8 prand('state',sum(100*clock)) %依据系统时钟种子产生随机数
- v2 T5 T' O/ @& p" [. wNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)5 l& V9 g% ]$ v& O# w2 P! T+ D+ Q
Noise=NoiseVar*randn(2,SamNum); %生成噪声
3 E2 u; }: z2 I) lSamOut=tn + Noise; %将噪声添加到输出样本上
+ h8 o1 c( o1 h: |- a2 ?设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
" J7 N1 v! x7 y. V- G' D) `5 n3 t4 p# z9 `; U
7 x% e# z: a) V- t) ?
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
! m# U1 I0 L3 s6 FTestSamOut=SamOut; %也取输出样本与测试样本相同7 g w z+ l/ i+ g0 m7 C* c
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
; |% h! \( q( Q6 } V5 K+ o9 R V- B: P# N" d- ]; \0 J
7 ~: _- e, o5 A) H% N' Z2 D
MaxEpochs=50000; %最多训练次数为500001 B( D1 I2 @$ P$ w$ C3 n# T5 K
lr=0.035; %学习速率为0.035; P( \5 `4 l! R9 v% b6 v$ Z
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)
7 S3 P% W5 W; F5 }% \+ {$ vW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
9 c; l. y, T2 D7 v; m$ _B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
5 _9 j. ^: P/ mW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 2 v( l, H% p7 K4 m$ o
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值1 X4 h* M( p- [# j& C. X; T n! t
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
0 m9 R9 V: L4 F( Y: R1 z6 ~" ] G! j6 L: x( l. _2 U
5 k& T3 I& B/ _% T) O' J3 {% eErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存8 Z, M2 p+ s/ r8 l6 V/ ]% Y
for i=1:MaxEpochs& ^- x0 b9 [! h* \9 |
: e/ }% ^4 t# l: d2 W; k* c& g- M HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
9 D" \2 ?4 j( Q# N; [6 r* V1 y NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
- |, m' M# T9 X# Z8 u8 G9 r- } Error=SamOut-NetworkOut; % 实际输出与网络输出之差% g+ r0 x3 l" I' j5 Z# e( E$ O
SSE=sumsqr(Error); %能量函数(误差平方和)
( N7 \# F8 C5 Q: ~- r# j ErrHistory(i)=SSE;
# i# j/ f5 {7 Y/ s% T# n* e% y. }( h/ n
$ a2 F, ]$ b2 D `& C$ a if SSE<E0,break, end %如果达到误差要求则跳出学习循环
/ e$ d1 z# P& n
) r/ d6 W% ]' a3 E % 以下六行是BP网络最核心的程序
6 t5 E+ J6 ?2 l( O0 [ % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量( @) c, [! Z" {
Delta2=Error;
* M6 a2 Z9 @) Z! t, I Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); ; q2 ^. T+ d. Y0 Q5 |) S L) Z
+ t3 ~) H9 Z& S2 [
dW2=Delta2*HiddenOut';
3 s* J5 m% x$ n% I dB2=Delta2*ones(SamNum,1);
+ Z% S8 j. ]# @" K4 n
( q+ R$ y7 u: a dW1=Delta1*SamIn';
( J# Y, e# n$ ]7 g8 k2 d8 j dB1=Delta1*ones(SamNum,1);+ Q5 Q( F. D0 E0 C: P9 d$ r/ N- |
%对输出层与隐含层之间的权值和阈值进行修正
! r( C# y" t1 {1 n1 A1 _ W2=W2+lr*dW2;
0 v* p2 {, Z+ o, D B2=B2+lr*dB2;2 z% O2 x6 S A7 N `" D; R
%对输入层与隐含层之间的权值和阈值进行修正+ P- ]6 V. ~" v3 a7 w0 z( z
W1=W1+lr*dW1;0 O9 L- _! H( O( M8 u- [
B1=B1+lr*dB1;% p8 ~8 A$ ]" R2 l9 C# b {
end5 h) R) V" |. Q1 i8 B$ t
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
- v4 u5 m8 K) E& a8 V4 k; C6 `, k1 I6 d0 n' a& ]
2 g1 ^% [0 N L* x$ F$ vHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果3 a5 V; p9 Y: [& I4 V; I
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果+ e- K% w I5 [0 ?6 z- @* M; ~0 a
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果8 P: i# y. g9 _' n: i9 j% h
x=1990:2009; % 时间轴刻度
) T- V: I5 \& B" Hnewk=a(1, ; % 网络输出客运量
2 r! p$ z9 {: G! O* G0 }newh=a(2, ; % 网络输出货运量
! z: o% r4 Q' D* u$ \figure ;/ v- `) ]) u2 z. @$ J
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
U2 a* W. Y# v! a' L1 g5 J4 \$ Plegend('网络输出客运量','实际客运量');+ K1 w4 k3 Z- c& y% }% m
xlabel('年份');ylabel('客运量/万人');% A Y; L: @: n" O' k# O' r
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;6 }5 D; q* {9 ]- M+ ^
legend('网络输出货运量','实际货运量');
( i l: E8 K9 kxlabel('年份');ylabel('货运量/万吨');
* }3 _' R3 a% k/ ]8 T6 s使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
) H' Y9 O# m7 t
/ G9 {0 n" T7 ~+ wpnew=[73.39 75.55 W; D3 I: a$ Q. @9 j& T; h# t
3.9635 4.0975# F% P7 y: _/ ~ r+ C* k) r
0.9880 1.0268]; %2010年和2011年的相关数据;
' l3 S! j- M1 ?" s+ Hpnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;. Y6 K$ |# Z( q' ~' l* T/ l
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果! K# J" ~' Z: r1 k3 w; Q; @! w2 j" H: v
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
/ i1 e9 ]' c g5 `( z%把网络预测得到的数据还原为原始的数量级;
( H) T1 l) |) q. Q. [0 panew=postmnmx(anewn,mint,maxt);
2 ?+ d+ @" M5 Q6 h
3 W* c/ y+ G: n: N) z2 G% l给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
& o2 G4 \* v) z# |! T8 a该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
, E; {3 ?# S" X% u7 d. x k! p- n( J& c
- d0 y0 `) L7 I5 G对于代码将以附件形式给出. `" L! V' k" C. q
& b. b" P; E4 I( x, q
p2 Y; I5 @+ F) W
3 L- B; I1 f& K( q9 ~
|