QQ登录

只需要一步,快速开始

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

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

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

1175

主题

4

听众

2817

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-8-19 15:20 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。
通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。

4 S, a. B6 R0 {  u7 g以下是bp神经网络的简单介绍:
0 T/ p1 @  }, I$ {
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。
BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。
BP神经网络的学习分为两个过程:前向传播和反向传播。
前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。
反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。
在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。
BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
! e1 A% h8 a( t( ~. I2 \

0 `6 v5 I& v" t1 C0 X  l1 M以下是对给出的代码的详细解释:# G( A+ T, c$ W1 ]  F6 r& C9 |
clc                          % 清屏
0 t8 ?- L* j* ^! t% pclear all;                  %清除内存以便加快运算速度/ q0 Y: C# g/ n: A& c  C
close all;                  %关闭当前所有figure图像
( D% x- x3 T6 D/ S6 y这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
0 C# w) ?; z0 j3 K2 J" O$ Q
3 Z/ H5 q! x4 b) {( v, f) _' a4 L& ?# L+ s5 }6 \0 e- g( h8 L
SamNum=20;                  %输入样本数量为20
; ^* u7 d2 ?+ S1 hTestSamNum=20;              %测试样本数量也是20
3 J' ?; I0 m. G* V; u, c2 mForcastSamNum=2;            %预测样本数量为2
2 `8 ?% o7 k5 J3 N8 [0 H1 vHiddenUnitNum=8;            %中间层隐节点数量取8,比工具箱程序多了1个# v, Y: P( K4 T; ^" S
InDim=3;                    %网络输入维度为3
* E1 z$ y9 S) I" {' ^OutDim=2;                   %网络输出维度为2
# u: A0 T" p6 |: r- M定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
# j4 d- K& i) p6 u" E8 I& z) V9 I) R6 J- C) \
% M, @& {/ X6 z/ z1 c4 C' W
%原始数据
! A7 ^/ p8 p7 {- S/ w%人数(单位:万人): _$ y+ ?9 c" z9 p
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 ...
& x7 i# ]7 s' l, \. G       41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
# ]. I- O$ g2 G- D%机动车数(单位:万辆)8 e5 P' u" j0 G0 h' e& y
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...% _! `6 C5 T, a( a$ ^3 c( c
        2.7 2.85 2.95 3.1];# \7 N9 k' Q7 A) Y' w  @0 |* q
%公路面积(单位:万平方公里)
0 T, _+ O7 E+ _6 ~1 xsqglmj=[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 ...
0 Q( H: w% w/ P         0.56 0.59 0.59 0.67 0.69 0.79];" b& `; Y9 A7 I8 L  B5 i
%公路客运量(单位:万人)% U3 t& |/ O  S3 x& c
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...0 w4 ]; l2 X4 Y2 e( J
        22598 25107 33442 36836 40548 42927 43462];& y1 J6 D, i: m; v/ v
%公路货运量(单位:万吨); B. A: R* \; w2 D/ J& ?- a
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...5 t9 x5 @5 L' q: W4 T
        13320 16762 18673 20724 20803 21804];
  \+ R& Q; {2 E1 t7 Dp=[sqrs;sqjdcs;sqglmj];  %输入数据矩阵
2 p$ X3 j, q+ Q, D0 |8 Pt=[glkyl;glhyl];           %目标数据矩阵% ?9 h+ X# {$ Y( [8 A
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化* [- K1 t2 w; ]6 _8 ?1 c4 h; L1 Z
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。* s& P- w# g( Y; m

4 W7 H: d9 A7 T. J, P! a/ d$ ?3 g. p* q( ^; t
rand('state',sum(100*clock))   %依据系统时钟种子产生随机数         
- S0 n; z, Q; @! l6 i! UNoiseVar=0.01;                    %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)6 E# G' b% M! R5 G3 Y0 D
Noise=NoiseVar*randn(2,SamNum);   %生成噪声$ a" `( P# A' B8 h- u4 m
SamOut=tn + Noise;                   %将噪声添加到输出样本上/ b& l2 U' S9 E7 [
设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。4 U% k- E0 j+ m0 {3 k  C

: _: O8 k% N# H0 H3 m+ }: }3 F
( }9 m9 T% a: G8 x2 J: J3 J: uTestSamIn=SamIn;                           %这里取输入样本与测试样本相同因为样本容量偏少
; t8 f5 F+ Z3 Z" ~' _  vTestSamOut=SamOut;                         %也取输出样本与测试样本相同
0 Q* a) [: ^# C; z$ R1 s& f/ A将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
9 p* I( Y& H( H1 j0 z
; q; D3 _" S, k% V; f& k  B: r" |# w8 S) S
MaxEpochs=50000;                              %最多训练次数为50000! U" B! W7 I: c
lr=0.035;                                       %学习速率为0.035; {/ c: x6 J" }8 @
E0=0.65*10^(-3);                              %目标误差为0.65*10^(-3)
; B6 ~9 K# c- U1 E, ^8 ?6 p$ s" OW1=0.5*rand(HiddenUnitNum,InDim)-0.1;   %初始化输入层与隐含层之间的权值3 B. W! P. b/ ]3 B% G( [
B1=0.5*rand(HiddenUnitNum,1)-0.1;       %初始化输入层与隐含层之间的阈值
, S2 X* m" \& |* z! C! B* kW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值              
: Z- V; V4 F3 l- e0 bB2=0.5*rand(OutDim,1)-0.1;                %初始化输出层与隐含层之间的阈值
) Z7 A- R6 Y0 C1 S1 b. \: B" Q定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
9 S1 a; \. E$ }+ |9 W( F: I2 }/ ?7 W$ Y& s& }; P5 e
; V+ O* e  K0 I' D  A8 H
ErrHistory=zeros(MaxEpochs,1);                              %给中间变量预先占据内存, p# `; K( J) {+ X# t( B5 A, U
for i=1:MaxEpochs: n) h) N& g1 @) I

% J; |) Z- `. a. G% l1 T    HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出9 ^# ]! g& B( Y4 o1 m6 v  x
    NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum);    % 输出层网络输出1 \$ r( {5 j; O  V
    Error=SamOut-NetworkOut;                       % 实际输出与网络输出之差
9 Z0 n) \6 u* s    SSE=sumsqr(Error);                               %能量函数(误差平方和)
4 L) I0 ]4 L$ w# l) C    ErrHistory(i)=SSE;
" V8 u5 H, I6 `. t+ {4 k3 ~" K; _6 W/ A3 _0 M2 L7 K
    if SSE<E0,break, end      %如果达到误差要求则跳出学习循环
: y+ i/ U, @* I3 \0 N- I
6 I  W  l5 E& X* _! N    % 以下六行是BP网络最核心的程序$ |" b7 ~8 q9 i& g
    % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量& t$ ^! s' P* K
    Delta2=Error;: N7 c- d0 K# d+ |3 j  k
    Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);   
; Z4 e8 \! u7 t
8 M, w. O" b' r/ v; l% b! h    dW2=Delta2*HiddenOut';$ d3 X. K4 _  j1 Y  o$ A
    dB2=Delta2*ones(SamNum,1);& x, ~# K; S* }
; a4 K0 X" ^# S9 |. j
    dW1=Delta1*SamIn';
4 {2 C% C% }% T* g2 i; z    dB1=Delta1*ones(SamNum,1);
* Q% m* f4 S- X* m. k, v    %对输出层与隐含层之间的权值和阈值进行修正
$ L  @8 G2 ]+ T) M: y1 a    W2=W2+lr*dW2;
& H+ Z0 X9 P2 Y6 Y5 a    B2=B2+lr*dB2;* J+ O/ B$ l; r3 S
    %对输入层与隐含层之间的权值和阈值进行修正0 L% i- _# J* Z6 Q
    W1=W1+lr*dW1;" j9 J$ u! |& G6 t( u
    B1=B1+lr*dB1;5 W% ^% ], O4 n8 Y  k
end- `4 W# \% e3 Z7 C2 D8 v
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
* i0 x4 Z) G/ }$ G5 c* p, `$ p1 u. K  Y: ~9 l/ j
: J$ J) t/ _9 N" P7 E3 C
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
) g5 U' N2 z( X4 y  SNetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum);    % 输出层输出最终结果: B% x* A, r% @) r8 |$ C
a=postmnmx(NetworkOut,mint,maxt);               % 还原网络输出层的结果$ A2 r0 p; X! _2 U- ~+ S- L/ j% Q
x=1990:2009;                                        % 时间轴刻度& q, E# L: W7 g3 m: o
newk=a(1,;                                        % 网络输出客运量
' z& Y% c8 ], M* Q( ?$ lnewh=a(2,;                                        % 网络输出货运量: j8 ~5 E$ U. W; B! e( h
figure ;
2 S8 {. v2 q; I* {4 c! R+ E: U3 E% lsubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+')    %绘值公路客运量对比图;% M! C4 E2 X/ H7 Z
legend('网络输出客运量','实际客运量');
+ t9 M; u0 ~% E- @: q7 mxlabel('年份');ylabel('客运量/万人');
6 K7 j( ]: E2 l/ f7 Osubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+')     %绘制公路货运量对比图;
' m% l- G& K! @/ [5 t+ J  Hlegend('网络输出货运量','实际货运量');
. E/ x) K  }& Ixlabel('年份');ylabel('货运量/万吨');; K  B  C+ M( m; V# E# o
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示% M3 c: Z! E: W) G8 q

; y3 p( |+ u+ h6 V$ npnew=[73.39 75.55" q- O& U! j, l  K
      3.9635 4.0975
7 B/ U3 s' Z9 _+ N* K- l  L! K      0.9880 1.0268];                     %2010年和2011年的相关数据;
' L5 C5 `# O8 R. {3 Dpnewn=tramnmx(pnew,minp,maxp);         %利用原始输入数据的归一化参数对新数据进行归一化;
+ x0 `2 t) ~+ Z/ }5 p9 h  `" iHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
! ~% J! Z% p6 Y, d4 `. aanewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum);           % 输出层输出预测结果0 V0 ^+ f  R' W) d8 d
%把网络预测得到的数据还原为原始的数量级;
% ]" S4 D- ]( F* ?9 m& ]$ ]anew=postmnmx(anewn,mint,maxt);
! b1 e$ I$ }5 d! x6 q! }6 }2 O+ X2 z  z1 {9 G" |# b# A8 L, `
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。6 |2 @6 e# i) B- G; z& ~' o0 |
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
+ E! q, R' ^9 @4 t: k6 P; C
6 p$ v, n3 Q5 W) o) y对于代码将以附件形式给出1 h5 S# }  e* _
/ R: W4 x" _8 y8 Z

# v( H0 V1 r+ `& q/ L" A
& \1 ?3 L% f: O" A0 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, 2025-7-17 09:33 , Processed in 2.982024 second(s), 59 queries .

回顶部