QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2019|回复: 0
打印 上一主题 下一主题

BP神经网络进行数据预测(matlab版)

[复制链接]
字体大小: 正常 放大

1186

主题

4

听众

2922

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-8-19 15:20 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。
通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。
2 W  Z: S; L# ^5 F, \; Q, o
以下是bp神经网络的简单介绍:' G1 T4 d' I, C+ G1 T+ W: z  R
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。
BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。
BP神经网络的学习分为两个过程:前向传播和反向传播。
前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。
反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。
在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。
BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
& r: T! F  [4 W1 ^" m
: ^( v7 L* ]  p4 Y8 k' y
以下是对给出的代码的详细解释:
! L: _5 R4 D2 |4 `% C; qclc                          % 清屏# f1 c1 R3 I7 C# y* l. G9 ~4 o
clear all;                  %清除内存以便加快运算速度
! x; U* ^! b2 R, S$ u+ Z# X8 mclose all;                  %关闭当前所有figure图像
4 J( n9 n* o0 N' ]* n6 }) `- _" y, J这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。' G( G6 B5 Z" V  z

7 t( w5 `* z( r% O3 g
8 l+ Q8 E3 O8 |6 K, sSamNum=20;                  %输入样本数量为20" U) V8 Q. \& q' ]: |/ s* f
TestSamNum=20;              %测试样本数量也是200 y( v* I! P+ L9 j
ForcastSamNum=2;            %预测样本数量为2
) O/ a8 F' g& c% L# @HiddenUnitNum=8;            %中间层隐节点数量取8,比工具箱程序多了1个. ?7 l' V+ q& t* M
InDim=3;                    %网络输入维度为3# g; m  J5 ?( x( E" @
OutDim=2;                   %网络输出维度为2
1 Q% I: E$ [) K定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
3 V' {/ Y9 i! t2 R; v0 G# [
% ]/ r8 ?" ?! q4 i! t3 R6 x. D( F6 t. X
%原始数据
* S0 ~. k! K% m2 _$ T5 H%人数(单位:万人)/ h1 ^4 F  O, V. R9 z. K
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 ...
* j3 Q" c1 P# v       41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];0 j; O) e$ n( t
%机动车数(单位:万辆)
" w7 `3 ~, |/ T& c2 C- q5 Ysqjdcs=[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...( T0 ^5 u3 x2 u% n3 R  F! N0 P
        2.7 2.85 2.95 3.1];' k2 o5 J& A  _% R$ |
%公路面积(单位:万平方公里)
" Y( w" Z; P3 ~% b& ?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 ... / G! y7 {" E3 P3 h  X
         0.56 0.59 0.59 0.67 0.69 0.79];* q, A% n: }- R3 ?) u1 j" i1 ^
%公路客运量(单位:万人)- s$ i  s1 \* m" n5 C
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ..., E( Y( \/ r  ?; ?8 \
        22598 25107 33442 36836 40548 42927 43462];
% L3 N! D" g7 |  f%公路货运量(单位:万吨)0 ]. a6 o/ w8 A, J% x# m
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
$ i; B6 `( Z) T        13320 16762 18673 20724 20803 21804];
3 l$ F/ i; M& Tp=[sqrs;sqjdcs;sqglmj];  %输入数据矩阵$ Q# S# m2 N# ]9 K
t=[glkyl;glhyl];           %目标数据矩阵" b# I5 R" A+ j- m) R
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化
* H' U7 y- A. A3 t给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
. H  l% L4 x7 t$ |. H+ n' A. `# }
1 Y3 L% x) k. I' y8 W- W% d( Q: d9 k/ [  e
rand('state',sum(100*clock))   %依据系统时钟种子产生随机数         
. i7 g( V) U9 z" e0 BNoiseVar=0.01;                    %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
3 z! k; W# Q# Q$ k) zNoise=NoiseVar*randn(2,SamNum);   %生成噪声
( A  z2 {6 O3 g/ y7 @* PSamOut=tn + Noise;                   %将噪声添加到输出样本上
9 y% Z0 a  W$ y( I( V设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
9 Z& C2 Y4 s+ [& A9 P* l, U( W1 {' @& I% W) r; J
/ l& t) C' o5 r4 j
TestSamIn=SamIn;                           %这里取输入样本与测试样本相同因为样本容量偏少# C' v# D" U3 j- \
TestSamOut=SamOut;                         %也取输出样本与测试样本相同
7 U& X, x% M0 k: |将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
4 Z0 c/ W" A. n0 Y) {3 l' I5 V3 Y  U) w& y, B$ F
( U$ T( g; h7 T2 Y9 X, F
MaxEpochs=50000;                              %最多训练次数为500002 l/ A, v( X; U1 f8 I
lr=0.035;                                       %学习速率为0.035
8 w( ~. V4 ^, ?E0=0.65*10^(-3);                              %目标误差为0.65*10^(-3)
2 v& a- C' s3 W" k0 _, QW1=0.5*rand(HiddenUnitNum,InDim)-0.1;   %初始化输入层与隐含层之间的权值9 L  V4 O' T/ b' V; z# w+ p
B1=0.5*rand(HiddenUnitNum,1)-0.1;       %初始化输入层与隐含层之间的阈值
9 }$ z! ]3 c' q  p( R6 @: P# k# g" PW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值              $ f8 V$ D' M* X- g3 c8 y
B2=0.5*rand(OutDim,1)-0.1;                %初始化输出层与隐含层之间的阈值
0 K* A0 `; [! s, S( ~定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。0 F' W: l+ p6 E8 z1 v6 k3 U$ y$ t
% A8 M, i5 D$ L6 b1 T

; ?9 P1 j' d- W, Y2 EErrHistory=zeros(MaxEpochs,1);                              %给中间变量预先占据内存
5 j% e/ K5 X6 P; l! gfor i=1:MaxEpochs/ O# u4 w4 i' b8 @

8 c$ ^9 ?& N# H4 S' x0 G    HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出# j4 H$ G1 c5 E7 S4 y5 P
    NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum);    % 输出层网络输出1 a1 t. a5 s- P; o* J* q" z1 u: R
    Error=SamOut-NetworkOut;                       % 实际输出与网络输出之差
. @0 ~* O/ T( l! p2 d4 `* j    SSE=sumsqr(Error);                               %能量函数(误差平方和)
7 w! z" N. X! S! O    ErrHistory(i)=SSE;0 L: J) ]7 U% s6 W7 S* `

& p# g# }2 A7 q1 Q) q5 z    if SSE<E0,break, end      %如果达到误差要求则跳出学习循环
3 B; p4 Q% q- T$ ]6 U- s5 c
: z$ j/ I5 c6 B: Y! M    % 以下六行是BP网络最核心的程序5 f0 z# [! s1 w
    % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
, G& O6 N' X9 s7 p* k    Delta2=Error;7 s2 f1 E5 o" K; `! e
    Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);   
/ S5 i/ `( `# T& c+ z1 |
  Y$ D8 M& ^/ i6 ~1 k$ @    dW2=Delta2*HiddenOut';: S  n5 s6 }. [5 W  Z
    dB2=Delta2*ones(SamNum,1);8 m$ ^9 B' I; v$ G; k
4 k" y3 l8 ^: A- j  \
    dW1=Delta1*SamIn';
2 F, ]" ^, E9 n$ ]    dB1=Delta1*ones(SamNum,1);4 h, }0 ~$ T2 V& k. O
    %对输出层与隐含层之间的权值和阈值进行修正
  ]- B4 U! s2 Z    W2=W2+lr*dW2;" P1 U1 Y  A7 |$ _3 a' n
    B2=B2+lr*dB2;
! X+ y( {" V/ \8 s, F    %对输入层与隐含层之间的权值和阈值进行修正
* N. V8 J* Z( q( l+ Z. j9 `9 W2 Z7 ^    W1=W1+lr*dW1;
( j) l, I' c- ~    B1=B1+lr*dB1;
* C& s# B: w: Q7 C% w% M+ K# f: Yend+ E8 D" H+ n) }( y. B3 M
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。  v, B. }( s0 q! K3 G3 c! ]

3 W7 B1 U( z) m" s8 Z, n9 Y* t( E6 m4 X; M4 B
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
7 a0 K9 _& \. ?* h2 [" A4 g6 mNetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum);    % 输出层输出最终结果
! M- A2 N; m0 w5 y2 qa=postmnmx(NetworkOut,mint,maxt);               % 还原网络输出层的结果/ o  C/ L% [& i  m- a& t
x=1990:2009;                                        % 时间轴刻度
2 `. r; t; s- f2 t1 unewk=a(1,;                                        % 网络输出客运量& M" ?! u5 O) G: w7 l* ]5 F- ~
newh=a(2,;                                        % 网络输出货运量
" D( J  V8 y9 N& c3 Rfigure ;' t# O9 ~3 r8 ]* V" r
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+')    %绘值公路客运量对比图;
! `8 t- P$ S! y0 y6 R+ g$ R2 `legend('网络输出客运量','实际客运量');
$ w% l9 y7 i3 m  F  oxlabel('年份');ylabel('客运量/万人');
5 _& W  [9 i' m5 K4 P0 @subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+')     %绘制公路货运量对比图;
4 w" m9 D! U2 g& [$ U0 v& Flegend('网络输出货运量','实际货运量');
7 y, \4 x5 T+ D9 w4 m" nxlabel('年份');ylabel('货运量/万吨');9 B4 v( C2 F& W: |3 c6 h" f4 K  `8 R
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
- I$ o* Q: C2 f. S7 N: P* Z% a% S9 R9 G
pnew=[73.39 75.557 W/ J) Q8 L1 I6 }+ W
      3.9635 4.0975
& N; @- a0 h0 p3 R& R9 s6 Z      0.9880 1.0268];                     %2010年和2011年的相关数据;) C/ T* Y2 [! G4 ?
pnewn=tramnmx(pnew,minp,maxp);         %利用原始输入数据的归一化参数对新数据进行归一化;
) F2 t% a! l! mHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果4 G7 R8 ~; J& y! ]5 \9 j  V: J
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum);           % 输出层输出预测结果' [8 H1 ]# ^. J- W
%把网络预测得到的数据还原为原始的数量级;
3 t% p2 c. n7 L, }: o+ d+ X. Nanew=postmnmx(anewn,mint,maxt);- W# ]- V. I& i

5 W2 l! E! P; c8 x给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。
6 n/ ?' |2 T% q" v) O该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。- w1 e# D) ?+ h+ L$ D
9 R* {  G/ i; E& G. ?/ I3 t
对于代码将以附件形式给出$ m$ T& I5 ?" Q+ |' V# ~9 @/ l- U. L
5 R+ T! {6 F5 {# `9 N, \

# O; v9 M8 N% l% J2 m; d1 M
2 _8 [: l% V0 {  V

bp_theroy.rar

2.23 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 3 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-14 12:39 , Processed in 0.442746 second(s), 60 queries .

回顶部