QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

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

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

5 c0 w8 S. D2 X' w以下是对给出的代码的详细解释:7 o+ ^6 R) x& L  L' X% p
clc                          % 清屏
/ ^3 F5 o- u+ q. U2 z3 f$ k* p# fclear all;                  %清除内存以便加快运算速度
7 ]( K7 X& Y. T5 ^7 Eclose all;                  %关闭当前所有figure图像) k/ d) u- Z8 @( Z/ G3 @& i3 a
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。
$ N1 P& T' y; L' O0 b5 r
) S" M" Q5 z' y7 x9 ~
* N1 p) N1 b  \6 g% {" m* Y2 `6 U: wSamNum=20;                  %输入样本数量为20
/ m, j0 g" o. r7 Q+ @) @TestSamNum=20;              %测试样本数量也是20
. j' n6 |, i; d; W9 b. h6 KForcastSamNum=2;            %预测样本数量为24 K! z3 |, T4 d. a7 a" |+ }; J+ h+ y
HiddenUnitNum=8;            %中间层隐节点数量取8,比工具箱程序多了1个  D% a' u/ l8 l3 Y
InDim=3;                    %网络输入维度为3  g: I- N) T& K/ q1 z* G/ R+ r: q2 X
OutDim=2;                   %网络输出维度为2; B9 b5 }" g- Z1 [) M) V1 ~
定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。
/ N$ f+ E0 [1 D5 J) l4 J
6 ?5 y$ U4 L8 N1 }" R
0 }( T: m. |' J$ ^! r% P4 g! s& ^% F%原始数据 & q2 D4 R" q* F3 q
%人数(单位:万人)
1 O' E: w3 s/ L+ osqrs=[20.55 22.44 25.37 27.13 29.45 30.10 30.96 34.06 36.42 38.09 39.13 39.99 ...
9 [6 B" U. L+ f" z       41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
7 X1 A8 Z& {8 a%机动车数(单位:万辆)
' |6 c/ A8 Q* l& Y4 z& v3 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...  l9 q7 F1 {! H2 I0 @
        2.7 2.85 2.95 3.1];1 }. n3 X$ e, W8 J
%公路面积(单位:万平方公里)
0 L7 x: n) [" X& Gsqglmj=[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. t1 T/ v2 p! t- U         0.56 0.59 0.59 0.67 0.69 0.79];( E" \  g; t1 o
%公路客运量(单位:万人)' D2 z) x$ A2 U1 b1 }+ z3 y. c) l/ Q) |
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ..., @4 f6 d* e) U
        22598 25107 33442 36836 40548 42927 43462];
4 i4 B- ?# p" U( G  i3 E  i' B9 x$ e; U%公路货运量(单位:万吨)
5 V( Z4 A% |& ]8 G+ G4 n5 C8 cglhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
( b. O7 }) Z# o# k" `: j        13320 16762 18673 20724 20803 21804];' J# u/ K% Y) g
p=[sqrs;sqjdcs;sqglmj];  %输入数据矩阵" t4 \& Y* o$ I- l- \* H7 R
t=[glkyl;glhyl];           %目标数据矩阵
% [5 {- Y! ]! w7 t4 u[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化7 g, \3 e: Y4 C+ }; e8 Z
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。) P3 P/ \) k4 j0 d, ^* ^( P
* y" v0 x" G! k6 D

6 v- c% }1 }, a! prand('state',sum(100*clock))   %依据系统时钟种子产生随机数         
8 P9 r$ o: B, I% G3 P) QNoiseVar=0.01;                    %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
* B3 u9 Y( }  k4 x# d) aNoise=NoiseVar*randn(2,SamNum);   %生成噪声4 k8 \" b' o3 V8 ~! D3 `4 I
SamOut=tn + Noise;                   %将噪声添加到输出样本上6 E3 [! c  V# u" O- i. V
设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。# q0 B- M4 M* ~# K0 s. @# q  C; x
! @% D% B3 m4 z" D

* O1 L$ C* J; b/ |# i5 L+ STestSamIn=SamIn;                           %这里取输入样本与测试样本相同因为样本容量偏少
$ U& t4 r& X3 {. pTestSamOut=SamOut;                         %也取输出样本与测试样本相同8 o2 o1 g6 p1 t" u! U# Q% M8 e
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
. d( s# O+ C3 y; K" ^4 J; A# u& u* m/ t! P
  I5 U% i- i- a6 t& C6 R& _! v# z
MaxEpochs=50000;                              %最多训练次数为50000
/ l- B0 u/ l4 W% ]0 F, Z, nlr=0.035;                                       %学习速率为0.035% h3 _* H/ t( H8 G5 I% E) t8 A  }- ^
E0=0.65*10^(-3);                              %目标误差为0.65*10^(-3)7 ?; m0 G4 o- c
W1=0.5*rand(HiddenUnitNum,InDim)-0.1;   %初始化输入层与隐含层之间的权值
: n1 _& G+ W! M$ g% YB1=0.5*rand(HiddenUnitNum,1)-0.1;       %初始化输入层与隐含层之间的阈值6 U- O* l- ~* L2 W& o0 P
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值              
, @0 }5 e( j( W+ @* _% aB2=0.5*rand(OutDim,1)-0.1;                %初始化输出层与隐含层之间的阈值+ Z- i9 E" ~$ J4 X; |6 e
定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。
- @6 Y1 ?- }& U8 j4 y
6 }- k4 \1 t& g+ o# `
; z' U! ?4 x$ C# sErrHistory=zeros(MaxEpochs,1);                              %给中间变量预先占据内存6 F2 y' k7 e7 c4 \
for i=1:MaxEpochs. E3 w6 K9 J3 |3 u
( F& q& P5 f6 w9 K
    HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
! N+ R0 H2 T% B1 W" p+ w* t, F    NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum);    % 输出层网络输出
" x# M  N" h( Y/ n9 P) N    Error=SamOut-NetworkOut;                       % 实际输出与网络输出之差
7 C2 _1 h. }$ h& o8 F) c$ D    SSE=sumsqr(Error);                               %能量函数(误差平方和)
4 o9 G1 z& l+ s+ \, |2 K    ErrHistory(i)=SSE;0 R( ]2 |2 Z  t2 f2 q+ {

/ Y$ D* V0 b! q7 Q5 h8 K0 T5 g    if SSE<E0,break, end      %如果达到误差要求则跳出学习循环  n: @8 L6 X6 ?% T

$ u8 a2 A- Z! x3 e    % 以下六行是BP网络最核心的程序
- D9 b0 W3 w3 h* ]: t; d1 V    % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量
$ \1 [' r& ~, u9 N    Delta2=Error;8 h- B( l9 k; c. ~$ g; z# }
    Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);   
! i; H8 `8 |- T; f5 e5 \8 T8 C6 C- V/ K; N  \
    dW2=Delta2*HiddenOut';
+ R& b1 {5 c' B- _    dB2=Delta2*ones(SamNum,1);  S% |) e+ C# q6 |) D+ k. h- m
; t; f9 _% P& h$ {# I$ z) Y9 ]. k9 a
    dW1=Delta1*SamIn';
4 K" m1 B! M) _3 G# s: K    dB1=Delta1*ones(SamNum,1);4 k% w, @& v6 m* o/ S
    %对输出层与隐含层之间的权值和阈值进行修正7 R' l: Z0 D6 ^5 S3 V4 C9 P) w
    W2=W2+lr*dW2;
5 l+ U0 P$ F# \    B2=B2+lr*dB2;! m8 F; k) _2 V! E, A# c1 Q; @, z
    %对输入层与隐含层之间的权值和阈值进行修正/ l( [  m0 U7 ]. t: N1 |# `# I! f
    W1=W1+lr*dW1;
; K% J0 l% m7 T7 D" ]1 q    B1=B1+lr*dB1;
3 y; p  z# x( t- Qend
4 r3 P8 K0 L/ K5 J0 c使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。. z  }4 y( j# v! _$ z
2 l6 D' t# K( n; A

( F8 ]$ `# _1 _HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
9 A& w2 v, b; e1 t& P# o+ R- ONetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum);    % 输出层输出最终结果( o, f! R3 w7 X# x2 H& c# }
a=postmnmx(NetworkOut,mint,maxt);               % 还原网络输出层的结果1 A6 o' X8 E( x) S# W: o) r
x=1990:2009;                                        % 时间轴刻度9 n, V* ?4 M* X4 [1 ~% I9 ^
newk=a(1,;                                        % 网络输出客运量1 A& i7 h8 G/ m% g: C6 i
newh=a(2,;                                        % 网络输出货运量1 `6 ^1 {2 m5 [0 ]! @* @& g7 P
figure ;
' v" L0 ?3 \$ w3 o7 [subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+')    %绘值公路客运量对比图;
+ [2 z# e* C/ ]9 E9 m. Slegend('网络输出客运量','实际客运量');
( [: K$ n9 c# A# b4 Axlabel('年份');ylabel('客运量/万人');
  U4 _( w1 o, _9 V( q- Bsubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+')     %绘制公路货运量对比图;
2 f& r. m% `" t1 _% P" v. \4 r  ulegend('网络输出货运量','实际货运量');$ F- d. O7 z6 a) l* i7 j
xlabel('年份');ylabel('货运量/万吨');
' C) s, Y2 c1 E/ C4 m* Z4 R% ?使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示  t* C5 W( m* w) M  H" l) n

+ P0 e, c9 r4 {" n+ K. Lpnew=[73.39 75.55( B. }+ r( P. }: w0 a
      3.9635 4.0975
' O. O; V6 j# w3 G6 L6 B; X, [      0.9880 1.0268];                     %2010年和2011年的相关数据;  h# ~' n7 d! q# T4 V# f$ n
pnewn=tramnmx(pnew,minp,maxp);         %利用原始输入数据的归一化参数对新数据进行归一化;
+ X9 K+ Q% b! T* |$ W* p+ a' g2 H7 [HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
0 N" H) N+ o' B4 g6 manewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum);           % 输出层输出预测结果. \9 {- I3 C% Y
%把网络预测得到的数据还原为原始的数量级;# A: E; C6 I& |. d3 I3 @/ Q
anew=postmnmx(anewn,mint,maxt);
. V7 L' Z+ [  s2 X: \& u1 h% ]2 o3 o! d2 P( r
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。, l7 H- r) l$ y; B" H# X* a
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
( u  W0 A1 w) J* n- i/ K7 q$ H0 ?# h+ B
对于代码将以附件形式给出; b8 \9 c0 g2 W

0 K  O; e. u0 ~; }6 f
( W3 h! L1 ~) H3 t- q" H
% E! s$ ]8 |/ |+ Z& m- s5 {4 w

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-7-31 21:18 , Processed in 0.434745 second(s), 54 queries .

回顶部