QQ登录

只需要一步,快速开始

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

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

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

1188

主题

4

听众

2931

积分

该用户从未签到

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

/ q" }  K1 e' w. ^以下是bp神经网络的简单介绍:
. [8 u* b* Y7 j" P7 Z# u2 T
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。
BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。
BP神经网络的学习分为两个过程:前向传播和反向传播。
前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。
反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。
在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。
BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。
" R; Z8 e% K0 d1 v$ z

0 K7 V8 z+ C. Q7 Y4 m以下是对给出的代码的详细解释:& v" r6 a3 B3 \/ E+ W& F* N7 M
clc                          % 清屏6 X3 X% j, ~* _- w0 n+ V% ^
clear all;                  %清除内存以便加快运算速度
& L  ?8 J7 i7 pclose all;                  %关闭当前所有figure图像
8 j2 F) ~" ~" s# O) L+ k: T7 m这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。/ Q, G) p9 n( v4 F( M* R$ E

: @2 q- Q+ C1 Z3 Y& ], Z* m- P  E1 @
# M/ v. t- ?4 f0 Z# bSamNum=20;                  %输入样本数量为20
* f! e& e+ E; i# B! z. ETestSamNum=20;              %测试样本数量也是205 \0 \% p% B* Y0 D1 q) i! u1 ~
ForcastSamNum=2;            %预测样本数量为2
3 S: A5 T4 {! sHiddenUnitNum=8;            %中间层隐节点数量取8,比工具箱程序多了1个
/ q$ j2 p1 `; p: U, J* C: rInDim=3;                    %网络输入维度为3
. {7 P; b, T$ XOutDim=2;                   %网络输出维度为2
1 A* h4 q$ y' @- p定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。/ j% b3 j( S6 O* t5 ?! Q, S
4 P6 S* R' B/ q+ w$ P2 G" ?7 |

5 F7 _4 M; r2 X5 c3 H# Q%原始数据
; h( Z$ `6 L+ M; ~  f0 P% R! [$ X6 w%人数(单位:万人)5 i% ~3 m* ?  I$ a8 f! u
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 ...
) ?& w5 }/ \' n# y9 M- W) o( r       41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];& n/ q. C* F1 z% ?; p! M. g
%机动车数(单位:万辆)
# t1 p+ C0 P8 lsqjdcs=[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..." T. i2 c& y+ J
        2.7 2.85 2.95 3.1];+ R: o: E$ U2 F
%公路面积(单位:万平方公里)0 j: J- X0 I8 o; m# j1 R% r) x
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 ... 3 Y3 D: A9 H1 {% ~4 v/ t
         0.56 0.59 0.59 0.67 0.69 0.79];
8 p/ E9 Y: N6 z/ H%公路客运量(单位:万人). g1 ~+ G7 Y) e2 C0 I
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ...7 c6 h, M* m+ X
        22598 25107 33442 36836 40548 42927 43462];
2 G& `7 N7 \, C% v. b- w. O%公路货运量(单位:万吨)/ e. O1 O, n$ c* Z: E) \: y) v$ Z
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...6 B  a1 ^; L+ Z1 e+ _. |6 M
        13320 16762 18673 20724 20803 21804];
8 K, h. \$ b1 b3 U* W2 ~0 w' A; Ap=[sqrs;sqjdcs;sqglmj];  %输入数据矩阵4 a# f: K1 }- ]1 ~6 Z) L2 ?
t=[glkyl;glhyl];           %目标数据矩阵: m- j/ c& s. g
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化9 ?) J! o" _+ V0 P
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
$ b* H0 K5 z  N6 o3 p& d6 E" b2 m' @5 e. U4 C" i  q

2 d3 m1 M: ^9 y8 {6 {# N8 yrand('state',sum(100*clock))   %依据系统时钟种子产生随机数         1 Y4 z+ j+ X0 w9 `% C
NoiseVar=0.01;                    %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
, \9 E% J. o- Z1 G; eNoise=NoiseVar*randn(2,SamNum);   %生成噪声) A) o. f  p  e5 B, C: h1 t
SamOut=tn + Noise;                   %将噪声添加到输出样本上
1 ^) }7 L; R8 D" T: k设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。+ J0 a' H- F4 g) o! ^, v

  M* ?. B" I/ P. Y1 u# j9 G! P4 e! l+ w5 W4 ^
TestSamIn=SamIn;                           %这里取输入样本与测试样本相同因为样本容量偏少
! J2 r  r$ w; {. CTestSamOut=SamOut;                         %也取输出样本与测试样本相同2 T$ Q) j0 e. H
将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。* H* \) l) |, |9 ]& @

. V7 N& T6 M0 H1 a
, f4 Z  H( L, x7 h7 o8 pMaxEpochs=50000;                              %最多训练次数为500006 Q$ w  K7 j! Y0 E
lr=0.035;                                       %学习速率为0.0357 j& K8 }) r; g" i5 Q+ l) M4 T
E0=0.65*10^(-3);                              %目标误差为0.65*10^(-3)
* w0 U, R" T+ {. i2 qW1=0.5*rand(HiddenUnitNum,InDim)-0.1;   %初始化输入层与隐含层之间的权值, b7 e. G$ C( g2 M6 L
B1=0.5*rand(HiddenUnitNum,1)-0.1;       %初始化输入层与隐含层之间的阈值
: N, |# c+ J4 H7 ?3 f7 R- PW2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值              
* y, O2 |! F+ X- B- e9 t% SB2=0.5*rand(OutDim,1)-0.1;                %初始化输出层与隐含层之间的阈值
' c, A/ C1 P4 E' p定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。. k6 f' q" p* Q  l" j5 N
: N; {6 d& y# X2 g

/ K9 Z6 y+ }) [( f- XErrHistory=zeros(MaxEpochs,1);                              %给中间变量预先占据内存
) r0 k, J  E) _0 xfor i=1:MaxEpochs+ I% }6 E% D9 m/ x1 C" w: p

3 f/ w5 {- D, s$ t  K0 n    HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出
7 ]' r% y/ r) `& c+ w    NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum);    % 输出层网络输出9 M1 D* p, R& L9 O: ~9 s
    Error=SamOut-NetworkOut;                       % 实际输出与网络输出之差, B0 c3 Z4 e- i' B7 b/ }1 b1 P. d
    SSE=sumsqr(Error);                               %能量函数(误差平方和)
# x3 Y8 F& W9 q    ErrHistory(i)=SSE;7 t: [  D" u8 w6 H6 ~  t. s% B! ~
' e5 D$ ?/ K! G8 k, g5 i. }, ~
    if SSE<E0,break, end      %如果达到误差要求则跳出学习循环& z" i( A& H! M: n5 b  z
/ R( a& P) _7 L% w3 V
    % 以下六行是BP网络最核心的程序6 s0 ~0 `' X) ~9 q0 d$ o9 `7 t
    % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量& `; K- m4 c0 W( [
    Delta2=Error;
% a5 ?5 `# ]7 H    Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);    ' B0 N; X; u/ p6 C! r

, ?. A4 z# x7 c2 d& q' ^8 E, v    dW2=Delta2*HiddenOut';! V% M3 L9 c: [; E6 ], C9 e5 n
    dB2=Delta2*ones(SamNum,1);. ~0 G4 g1 s7 A/ R! c* K+ w

- B1 T5 M& }1 d8 R0 B/ ~0 Y    dW1=Delta1*SamIn';
, s1 c$ @! {7 D2 ~" g* J    dB1=Delta1*ones(SamNum,1);& x4 f% w* a% `* c
    %对输出层与隐含层之间的权值和阈值进行修正% w/ L  l* O$ \) ]. F! |, T
    W2=W2+lr*dW2;$ C  ~/ l# v6 B0 n' r2 Y+ M/ e
    B2=B2+lr*dB2;
) J$ b6 v# ]4 P+ Y* i9 o2 P9 m! _    %对输入层与隐含层之间的权值和阈值进行修正3 m& d; O! O7 e" a8 J* ^* ?
    W1=W1+lr*dW1;+ i2 A5 e2 \4 L
    B1=B1+lr*dB1;
* A* S- O1 K3 [' X! fend* R6 y8 {2 p4 Z4 e1 S, q/ g
使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
* w! U( s6 M0 D: I+ P  p% S) K+ Q4 A5 G2 Y% h4 }* ?  O. X# j

9 F& v) {' M* x3 hHiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
& F5 R3 y. k  y& K$ S  eNetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum);    % 输出层输出最终结果
8 C0 F, v5 c% |1 H) P- K! xa=postmnmx(NetworkOut,mint,maxt);               % 还原网络输出层的结果7 N, F- [  X3 S6 I
x=1990:2009;                                        % 时间轴刻度
; G3 L9 y' B3 b- Znewk=a(1,;                                        % 网络输出客运量2 }. r+ i2 P  t; R9 L) B  R# b
newh=a(2,;                                        % 网络输出货运量
; k5 o2 L: m6 v2 a$ c9 Q+ D! hfigure ;
9 S1 [4 ?( ?& X' l' Rsubplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+')    %绘值公路客运量对比图;1 Y' I" a9 d4 k
legend('网络输出客运量','实际客运量');+ t" \* i# A8 L
xlabel('年份');ylabel('客运量/万人');
  [3 X9 f+ L- u, T2 K. D2 psubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+')     %绘制公路货运量对比图;" K6 h8 P) D1 C5 @1 _3 x
legend('网络输出货运量','实际货运量');' j  y& w7 L+ i/ R, o
xlabel('年份');ylabel('货运量/万吨');$ ]  @) u3 p0 P) H# a
使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
% l& C& ]5 h% J3 \4 {( S
) ~2 Z6 e) B  B$ d' [pnew=[73.39 75.55- i. Q  _! H5 V0 r6 v
      3.9635 4.09751 Z" B# J' b9 |& ]( e
      0.9880 1.0268];                     %2010年和2011年的相关数据;9 r& |* Y+ q( `! O
pnewn=tramnmx(pnew,minp,maxp);         %利用原始输入数据的归一化参数对新数据进行归一化;! r% A# R/ T" _' @
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
8 y2 ~" j& ?  Lanewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum);           % 输出层输出预测结果& D, w' U  a6 h3 y9 M" w7 z4 @8 p
%把网络预测得到的数据还原为原始的数量级;7 t. H" l( b1 |. d' D- V. Z
anew=postmnmx(anewn,mint,maxt);2 d+ j6 b) z2 Q3 X$ a
9 d! M4 Y, {5 ?- l8 J
给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。6 x8 e0 `7 Y6 s6 U) ~. G6 C
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
. |4 m& N. C. d/ t3 ]
. L0 p. e7 J& J& K6 j9 b对于代码将以附件形式给出
2 o6 n" G* g% n
; _5 t8 @/ R' [/ `7 |1 P7 t! n9 S- u7 ?* y0 Z

7 e* `8 f! P' g1 s% g8 t

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-5-25 15:24 , Processed in 0.570969 second(s), 55 queries .

回顶部