数学建模社区-数学中国
标题: BP神经网络进行数据预测(matlab版) [打印本页]
作者: 2744557306 时间: 2023-8-19 15:20
标题: BP神经网络进行数据预测(matlab版)
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。
通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
% e* t( N, P/ y6 o9 I* [以下是bp神经网络的简单介绍:
* h$ M& ]# j7 o3 N1 z2 Z1 X9 k6 BBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。
BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。
BP神经网络的学习分为两个过程:前向传播和反向传播。
前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。
反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。
在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。
BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
* R9 t4 o- n" p& [/ {( s
9 A1 P; c6 [9 \+ x+ Z
以下是对给出的代码的详细解释:" l+ T0 V0 | h$ m
clc % 清屏
7 v }/ P2 E( J8 f; xclear all; %清除内存以便加快运算速度
; @8 o5 c4 b* Y/ gclose all; %关闭当前所有figure图像: z4 A. k2 p1 T1 v
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。2 g0 [1 ~7 P3 D/ [
6 j8 z3 u! P8 ]' M6 x0 x+ @1 s& V* `
SamNum=20; %输入样本数量为208 c4 x% G8 {* r: T* |5 e9 v. d @: b
TestSamNum=20; %测试样本数量也是20
$ Z& T# p7 c- Z% Q6 EForcastSamNum=2; %预测样本数量为2' } W/ R/ n, n
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
Z0 J% p" V, ?' BInDim=3; %网络输入维度为3! A4 ~7 G+ s; I- Y% ~; ^0 |4 P
OutDim=2; %网络输出维度为2
- v/ w2 |4 I5 r. \4 ~' B b定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。6 s2 u' y$ M7 D
# H4 r' F) G2 Q. @( V
& g" z' w5 r5 F. E3 K6 e: A& u%原始数据
3 x7 U/ p0 _! ?8 f+ |%人数(单位:万人)
6 m, K3 J5 T0 B) w+ c7 gsqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...1 r8 o% s* S0 c- H( P0 A/ p& q
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];7 Y" N. P$ C1 C- u; k( _
%机动车数(单位:万辆)
5 @9 ^1 B$ W/ E7 I" @9 Zsqjdcs=[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...
6 z% Q; {5 E& H6 f3 p 2.7 2.85 2.95 3.1];
- q/ @/ l! ^# r6 e: @* X% L%公路面积(单位:万平方公里)1 B+ i8 ^2 U6 f, }9 U4 w
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 ... 1 ]7 r7 v' G' e9 D, q5 f& l
0.56 0.59 0.59 0.67 0.69 0.79];
: o8 x" l2 Y, n7 [ M. i9 T) b%公路客运量(单位:万人)0 Z1 Z* s! }) Z6 {) h* |
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...
W3 d3 E0 p' k; f 22598 25107 33442 36836 40548 42927 43462];
7 c+ G0 `5 c* t" s7 n6 ~& }%公路货运量(单位:万吨)% x; w8 {4 t! ~/ [" l- E3 n! N6 ]
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
6 w& z0 s# p$ `2 }3 F# J 13320 16762 18673 20724 20803 21804];
, W7 T Q! W T: b* s7 s/ [8 dp=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
# o# b6 y+ |' H6 i# }1 Yt=[glkyl;glhyl]; %目标数据矩阵/ P6 X# F% G4 j2 g: e9 M& l! _
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化 b- p1 f+ f. Z) }! u- D
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。# B% g: q( D3 R+ r/ Q: z
3 ?. s+ A, h% R9 b2 n4 z ]
; O% D2 x8 q8 m! r! Y3 d+ srand('state',sum(100*clock)) %依据系统时钟种子产生随机数 ! X4 ]& w( j' C& g# n N$ B
NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
: K& G3 `% r& q/ CNoise=NoiseVar*randn(2,SamNum); %生成噪声) d# G* x4 o2 x. S$ W$ u
SamOut=tn + Noise; %将噪声添加到输出样本上
2 A* h9 n6 ]" d! N8 {设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
& h; t, p" _5 |) d2 W5 Z, K& Q8 ` ?0 Q# X
3 x2 Q* J& _9 \, [) E, ]
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少* {9 a- x. j9 R1 C5 u
TestSamOut=SamOut; %也取输出样本与测试样本相同
: j1 s3 G% U4 ^, s f' {: N; ^将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
" M! ]3 W* M6 O' v5 o6 i z8 S& p4 M
/ R: d+ _6 u( z! I1 w
! q' B$ j( k( y& l8 L; aMaxEpochs=50000; %最多训练次数为500002 E) Q- r( a) C
lr=0.035; %学习速率为0.035! K8 I' J" G' K7 i
E0=0.65*10^(-3); %目标误差为0.65*10^(-3)
- D3 |9 l/ n" d, h# r7 AW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
4 K" a$ [5 q# jB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值
/ u1 Z* Y/ n4 C) J! jW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 " A6 T* a3 N- b, Y: \$ D$ ? q
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值0 m" S4 Z: ?2 P7 L
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
% V) J: e2 s/ {8 T9 o$ O/ \# h$ M+ x! X) U
/ }% j( o+ E. @9 R; L5 K
ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存
4 X/ w9 b& n& D) C6 l" b3 Qfor i=1:MaxEpochs
& ~" p. G' R |4 [0 N0 L- U4 y9 B+ X1 ?, ?* ~) J
HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出& C; _* q' ]' Y# C$ }& s
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出; r( r+ {6 U/ b" `; e& q
Error=SamOut-NetworkOut; % 实际输出与网络输出之差9 Y6 l) n0 G; {$ n, x
SSE=sumsqr(Error); %能量函数(误差平方和)! Z6 ~3 K# T j' A- ?; P
ErrHistory(i)=SSE;# K8 d* I1 B' P1 Y6 j
8 l+ a( c$ |3 W. G& w4 E q# o if SSE<E0,break, end %如果达到误差要求则跳出学习循环
; `3 q8 o0 d0 y( v$ b
' F* D; H: [* g; v9 A. g % 以下六行是BP网络最核心的程序4 B) `, T$ v! V. O( P) l: h+ k
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
% V) D+ ^. D( ~ d8 P( A% O3 V Delta2=Error;
: f6 Z. C# B8 q" _6 S Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
4 a8 t' R& g" S& {+ u" ^
# K) v9 c5 R( Z5 n1 ~6 m2 {; R dW2=Delta2*HiddenOut';
3 n/ T6 B3 `, s" v1 E+ H dB2=Delta2*ones(SamNum,1);6 v4 `( N0 m5 V' G9 K( l
: b; B0 y$ Y9 k! B5 Q' y7 E( D
dW1=Delta1*SamIn';
7 `1 _# ]7 I# c5 ^; }" @! Y dB1=Delta1*ones(SamNum,1);; g; E' m/ L2 _2 [
%对输出层与隐含层之间的权值和阈值进行修正3 q! { `8 r. ^. k' t" E, b2 T" R
W2=W2+lr*dW2;' [; W% o6 f) Q# ]* s% {$ `
B2=B2+lr*dB2;
h- ?' T- H1 e %对输入层与隐含层之间的权值和阈值进行修正. d" j6 o# z- W! f9 \
W1=W1+lr*dW1;
3 C$ u7 d+ w$ ~6 X' w. `8 |; e B1=B1+lr*dB1;0 ]6 U, ~+ `1 t8 f& @$ w
end# a! x" _8 I2 F+ Y; u, @) ~" W: K! B2 c
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。# m' c) B" Z2 u) P
$ b; O4 h% i) F: U( k
! S$ |5 O2 T+ N W0 w7 J( W; SHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果7 Z5 O+ r- x; j: W/ A: `
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
$ R+ Y, {3 ^* v! l8 N$ J3 @6 [5 j$ ~a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
$ p8 k0 g5 G# e* J7 b# B# d6 Y( Lx=1990:2009; % 时间轴刻度
9 v5 e/ d2 E3 \! ynewk=a(1,
; % 网络输出客运量
6 f- @9 s5 d0 R, M* }# Znewh=a(2,
; % 网络输出货运量3 t$ k0 q& h4 f# {
figure ;
4 _& ^9 H" Z3 x- [6 bsubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;) t5 z/ h3 l. Y% S
legend('网络输出客运量','实际客运量');
, ~0 N5 P$ u! h0 X9 uxlabel('年份');ylabel('客运量/万人');/ L1 z( V" B9 } }5 q- P# P$ n
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;) B5 } I7 `& P8 x! z
legend('网络输出货运量','实际货运量');
" D/ d; W6 t3 R& x1 G0 d4 kxlabel('年份');ylabel('货运量/万吨');
2 o1 u- S4 X6 [" r8 ^5 f' r- l# I使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
4 [2 E A7 s( x
6 c8 M( p( n( j4 vpnew=[73.39 75.558 Z3 b1 h- u- X0 u/ P
3.9635 4.0975
# g+ c' j; l% o8 [1 L& G 0.9880 1.0268]; %2010年和2011年的相关数据;# D+ S, `& f& I
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;% w7 y+ h/ `( R
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果' B& _1 x, z, g3 d
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
9 [" z/ V+ x: V6 a* C, w( S# s2 s%把网络预测得到的数据还原为原始的数量级;
1 \0 b( T7 x. Q3 C, o; Z7 w: Danew=postmnmx(anewn,mint,maxt);
4 Z5 u3 i( z3 ]# F* R4 L+ T& N0 O) j/ a1 s$ {
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。5 o$ A. i( r# c; i- v, q
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。5 t* c; M6 M8 M' \; W8 ?9 S& N% A4 Q
0 q3 i& _+ K" r# P; k
对于代码将以附件形式给出% g; N. M1 ?* }# g9 y- y1 q
1 O; [6 s; c& X0 K! d: J
/ H, D3 O q! F8 s
# W9 _" e5 u" U, m4 l
-
-
bp_theroy.rar
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |