bp神经网络算法

更新时间:2024-03-10 04:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

BP神经网络算法 三层BP神经网络如图:

传递函数g 目标输出向量

tk 输出层,输出向量

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

权值为wij 输入层,输入向量

x1x2x3 xn

设网络的输入模式为x?(x1,x2,...xn)T,隐含层有h个单元,隐含层的输出为

y?(y1,y2,...yh)T,输出层有m个单元,他们的输出为z?(z1,z2,...zm)T,目标输出为t?(t1,t2,...,tm)T设隐含层到输出层的传递函数为f,输出层的传递函数为g

于是:yj?f(?wxi?1niji??)?f(?wijxi):隐含层第j个神经元的输出;其中

i?0nw0j???,hx0?1

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

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

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

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

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

?wpq?????,?在神经网络中称为学习速率 ?wpq可以证明:按这个方法调整,误差会逐渐减小。 BP神经网络(反向传播)的调整顺序为: 1)先调整隐含层到输出层的权值 设vk为输出层第k个神经元的输入vk??wj?0hjkyj

1m1m22(t?z)(t?z)?kk2?kk?zk?vk??2k?1k?1????(tk?zk)g'(vk)yj ?wjk?wjk?zk?vk?wjk-------复合函数偏导公式

1e?vk11若取g(x)?f(x)?,则g'(u)??(1?)?zk(1?zk) k?x?vk2?vk?vk1?e(1?e)1?e1?e于是隐含层到输出层的权值调整迭代公式为:

wjk(t?1)?wjk(t)??zk(1?zk)yj

2)从输入层到隐含层的权值调整迭代公式为:

1m1m2(tk?zk)(tk?zk)2???yj?uj??22?k?1?k?1?wij?wij?yj?uj?wij其中uj为隐含层第j个神经元的输入:uj?

?wxi?0niji注意:隐含层第j个神经元与输出层的各个神经元都有连接,即

??涉及所有的权值wij,?yj

mm?(tk?zk)2?zk?uk???????(tk?zk)f'(uk)wjk因此

?yjk?0?zk?uk?yjk?0于是:

1m (tk?zk)2?m???2?k?1???{(tk?zk)f'(uk)wjk}f'(uj)xi???jxi ?wij?wijk?0

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

wij(t?1)?wij(t)???jxi

例:

下表给出了某地区公路运力的历史统计数据,请建立相应的预测模型,并对给出的2010和2011年的数据,预测相应的公路客运量和货运量。 时间 人数(单位:万人) 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 56.76 59.17 60.63 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 73.3900 2010 75.5500 2011

机动车数公路面积(单公路客运量(单位:万位:万平方公(单位:万辆) 里) 人) 0.6 0.09 5126 0.75 0.11 6217 0.85 0.11 7730 0.9 0.14 9145 1.05 0.2 10460 1.35 0.23 11387 1.45 0.23 12353 1.6 0.32 15750 1.7 0.32 18304 1.85 0.34 19836 2.15 0.36 21024 2.2 0.36 19490 2.25 0.38 20433 2.35 0.49 22598 2.5 0.56 25107 2.6 0.59 33442 2.7 0.59 36836 2.85 0.67 40548 2.95 0.69 42927 3.1 0.79 43462 3.9635 0.9880 54359 4.0975 1.0268 55606 公路货运量(单位:万吨) 1237 1379 1385 1399 1663 1714 1834 4322 8132 8936 11099 11203 10524 11115 13320 16762 18673 20724 20803 21804 27827 28453

function main()

clc % 清屏

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

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)) %依据系统时钟种子产生随机数

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

% 以下六行是BP网络最核心的程序

% 他们是权值(阈值)依据能量函数负梯度下降原理所作的每一步动态调整量 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]; 10年和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)

本文来源:https://www.bwwdw.com/article/toy8.html

Top