数学建模社区-数学中国
标题: BP神经网络进行数据预测(matlab版) [打印本页]
作者: 2744557306 时间: 2023-8-19 15:20
标题: BP神经网络进行数据预测(matlab版)
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。
通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
7 n' v( W7 W, V5 p* C0 p
以下是bp神经网络的简单介绍:
- P1 h+ ]. j4 g2 j8 N- h" lBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。
BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。
BP神经网络的学习分为两个过程:前向传播和反向传播。
前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。
反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。
在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。
BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
5 n: R# {( R7 G1 ?- R+ ]4 Z$ Y, |" y Q2 I2 p
以下是对给出的代码的详细解释:, q$ D2 U0 k+ `- g7 T- O
clc % 清屏
$ R5 r; B( r. E7 m" b$ B" v# A( @clear all; %清除内存以便加快运算速度* w4 K9 d. C; b U1 u
close all; %关闭当前所有figure图像9 p* }) w4 I" ~) n5 l
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
4 Q: T' w2 B- k) y
3 m) K$ ]; x. R
7 u0 V: @' [" _: G! eSamNum=20; %输入样本数量为209 q _) l) a- H2 _4 g& |
TestSamNum=20; %测试样本数量也是20
6 ?6 e. p" x. l( e7 u, K. SForcastSamNum=2; %预测样本数量为2. C- ~7 Y/ i* k( S! ^& Z" k
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
# p" {4 u; Z8 l" ~3 S' P0 VInDim=3; %网络输入维度为3; R, Y" X- C9 ~. L* e4 m1 Z p
OutDim=2; %网络输出维度为2& j4 h8 [! l+ [0 R C( g
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。+ r% |6 d$ d C) i$ f. Q, O
8 i; ~% a! s9 U; j5 H( A/ j6 O$ A8 m" o. s+ ?" I. d* e0 X- Y6 Y
%原始数据 # \) n% Y1 @) \. `
%人数(单位:万人)
; s# K& a) u1 G* H/ I( l1 r/ E% Psqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
$ l1 e; g. Y2 y- ]3 ~4 r8 d 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63]; k' m. ~/ O! L
%机动车数(单位:万辆)
: Z3 k+ }# v0 x- \/ Vsqjdcs=[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...
9 x8 C+ @) z) R3 M1 j 2.7 2.85 2.95 3.1];
) D4 ?, |% e% V9 Z/ Y3 y6 h%公路面积(单位:万平方公里)
4 @% a6 W6 U8 G. v7 f0 Dsqglmj=[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 ... ! L, r0 T7 K# F( ^' I: @
0.56 0.59 0.59 0.67 0.69 0.79];% Z" f# i/ f! Q+ }) o1 B
%公路客运量(单位:万人)
6 J& v6 X" H- m$ bglkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...0 a' ^% f- o3 r8 e8 ~! u
22598 25107 33442 36836 40548 42927 43462];' q/ a$ b9 t+ O% y: s, X
%公路货运量(单位:万吨)+ y! \9 Z; j* E) x$ A( h
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...% _: m+ x8 r: w% l6 }/ w! D
13320 16762 18673 20724 20803 21804];
' g# [+ f. i% A% I; I* @p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
: x/ v; C2 y Z; c- S9 {6 H& ~t=[glkyl;glhyl]; %目标数据矩阵
( R' h" ~ X0 k9 A) u[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化& y3 |5 G2 E+ s5 v- N- t
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
* g m- y; F# ~/ R& S ]7 l( |
, ?5 X3 a2 ^! f% a( E
; [! R5 ?" A# F- E0 B; _rand('state',sum(100*clock)) %依据系统时钟种子产生随机数
; K1 Y8 c5 H/ |, g% w" Y& _/ U. pNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
2 P9 W3 H4 \# Z" ]% i Y3 fNoise=NoiseVar*randn(2,SamNum); %生成噪声- y4 ]1 k2 p3 S2 `# a3 [- W
SamOut=tn + Noise; %将噪声添加到输出样本上
2 z9 T+ x4 c/ v" Q R0 L; j设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
( D6 q! _) B& E- I7 C4 E X+ h/ B o. n8 p8 ~
: U3 w8 M; P6 W9 ATestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
3 V+ ?' P3 H2 x' wTestSamOut=SamOut; %也取输出样本与测试样本相同
- u, R2 g9 l6 Y' f$ K" R& P将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
1 ]8 R2 R# h- c: y* ^! Y! C/ n4 J( Z% B" S5 f0 a
4 U! `3 K+ T2 I+ v2 pMaxEpochs=50000; %最多训练次数为50000
* ~, c- s2 f" G4 Plr=0.035; %学习速率为0.035
2 \! I; [6 k) V% V, G, gE0=0.65*10^(-3); %目标误差为0.65*10^(-3)% ~+ u! {" E5 o; O' n( `% w, D
W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
2 r4 T+ L3 J9 z: `: wB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值9 ~5 ]; ^$ k, H* j, Q) [; p
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 ' C4 Z1 o2 q3 w6 T: I: B" Z
B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值" D5 {/ d3 r2 S, B
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
+ y7 I- U: O7 i1 m$ d! x. A9 k3 `* ^+ S/ f! o
7 H6 v. A& b# s( h2 G+ EErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存; x( f) z, V5 B% ]! y. s! l2 c
for i=1:MaxEpochs6 D% T5 u$ U3 ^) s i( m
" i- [( x+ N+ g1 p4 w! N HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
8 J0 Y0 g* G i4 ^ NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
3 Q4 T5 W0 N5 I, v Error=SamOut-NetworkOut; % 实际输出与网络输出之差' \+ ^1 P1 R5 C+ L1 c( W8 q6 T
SSE=sumsqr(Error); %能量函数(误差平方和)5 E9 r B/ S5 \ g
ErrHistory(i)=SSE;
- q0 J' V* n# I. |! e4 u( L
/ D5 ]4 m- T' A* i) y4 ] if SSE<E0,break, end %如果达到误差要求则跳出学习循环
: K6 H/ @0 k8 |& t1 ^
; _+ ] {" v/ \ % 以下六行是BP网络最核心的程序& E* M; E8 G4 E! C* i+ q
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
" s0 M4 Y7 b( ~ Delta2=Error;
3 {4 o" m+ `5 P Q6 u1 q( ~ Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); & ?# S# N2 R4 B3 u# L/ @. D% P
1 E: m2 D( y' U; b4 G! A: P
dW2=Delta2*HiddenOut';3 i: T. ^3 I3 n
dB2=Delta2*ones(SamNum,1);
7 R0 ^- R( L; m3 i. t2 N- H- E/ |8 O/ b, J$ f4 q) b1 v
dW1=Delta1*SamIn';2 T3 x. |, W: t; e6 r
dB1=Delta1*ones(SamNum,1);' Y: V# V! N u; g" f/ i+ ~& `8 R
%对输出层与隐含层之间的权值和阈值进行修正. K1 j& ~3 G' M4 W6 U1 n$ {0 C
W2=W2+lr*dW2;
' J F- `" b) ?. w& }3 v4 i B2=B2+lr*dB2;) q" R0 O' ?8 ?
%对输入层与隐含层之间的权值和阈值进行修正
5 k6 I% i( B3 f' a/ T W1=W1+lr*dW1;6 D, E1 G6 e# W2 l5 z
B1=B1+lr*dB1; N# |# L# S, ]4 I7 g7 w
end
. _' z6 P$ r/ s' Y9 ^7 g K使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
( @' d* _3 a1 b* d F: d2 H7 E
$ d, ?9 H$ ?( [7 r! X( \8 U. K$ q4 N3 v; ^9 U# }% X/ U" }! a: `7 R
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果. ~( w! v& `9 J$ K
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
" A9 O( r( D" o J9 Ta=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果& [7 [ ]* s9 A1 K
x=1990:2009; % 时间轴刻度
$ r6 ~7 g9 e2 T3 l6 }newk=a(1,
; % 网络输出客运量; G0 l! s* ?) b9 s3 g
newh=a(2,
; % 网络输出货运量
1 m& G' p) ]: }" Z/ x/ D& bfigure ;
( C% u- C( p, A1 x# lsubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;1 h `! W' x" I( N6 \ E- }' F* d
legend('网络输出客运量','实际客运量');+ o4 e( P" d1 d7 P- U5 {
xlabel('年份');ylabel('客运量/万人');
f8 U! ]5 F# [) k0 Psubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
) Q P0 d* F: E/ ylegend('网络输出货运量','实际货运量');# I9 M% U7 B5 V
xlabel('年份');ylabel('货运量/万吨');
: P, h0 N% E* S" j$ Y使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
& X6 d; U7 \( W- g. |& c; H0 D9 ?* k/ D' }) g' h& U
pnew=[73.39 75.55
( Q5 @, A/ ^/ P4 [! @ 3.9635 4.0975
8 q9 ]! \( s* z* X. z1 d' |7 k! I" S* Q 0.9880 1.0268]; %2010年和2011年的相关数据;8 F" @! e0 v2 K9 q) k( _/ k
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
4 }0 h2 P. W# t& }# ?HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果7 R( J) K3 x4 _! [3 i# C) U: S( ~. y
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
# |6 J7 Q! @6 {' X' ]( N2 B' O%把网络预测得到的数据还原为原始的数量级;; a" l7 y, V$ f& W( z
anew=postmnmx(anewn,mint,maxt);
) d! I M( e' R& b: F5 x, G. m% s/ h7 k/ r5 z% L* o1 |
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
$ c1 y, o& P5 q) o) p7 \2 X5 `该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。3 ]) ?3 z0 v7 z9 O$ y9 Y
6 K5 k( D* R* A6 u" x对于代码将以附件形式给出
# l* B& j5 t: p. U% R5 L0 M3 M( V* ?! i$ Q# r% S
" c. {" h$ H9 T- ^4 d
$ F, v8 R/ F$ A- }6 N1 v6 G
-
-
bp_theroy.rar
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |