数学建模社区-数学中国
标题: BP神经网络进行数据预测(matlab版) [打印本页]
作者: 2744557306 时间: 2023-8-19 15:20
标题: BP神经网络进行数据预测(matlab版)
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。
通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
' j, ?9 C% g8 u3 ?7 e以下是bp神经网络的简单介绍:
) Q E. @/ `/ j; k0 LBP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。
BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。
BP神经网络的学习分为两个过程:前向传播和反向传播。
前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。
反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。
在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。
BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
9 z" w6 z8 l( q- @0 Q
0 t; Q! K% F$ _8 {以下是对给出的代码的详细解释:7 I. _- j0 n" M1 {4 Y2 ~
clc % 清屏, ]; |. J: b5 e9 L9 f+ z
clear all; %清除内存以便加快运算速度. k! C7 s: `; i- E+ r5 G
close all; %关闭当前所有figure图像% Y- R$ ~* Q- ~& S& ?- P' a Y
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
: ]- \& [6 K. N9 B* ?
5 Q x4 K" T6 G" m. g: U8 u1 f3 o. G* w; z) F( v$ p4 Y2 v! @' F; g
SamNum=20; %输入样本数量为20& f% e7 @2 x' S- x. R
TestSamNum=20; %测试样本数量也是20
: U9 y+ V! m" K0 Y) Z, Z pForcastSamNum=2; %预测样本数量为25 f8 l* ]' S0 \, u8 w
HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个: z! \1 Y/ h9 q6 R
InDim=3; %网络输入维度为30 H5 l3 C4 p5 L6 ^
OutDim=2; %网络输出维度为24 J- s, G4 n" o( N
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
* P3 }8 W& | @" [0 ~
* b5 j2 f( M: {
; x4 F4 Q4 D; U2 F+ ?/ A( t%原始数据 ) K n4 T7 p0 P. H7 X+ p
%人数(单位:万人)8 r) D6 k+ z# l% o
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 ...4 g( z2 l. j: X
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
1 p3 y5 n4 o0 f1 T%机动车数(单位:万辆)0 e6 l2 j( \! }) I; j3 t
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...
" k& {7 T$ x$ C3 ^8 J' ^% t 2.7 2.85 2.95 3.1];
' `( G- W# h( T' \' J) y%公路面积(单位:万平方公里)
& n" @9 S! G9 a7 \( q; V' D2 Usqglmj=[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 ... : K) h7 N- t. z( d. }7 F# Y. k
0.56 0.59 0.59 0.67 0.69 0.79];
$ C6 A2 D) V& j6 F3 T5 z%公路客运量(单位:万人)+ o( X3 R. S. ~0 Q
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ... X+ E' S" F, ^6 e5 A
22598 25107 33442 36836 40548 42927 43462];
0 V% o" n [- n& }1 O- L%公路货运量(单位:万吨)! O1 \/ v# R% z+ H9 N
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...& q) q3 P. |) [( ] a: s
13320 16762 18673 20724 20803 21804];
7 q4 M$ K% a. N% a! Hp=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵; \" p, S4 U+ ^2 `
t=[glkyl;glhyl]; %目标数据矩阵
2 ?$ o: J: o* s- ` U5 P[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化8 m A3 M a( X8 K5 u* N6 ?
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
2 V9 A! a$ J+ D3 t% k* V4 ?3 ^4 m; ?8 N9 I2 i g; k
# Y9 T* Y+ i5 o0 B0 n: m! Nrand('state',sum(100*clock)) %依据系统时钟种子产生随机数 " X* s" |- I. k! t9 | f
NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)! ]4 c0 G5 v. u b! a4 J
Noise=NoiseVar*randn(2,SamNum); %生成噪声
2 i2 ~& S0 H2 FSamOut=tn + Noise; %将噪声添加到输出样本上 v# y3 F: e1 ]" M
设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。) f3 ~& ?( _& {
- V$ M" l4 H1 X2 K# P$ g
# S) L' S: m7 i% L$ [- I6 Q0 F
TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
$ N& P3 r( P: Y$ qTestSamOut=SamOut; %也取输出样本与测试样本相同6 _3 B5 E0 ~5 e d
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
1 B& j! q5 h- C, x, `6 Q) c& {5 a6 B; _" _
# u( k6 G$ h2 ?" {( Y
9 x$ E g: [6 n C: B0 PMaxEpochs=50000; %最多训练次数为50000
# C5 [* P9 b: w; i+ }0 C9 n7 ?% n, c, rlr=0.035; %学习速率为0.035
* M' u* F/ ]/ p6 ]! fE0=0.65*10^(-3); %目标误差为0.65*10^(-3)
! M( L* T9 B5 D$ ZW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值# f s- O+ z3 m1 e
B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值" c% E+ {* i% |9 N) v5 a
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
9 A E( k# T" {& [B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
6 t' g; `- ~' C4 X W! {定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
$ Q% h8 L, U3 O$ b4 N+ H
3 K2 L3 b. P" f! v# b$ e/ V
& Q: o( F" X# O! r3 P/ n4 n, H: ?ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存
( E+ s8 m# G) T8 M0 hfor i=1:MaxEpochs
0 x9 Z8 u* O- E& g" S
- Y7 }3 b: H# i' z HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
% d+ h! [1 K: J$ k NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出 t# }4 t6 I: e. a8 N& S# o
Error=SamOut-NetworkOut; % 实际输出与网络输出之差
1 u' N: q' y0 p8 U SSE=sumsqr(Error); %能量函数(误差平方和)" G/ y T4 L& k* ]3 Q+ Y: V4 b, ?; e) E
ErrHistory(i)=SSE;' q5 u' C$ M# \
: }; _: d% R1 C/ p if SSE<E0,break, end %如果达到误差要求则跳出学习循环
+ x2 j& Q3 t1 j% s0 U6 h
; X, Y+ E' _$ f' F % 以下六行是BP网络最核心的程序) Y+ ]; u: t( a7 x) l
% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
0 X# l9 U# K$ q+ A+ W8 n% J8 ^ Delta2=Error;
4 ^* B5 ~# E2 e Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); 4 p$ r/ \' d0 J% o
) Y$ J6 s q, P G9 u dW2=Delta2*HiddenOut'; l4 x; W) g) O% O: t" d
dB2=Delta2*ones(SamNum,1);
% u, b% M3 _+ f# Y2 I# g; V2 @ b" U
dW1=Delta1*SamIn';" y S8 j6 r1 D) Z2 Q. Z% u7 y1 ~
dB1=Delta1*ones(SamNum,1);, {# P3 S& z& K
%对输出层与隐含层之间的权值和阈值进行修正- J# ~; L3 B& u+ o4 @: G/ b
W2=W2+lr*dW2;. c8 c6 L; Y& @4 T4 U
B2=B2+lr*dB2;2 f" v/ W( W& M" M
%对输入层与隐含层之间的权值和阈值进行修正1 K |# _) F, |* B% w# H5 w
W1=W1+lr*dW1;6 ~2 G. s N) D S- U) P; Y
B1=B1+lr*dB1;
3 W' d) f! S5 a9 P6 K! Mend& d9 D! C$ B8 b- X9 t) _; Q: }4 }. u
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
; b- D& z* [0 ?0 b0 f
3 B z( r5 q! v& v4 g2 G0 F' J
' @1 s- a% A$ K! SHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
( v8 i) L3 Y$ S; D- nNetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
$ b: h I: `9 ]5 ^9 e! j; Fa=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
9 k* w' i. M2 h' k9 q9 s0 t7 Z5 jx=1990:2009; % 时间轴刻度* B8 r+ W; @# ~8 I+ l0 m& [; n
newk=a(1,
; % 网络输出客运量/ @0 X& D: p. X, x) a' V
newh=a(2,
; % 网络输出货运量
6 d: ~0 {! B% m# M5 h" a1 V) ?) U( Tfigure ;
, L' R* M6 s. M' n6 o; asubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;# A# t1 ?& V4 t& t& g9 {* S" H( X
legend('网络输出客运量','实际客运量');+ W1 Q {5 m+ s: }/ x% D7 {% w' m
xlabel('年份');ylabel('客运量/万人');* ^( ~% x+ i1 a0 ^+ W( G! k
subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;
$ ]# O9 l3 x7 L: Tlegend('网络输出货运量','实际货运量');
* c: q* s" ]! bxlabel('年份');ylabel('货运量/万吨');% l% z! ~1 r' t# D8 D3 X" `
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示& v' ?, _, u# _) t
- ]+ ], I+ E0 X8 c4 `
pnew=[73.39 75.55
* T5 o0 a, m2 o; P7 j 3.9635 4.0975
, y& n, I- A3 S1 n* |8 ?( x 0.9880 1.0268]; %2010年和2011年的相关数据;
) u/ p ?0 Z8 a/ r! xpnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
; [/ u* v5 b F THiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
+ \- ^' c2 H: e! e L- i0 qanewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
+ u; q( ?" V4 V%把网络预测得到的数据还原为原始的数量级;3 \$ \3 [( A0 }3 G/ Q* N
anew=postmnmx(anewn,mint,maxt);
: m+ @& d; X# }" u6 f. @, C4 d9 V! K
) n0 f2 B% z7 P9 k7 \9 z5 \给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
' h O8 u5 f( r {! ?, ]该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
' w. q9 q2 _( n5 `# y' u( t* O5 W% t1 E( v0 i4 g( P u1 P U3 s
对于代码将以附件形式给出
- P9 ?. h9 W) e) h y+ h
6 F) T; k. h) C9 s/ V; l% `/ S# j! N/ @
. w$ G- r5 R2 Q: l# H! a) M
-
-
bp_theroy.rar
2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价: 3 点体力 [记录]
[购买]
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |