|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
' ]2 L, ]) e6 K6 u0 j以下是bp神经网络的简单介绍:, g) h6 ~/ a Q; w$ z |
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
( Q( l$ [$ i: y R/ B) `8 G
* N4 J' h4 b6 Q以下是对给出的代码的详细解释:
# T, I4 h( g( T Q. iclc % 清屏
" g `* {8 z1 C7 C W2 x# `clear all; %清除内存以便加快运算速度
) I) {& ~3 ]: ?! g5 c, iclose all; %关闭当前所有figure图像
+ v$ t% P0 Z$ }/ z% l' O这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。$ D; ?9 D6 t: I& A# c
2 m) \9 {% T; J, w* c+ ?
/ W3 D# x. m: n6 XSamNum=20; %输入样本数量为20
X& ^' B9 J1 b9 g5 b K1 ETestSamNum=20; %测试样本数量也是20& r, }# r5 B, y( M, u" {7 P& [6 t3 V
ForcastSamNum=2; %预测样本数量为2) L, n5 Y9 v$ H- I$ c
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
' T0 l% L$ r" Z5 @1 H/ Y' K- H- tInDim=3; %网络输入维度为3, `0 R3 s; ?& J5 d2 Q0 o
OutDim=2; %网络输出维度为2
9 V/ I: w" S- H" f) M6 i定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
5 k- W9 E, f; \5 T
( h& |2 I+ ]/ Z# s% p; x* D$ u
* G: b5 A. t; B- }%原始数据 8 g; U3 ]; r G. f
%人数(单位:万人)
5 M0 |9 r4 c X4 `. I+ c8 \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 ..., A) v. E9 i) X6 {; r
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
* J* ]0 ~' G$ z3 V, }! z( n; n' a%机动车数(单位:万辆)" |9 n. U2 g# u8 c8 v
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...
. J; \- R7 I7 L! I 2.7 2.85 2.95 3.1];
4 O$ a# W$ |* _! `0 T$ H4 t) i%公路面积(单位:万平方公里) y2 a5 d6 r# V% @
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 ... * T% k# s! N# J$ b. Y8 N1 {( |
0.56 0.59 0.59 0.67 0.69 0.79];
9 I& o9 ^4 M+ X3 W! ~6 L! B%公路客运量(单位:万人)
: [: W; ^2 S1 h9 M/ Eglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
I0 D8 R- E$ ]& q6 T 22598 25107 33442 36836 40548 42927 43462];
7 j# h8 H2 Y) @$ R w: D%公路货运量(单位:万吨)
$ Y6 s z h5 |2 L! F9 E8 Yglhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
* d; ]$ G$ f6 y$ c1 t 13320 16762 18673 20724 20803 21804];
! r i- B' ~* P8 zp=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵% C: n3 f# a4 ]' f/ _
t=[glkyl;glhyl]; %目标数据矩阵
P2 u7 H) S- `" _! M$ {6 P[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化& J0 i& w/ j% t S
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
- b+ r( Q1 N$ {$ V8 Y' k' K. i3 F
5 ^! {( g9 g6 ?5 _
rand('state',sum(100*clock)) %依据系统时钟种子产生随机数 " c( I8 w) E3 b; F0 m* z3 y
NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)( n- ?$ o$ s8 {# Z# ?
Noise=NoiseVar*randn(2,SamNum); %生成噪声% h. o! b6 p% y! g
SamOut=tn + Noise; %将噪声添加到输出样本上
/ R* T# _2 B! d8 S' D设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。, ^+ ^2 W. i3 {0 I$ s8 L6 Z; C
5 |+ h9 v. b* U
; D7 Y+ T& G' Z2 z9 _% MTestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
' T6 a' `( L6 p7 FTestSamOut=SamOut; %也取输出样本与测试样本相同0 Q4 m% _9 n* j1 `' w/ U
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
_% y1 l) K; l, x# G: Q- u% M# Z2 Q
! q4 f7 [% N9 \( b# z" I V! y: o& q( s8 N! c
MaxEpochs=50000; %最多训练次数为50000
9 l* S- `9 d2 |+ q; }$ m& Z# N( ]lr=0.035; %学习速率为0.0351 k- Z# B, I; q( u# S
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)
2 e& @$ r- K/ E4 nW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
/ x( [" }3 |7 z E' w8 X/ EB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
. Y; d, t- G9 [! UW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
G( q6 N0 h' x: aB2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
1 e4 }5 L! r8 E; P2 H定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
& _$ L7 K. U, u! O: J _8 l. \ Y8 l z# z
6 D5 I$ l3 M) E* R. UErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存 R6 m* f0 `- G8 s( s: _, j6 v
for i=1:MaxEpochs! b( D# g, V3 Z A
4 ]/ r) e2 r" p. |# a" [
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
/ G6 k+ R: A3 h* h) x' i NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
2 K& m& N1 s# R- ]. \6 P Error=SamOut-NetworkOut; % 实际输出与网络输出之差/ k( Y# R/ z8 ^. X/ s
SSE=sumsqr(Error); %能量函数(误差平方和)
0 r3 h% O' I% ^8 T ErrHistory(i)=SSE;; @ P- Z: s) e6 ^, d* K' |3 q
7 v! C. t6 t: V. f1 c
if SSE<E0,break, end %如果达到误差要求则跳出学习循环8 I9 w) _% |( }
5 s H3 D! h4 ]; N % 以下六行是BP网络最核心的程序
0 d, Z0 G0 L3 ^ % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量* H: p; K' O1 p; a2 x1 b
Delta2=Error;
I d: C4 R9 C- J# O" Z; a Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); 9 ?/ P4 X$ A8 c$ X& ]6 @( O( G
, @/ p. @% n F0 {
dW2=Delta2*HiddenOut';
. P& L+ M+ t$ ^ dB2=Delta2*ones(SamNum,1);* [" z, U" P: f" m
# ~+ w! C5 `4 o; T5 K, I dW1=Delta1*SamIn';8 l8 ]! v5 A" r$ U4 V" P9 j0 N/ O
dB1=Delta1*ones(SamNum,1);
5 c( K+ Q- ~' q0 R6 U k N% G" e %对输出层与隐含层之间的权值和阈值进行修正9 e6 y2 y( T' U& A U
W2=W2+lr*dW2;0 `/ g$ c! Y- o
B2=B2+lr*dB2;
- h7 t$ y) D( [1 b %对输入层与隐含层之间的权值和阈值进行修正# p8 E, E7 {) P5 M% c
W1=W1+lr*dW1;
( I/ W/ q$ S5 }1 u B1=B1+lr*dB1;
) W4 T* _6 A: r3 Tend
% [: W/ _5 T) ]/ F+ x使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。. L& r; W1 m: H" ^% `- j
5 k, R' b. C8 K
) b9 v0 N" Y% a8 X5 g0 Y; KHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
6 d$ B* P0 K. {6 I8 v' _NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果9 V$ w) v9 N9 Q6 O, U4 X
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果" k2 O4 u/ P: A4 [8 S# y
x=1990:2009; % 时间轴刻度$ D5 V y( p% L2 Q9 U
newk=a(1, ; % 网络输出客运量
8 h& s; {' Z, @) bnewh=a(2, ; % 网络输出货运量% t4 h9 i1 T$ a7 O' M
figure ;" `9 V3 \ c. |2 }; c0 X
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
+ y0 [% C/ W/ j9 Z _: S$ g0 Rlegend('网络输出客运量','实际客运量');
5 Y. P! e! n6 V& K# ]xlabel('年份');ylabel('客运量/万人');
2 u0 Z, x9 P# k, ^) p) [subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
: U/ z/ S2 I# y% ~+ qlegend('网络输出货运量','实际货运量');* h' ^3 W* f( L5 ]% b& j
xlabel('年份');ylabel('货运量/万吨');
( P0 b2 m; @6 K7 W: r使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
7 r4 I' ?; j& \/ O- L5 x- W; Z2 C
* E+ v$ z+ ^7 ?. Y. x/ ~pnew=[73.39 75.55" u# z' C! { ~6 T+ N+ o
3.9635 4.0975
" J4 I4 S9 R- B! p, _ 0.9880 1.0268]; %2010年和2011年的相关数据;3 g# t+ G& [7 ~" q$ }0 s# ]
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
3 g, ^. p2 }9 r' ?% j, U* OHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
2 V) g1 e2 _8 [1 x7 _9 N9 E% V; ranewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
/ f( t. S0 Y. Y. H# }3 B; C3 V%把网络预测得到的数据还原为原始的数量级;: L4 W5 n4 m9 f5 h4 E
anew=postmnmx(anewn,mint,maxt);, _. R6 ]$ t2 Z) I
* U/ }/ }* g g" Q
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
A6 P* n& K M# |! J. L该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。 R8 `! x' s- B/ S5 j5 O. c' A
$ b" ] ]# i# E' W1 s: g对于代码将以附件形式给出$ |. T5 C& S; q$ f
( H7 c5 z f9 {% w% y& d k( w3 M: \. N8 u& P9 Y, _
( A5 n5 _- x- G0 l! k, V
|