|
在本文中使用BP神经网络进行数据预测的功能。具体来说,它使用了BP神经网络模型进行公路客运量和公路货运量的预测。这个问题涉及了了解和预测公路客运量和公路货运量的变化趋势。公路客运量指的是公路上人数的运输量,而公路货运量表示公路上货物的运输量。 通过分析与这两个指标相关的数据,如人口数量、机动车数量和公路面积,代码通过BP神经网络模型构建了一个预测模型。预测模型的目标是根据输入的数据(人口数量、机动车数量和公路面积)来预测公路客运量和公路货运量的值。 2 q+ |" V4 J# e2 O
以下是bp神经网络的简单介绍:7 } [: f1 |9 m+ l& U
BP神经网络,即反向传播神经网络(Backpropagation Neural Network),是一种常用的人工神经网络模型。它是一种具有前馈和反向传播机制的多层前馈神经网络,是一种有监督的学习算法,适用于解决分类和回归问题。 BP神经网络由输入层、隐藏层和输出层组成,每个层都由多个神经元(节点)组成。每个神经元与上一层和下一层的神经元相连接,并且每条连接都有一个权重。 BP神经网络的学习分为两个过程:前向传播和反向传播。 前向传播:从输入层开始,将输入样本输入网络,经过每一层的神经元的计算,最终得到输出层的输出结果。在前向传播过程中,每个神经元根据其输入信号和权重进行加权求和,并通过激活函数(如sigmoid函数)进行非线性变换,生成该神经元的输出。 反向传播:将网络的输出结果与期望输出进行比较,计算输出误差。然后将误差从输出层向输入层反向传播,根据误差调整网络中的权重。反向传播使用梯度下降算法来最小化误差,通过不断迭代调整权重,使网络的输出逼近期望输出。 在反向传播过程中,首先计算输出层的误差,然后逐层向前计算隐藏层的误差,直到达到输入层。根据误差计算的结果,更新每个连接权重的值,以减小误差。 BP神经网络的训练过程是通过多次迭代更新权重,不断调整网络的连接权重和阈值,使得网络的输出逼近期望输出。网络的训练通常以某个终止准则为条件,如达到预定的训练次数或达到期望的误差阈值。 & _6 _3 Y% I$ O' g) t0 ]
% ~7 v5 O! l s0 ^, p& b
以下是对给出的代码的详细解释:; H! h9 i4 v* M% d9 F
clc % 清屏
. n* q, M/ }8 X1 S4 M9 u' Eclear all; %清除内存以便加快运算速度
9 j7 ?& I# J: C# b0 S; U' ?close all; %关闭当前所有figure图像& {, f- d! R( M! r, L
这些代码行清空了 MATLAB 的命令窗口、清除了工作区中的所有变量和关闭了所有图形窗口。- V( F. A7 p" x
2 H% R3 _3 ~/ F5 D2 J( D
L& C0 f0 Y3 B# X# U6 x: ^9 ~( N! {
SamNum=20; %输入样本数量为20
r! q0 h u' f0 c; @TestSamNum=20; %测试样本数量也是208 z" l, ]; T" u% _, E, V" `" \
ForcastSamNum=2; %预测样本数量为2
5 g. p$ {% \0 h7 x. ?, d& bHiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个
- J* f' ~9 c* x+ M8 y2 i) \InDim=3; %网络输入维度为35 g! U2 o1 i* C5 t1 I% M
OutDim=2; %网络输出维度为2
+ y$ W4 ^- `# c d+ q: B0 W( j定义了样本数量、测试样本数量、预测样本数量以及神经网络的隐层节点数量、输入维度和输出维度。* `$ M, t6 c4 h
9 H: |* X6 z# ]: R" w3 {
+ @: j* d$ B9 F%原始数据
, D- }* f5 m: X7 L& P9 k%人数(单位:万人)
& O/ F6 u9 g U5 R0 ~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 ...6 P" r; S; g2 V, B3 w
41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63];
5 { c0 }4 W3 P%机动车数(单位:万辆)+ @5 @ W0 k+ K" M; N: B% S
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...
; _* p4 o* D' q9 X b 2.7 2.85 2.95 3.1];
! q: |5 D2 o3 I ?/ n6 ^$ G, l%公路面积(单位:万平方公里)
+ p3 }9 |, s- ]8 `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 ...
& t9 W* u1 z1 K2 z8 k 0.56 0.59 0.59 0.67 0.69 0.79];2 \2 m$ r+ q& s. D: R; L+ }+ J9 k
%公路客运量(单位:万人)1 t, U5 W9 L+ a
glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ..." S3 n: U& T1 M" D& q
22598 25107 33442 36836 40548 42927 43462];
5 m9 U' v4 q! c2 g! i%公路货运量(单位:万吨)& _% ~6 \9 W# S/ j3 ~
glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ...
2 P) q: k* X& `, C 13320 16762 18673 20724 20803 21804];* T S1 d/ {: y- ?) L
p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵
7 O6 a' b: U6 c0 I& _t=[glkyl;glhyl]; %目标数据矩阵/ X- {& [$ q* z1 w8 c
[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化5 f2 y) p$ L, S. g9 k; p
给出了一些原始数据,包括人数、机动车数、公路面积、公路客运量和公路货运量。然后将输入数据矩阵p和目标数据矩阵t进行归一化处理,返回归一化后的样本输入SamIn,归一化参数minp和maxp,以及归一化后的目标输出tn和归一化参数mint和maxt。
" `2 A1 |: `2 x% W* W
% p! u1 s5 T |; v6 V! T) i( U9 O T+ v4 u( |7 A4 Q
rand('state',sum(100*clock)) %依据系统时钟种子产生随机数
! S. U! n( y5 mNoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
; L& g( ]; I7 nNoise=NoiseVar*randn(2,SamNum); %生成噪声1 E0 M; ^) S8 }, p
SamOut=tn + Noise; %将噪声添加到输出样本上
8 H; s ?# `$ a! p5 J G设置随机数种子并生成一些噪声数据,将这些噪声添加到归一化后的目标数据tn上,得到带噪声的样本输出SamOut。
- y: |% E$ F6 Y! k) h s6 T* a& _6 \9 u; e
1 ]: N( R& _. A" u% K- l- GTestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少
4 k2 L5 k2 }& ?, ~/ d0 iTestSamOut=SamOut; %也取输出样本与测试样本相同
; i8 j e4 i) z. P1 h将用于测试的样本输入TestSamIn设置为与训练样本输入SamIn相同,将用于测试的样本输出TestSamOut设置为与训练样本输出SamOut相同。
/ z) n0 a7 k0 V$ O" k3 C
* T: M6 l3 V7 s7 @, e+ N# P; V f3 u5 h1 u! \2 j
MaxEpochs=50000; %最多训练次数为50000" x, s: b3 i+ }& Q5 }: A/ x
lr=0.035; %学习速率为0.035
2 U [ b0 z. ?' PE0=0.65*10^(-3); %目标误差为0.65*10^(-3)
' p9 [" t* F6 }: F; NW1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值
" c4 D4 |5 V3 x/ f. BB1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值" e3 _5 L# h- Q
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值
7 M* {: i- P9 i7 \/ \0 {B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值
1 `$ H( X& }- y( Y定义了最大训练次数MaxEpochs、学习速率lr和目标误差E0。然后,随机地初始化输入层与隐含层之间的权值W1和阈值B1,以及输出层与隐含层之间的权值W2和阈值B2。. q1 k4 c6 D( D5 z! D7 Z! R- t* W
/ U1 x: U5 m' w- R ^$ r8 q5 N3 t" k& r2 p, b2 k
ErrHistory=zeros(MaxEpochs,1); %给中间变量预先占据内存9 Z2 W: X; X& Z
for i=1:MaxEpochs
8 [5 D2 @. k) s8 y
2 H+ L M- [% p( x" s8 Y8 M HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出" ?' i% e9 c/ @4 m+ u) {
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出
6 M0 d6 D2 W$ ~! R3 s5 A u Error=SamOut-NetworkOut; % 实际输出与网络输出之差
. h( _5 ?4 T2 y9 w7 U SSE=sumsqr(Error); %能量函数(误差平方和)
7 T, ^, q; ?6 H. { ErrHistory(i)=SSE; L, p( v2 ?- T0 q2 a. l
- Z' Z. d/ S% D% I1 p if SSE<E0,break, end %如果达到误差要求则跳出学习循环( l. d Z6 R: s+ E) _
& [/ P+ `$ j B& E! p % 以下六行是BP网络最核心的程序
& Y) w+ o3 n: D: n % 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量, w- \- q9 x( V, f3 @# m
Delta2=Error;
. [4 e1 U2 _9 v$ [4 f Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); ) _4 b. Y3 ]/ y$ |0 U
; P% r, s7 T7 J6 g8 G
dW2=Delta2*HiddenOut';
. u6 q) s' g. H: Q Y2 s2 f6 P dB2=Delta2*ones(SamNum,1);
% |* ~4 z5 _$ Z& J. [' w$ `4 U9 j/ N1 B6 S0 l* T
dW1=Delta1*SamIn';
( E$ ?0 L' J' W$ i. o dB1=Delta1*ones(SamNum,1);
' |: P9 ?+ a4 d+ N, R4 U4 V' F% h %对输出层与隐含层之间的权值和阈值进行修正% j9 H0 @( J) d3 x4 K: H( F
W2=W2+lr*dW2;
- X5 _" p# `9 u( @ U B2=B2+lr*dB2;
+ a0 R& P) ` b+ N' f( p8 P %对输入层与隐含层之间的权值和阈值进行修正) x7 X% U4 t/ z$ e$ y
W1=W1+lr*dW1;
! y1 [7 ^' @3 t, S( \1 E" _ B1=B1+lr*dB1;
' Z8 d( L9 y* J/ xend
4 F* _% _" K: g. c3 `8 R4 O- ]使用BP算法进行神经网络的训练。通过迭代调整权值和阈值来减小实际输出与期望输出之间的误差。迭代过程中,计算隐含层的输出HiddenOut和输出层的输出NetworkOut,计算误差Error,计算能量函数(误差平方和)SSE,并将其保存在ErrHistory中。如果误差小于目标误差E0,则跳出学习循环。核心的BP算法部分涉及到误差的反向传播和权值、阈值的调整。
+ O: H. G/ z3 D* s/ c% D0 m2 V2 B0 ^
3 }% L. d3 P- ^% n1 _$ A8 Y2 {) x; M! o* L3 Q3 W- T; @7 w
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果+ B7 R+ D" p9 D+ Z+ G+ L* R
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
' p+ l$ V* `; m4 R4 z/ S- j2 ga=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
6 \: o& `/ H3 J1 y( I Nx=1990:2009; % 时间轴刻度( R9 u! k5 r: A5 Y' Y5 J4 y" X" U
newk=a(1, ; % 网络输出客运量' ~0 J% \, V' W/ f) {
newh=a(2, ; % 网络输出货运量$ ?+ o& l. Z( F' m- D9 p& ~
figure ;! u" ?3 R* E" o% B. q4 {( ~5 R
subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图;
, s" P5 Y; z4 i: R2 a5 Clegend('网络输出客运量','实际客运量');
$ v4 n4 o' ^9 C$ P2 P8 P/ X% Zxlabel('年份');ylabel('客运量/万人');
: ]' h6 x. o$ ?4 ^$ s- Fsubplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图;' P8 H0 i: N- Z+ {
legend('网络输出货运量','实际货运量');" h5 A8 x8 h$ G4 a5 b- Z& h% `
xlabel('年份');ylabel('货运量/万吨');
2 |4 f2 a8 W2 z# Q# q7 H+ i( q使用训练好的神经网络对测试样本进行预测并还原归一化结果。将还原后的网络输出结果与实际数据绘制成图形进行对比展示
4 \ I: Y; C; w# o, g- L
' b7 E; O8 W4 A/ `# _3 e0 `pnew=[73.39 75.55
+ [) I3 w* i' i* q8 Y$ j% B( Y0 b! k 3.9635 4.0975
6 q) \" s+ t* Q 0.9880 1.0268]; %2010年和2011年的相关数据;
$ P/ `# D9 M7 N2 lpnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化;
3 Z0 Y# \. P K# _) Z2 X, cHiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果" [; g0 f# n% y5 \' n5 I1 j5 F; {
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果0 N5 M y) B: d% r5 ^+ ?
%把网络预测得到的数据还原为原始的数量级;/ A" J$ k2 u' ]
anew=postmnmx(anewn,mint,maxt);6 s2 O+ S* o# C8 n
( C) v6 x A0 J, C+ X1 `$ [给出了新的输入数据pnew,对其进行归一化处理得到归一化后的输入数据pnewn。然后,使用训练好的神经网络对归一化后的输入数据进行预测,得到归一化后的预测结果。最后,利用逆归一化操作将预测结果恢复为原始的数量级。' Y! a1 N1 X2 t
该段代码主要包括数据预处理、神经网络的训练和预测,以及结果的可视化展示。通过训练得到的神经网络,可以对输入数据进行预测并输出相应的结果。
1 ~1 m- u: W; s2 u
% S& G" k& ?& ]对于代码将以附件形式给出
$ ~! Y( ^: c8 T: M, L/ P( E' Z8 T
6 e* O0 T6 f+ n- S+ Q4 K; b$ w# B7 f+ ]$ C/ Z$ _' u$ S
y- x* Y* \' y8 {1 T7 R7 i% [
|