搜索
您的当前位置:首页正文

(完整版)bp神经网络算法

来源:意榕旅游网
 BP神经网络算法 三层BP神经网络如图:

传递函数g 目标输出向量

输出层,输出向量

权值为wjk 传递函数f 隐含层,隐含层输出向量

输入层,输入向量

设网络的输入模式为x(x1,x2,...xn),隐含层有h个单元,隐含层的输出为y(y1,y2,...yh),输出层有m个单元,他们的输出为z(z1,z2,...zm),目标输出为t(t1,t2,...,tm)设隐含层到输出层的传递函数为f,输出层的传递函数为g

TTTT于是:yjf(hwxiji1ni)f(wijxi):隐含层第j个神经元的输出;其中w0j,i0nx01

zkg(wjkyj):输出层第k个神经元的输出

j01m2此时网络输出与目标输出的误差为(tkzk),显然,它是wij和wjk的函数。

2k1下面的步骤就是想办法调整权值,使减小。

由高等数学的知识知道:负梯度方向是函数值减小最快的方向

因此,可以设定一个步长,每次沿负梯度方向调整个单位,即每次权值的调整为:

wpq,在神经网络中称为学习速率 wpq可以证明:按这个方法调整,误差会逐渐减小。

BP神经网络(反向传播)的调整顺序为: 1)先调整隐含层到输出层的权值 设vk为输出层第k个神经元的输入vk-------复合函数偏导公式

wj0hjkyj

1evk11若取g(x)f(x),则g'(u)(1)zk(1zk) kvk2vkvk1ex(1e)1e1e于是隐含层到输出层的权值调整迭代公式为: 2)从输入层到隐含层的权值调整迭代公式为: 其中uj为隐含层第j个神经元的输入:ujwi0nijxi

涉及所有的权值wij,因此yj注意:隐含层第j个神经元与输出层的各个神经元都有连接,即

mm(tkzk)2zkuk(tkzk)f'(uk)wjkyjk0zkukyjk0

于是:

因此从输入层到隐含层的权值调整迭代为公式为: 例:

下表给出了某地区公路运力的历史统计数据,请建立相应的预测模型,并对给出的2010和2011年的数据,预测相应的公路客运量和货运量。

时间 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 人数(单位:万人) 20.55 22.44 25.37 27.13 29.45 30.1 30.96 34.06 36.42 38.09 39.13 39.99 41.93 44.59 47.3 52.89 55.73 机动车数公路面积(单公路客运量公路货运量(单位:万位:万平方公(单位:万(单位:万辆) 里) 人) 吨) 0.6 0.09 5126 1237 0.75 0.11 6217 1379 0.85 0.11 7730 1385 0.9 0.14 9145 1399 1.05 0.2 10460 1663 1.35 0.23 11387 1714 1.45 0.23 12353 1834 1.6 0.32 15750 4322 1.7 0.32 18304 8132 1.85 0.34 19836 8936 2.15 0.36 21024 11099 2.2 0.36 19490 11203 2.25 0.38 20433 10524 2.35 0.49 22598 11115 2.5 0.56 25107 13320 2.6 0.59 33442 16762 2.7 0.59 36836 18673 2007 56.76 2.85 2008 59.17 2.95 2009 60.63 3.1 73.3900 3.9635 0.9880 2010 75.5500 4.0975 1.0268 2011

function main()

clc % 清屏

clear all; %清除内存以便加快运算速度 close all; %关闭当前所有figure图像 SamNum=20; %输入样本数量为20 TestSamNum=20; %测试样本数量也是20 ForcastSamNum=2; %预测样本数量为2

0.67 0.69 0.79

40548 42927 43462

20724 20803 21804 HiddenUnitNum=8; %中间层隐节点数量取8,比工具箱程序多了1个 InDim=3; %网络输入维度为3 OutDim=2; %网络输出维度为2 %原始数据 %人数(单位:万人)

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 ... 41.93 44.59 47.30 52.89 55.73 56.76 59.17 60.63]; %机动车数(单位:万辆)

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... 2.7 2.85 2.95 3.1]; %公路面积(单位:万平方公里)

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 ... 0.56 0.59 0.59 0.67 0.69 0.79]; %公路客运量(单位:万人)

glkyl=[5126 6217 7730 9145 10460 11387 12353 15750 18304 19836 21024 19490 20433 ... 22598 25107 33442 36836 40548 42927 43462]; %公路货运量(单位:万吨)

glhyl=[1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 ... 13320 16762 18673 20724 20803 21804]; p=[sqrs;sqjdcs;sqglmj]; %输入数据矩阵 t=[glkyl;glhyl]; %目标数据矩阵

[SamIn,minp,maxp,tn,mint,maxt]=premnmx(p,t); %原始样本对(输入和输出)初始化

rand('state',sum(100*clock)) %依据系统时钟种子产生随机数 rand是产生0到1的均匀分布,randn是产生均值为0,方差为1的正态分布 rand(n)或randn(n)产生n*n阶矩阵,rand(m,n)或randn(n)产生m*n的随机数矩阵

NoiseVar=0.01; %噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合) Noise=NoiseVar*randn(2,SamNum); %生成噪声

SamOut=tn + Noise; %将噪声添加到输出样本上

TestSamIn=SamIn; %这里取输入样本与测试样本相同因为样本容量偏少 TestSamOut=SamOut; %也取输出样本与测试样本相同 MaxEpochs=50000; %最多训练次数为50000 lr=0.035; %学习速率为0.035 E0=0.65*10^(-3); %目标误差为0.65*10^(-3)

W1=0.5*rand(HiddenUnitNum,InDim)-0.1; %初始化输入层与隐含层之间的权值 B1=0.5*rand(HiddenUnitNum,1)-0.1; %初始化输入层与隐含层之间的阈值

W2=0.5*rand(OutDim,HiddenUnitNum)-0.1; %初始化输出层与隐含层之间的权值 B2=0.5*rand(OutDim,1)-0.1; %初始化输出层与隐含层之间的阈值 ErrHistory=[]; %给中间变量预先占据内存 for i=1:MaxEpochs

HiddenOut=logsig(W1*SamIn+repmat(B1,1,SamNum)); % 隐含层网络输出 NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); % 输出层网络输出 Error=SamOut-NetworkOut; % 实际输出与网络输出之差 SSE=sumsqr(Error) %能量函数(误差平方和) ErrHistory=[ErrHistory SSE];

if SSE% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量 Delta2=Error;

Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); dW2=Delta2*HiddenOut'; dB2=Delta2*ones(SamNum,1); dW1=Delta1*SamIn'; dB1=Delta1*ones(SamNum,1);

%对输出层与隐含层之间的权值和阈值进行修正 W2=W2+lr*dW2; B2=B2+lr*dB2;

%对输入层与隐含层之间的权值和阈值进行修正 W1=W1+lr*dW1; B1=B1+lr*dB1; end

HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果 NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果 a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果 x=1990:2009; % 时间轴刻度 newk=a(1,:); % 网络输出客运量 newh=a(2,:); % 网络输出货运量 figure ;

subplot(2,1,1);plot(x,newk,'r-o',x,glkyl,'b--+') %绘值公路客运量对比图; legend('网络输出客运量','实际客运量'); xlabel('年份');ylabel('客运量/万人');

subplot(2,1,2);plot(x,newh,'r-o',x,glhyl,'b--+') %绘制公路货运量对比图; legend('网络输出货运量','实际货运量'); xlabel('年份');ylabel('货运量/万吨'); % 利用训练好的网络进行预测

% 当用训练好的网络对新数据pnew进行预测时,也应作相应的处理 pnew=[73.39 75.55 3.9635 4.0975

0.9880 1.0268]; %2010年和2011年的相关数据;

pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化; HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果 anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果 %把网络预测得到的数据还原为原始的数量级; anew=postmnmx(anewn,mint,maxt)

因篇幅问题不能全部显示,请点此查看更多更全内容

Top