您的位置:首页 > 理论基础 > 计算机网络

BP神经网络

2015-12-09 21:58 579 查看

神经网络概述

BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出。是目前应用最广泛的神经网络模型之一,常用于模式识别,回归预测等。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。

BP神经网络模型

仿生神经



神经网络的的灵感来源于生物学的大脑神经元,如上图一个神经元, 具有输入信号,和信号处理,以及输出。(不得不佩服造物主的神奇,好多智能算法都是来源于生物学,如粒子群算法,遗传算法,免疫算法等)

神经元模型



作为神经网络的基本元素,神经元的如上图所示。

x1~xn是从其他神经元传来的输入信号

wij表示表示从神经元j到神经元i的连接权值

θ表示一个阈值 ( threshold ),或称为偏置( bias ),

f为激活函数。

可以将阀值当做权值,即xn+1 *θ,xn+1 = -1。表达式如下:



激活函数f有多种类型。具体常用的如下几种:



其中S型和双极S型如下:



BP网络模型



(1) 学习的过程

利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。(信号正向传播和误差的反向传播)

(2) 学习的本质

对各连接权值的动态调整

(3) 学习规则

权值调整规则,即在学习过程中网络各神经元的连接权值变化所依据的一定调整规则。(采用梯度下降法进行动态更新权值,使误差降到最小)。

(4)目标函数

BP网络通过前向反馈误差来改变权值和阈值,当网络的输出与实际期望的输出均方误差低于某个阈值或者学习次数满足一定条件时,训练完成。首先给出输出均方误差的公式:



 其中,m是输出节点个数,p是训练样本个数。我们就是以最小化这个EA为目标更新网络参数。这里以3层网络为例进行推导,即一个输入层、隐含层、输出层。最小化目标函数采用梯度下降的方法。(这里就不具体推导)。

神经网络预测实例

clc
clear
All_error=[];%所有误差存储
%---------------------------------------------------
%数据(时间片序列)
%---------------------------------------------------
year=1996:2010;%数据是从1996到2010年的

p=[493 372 445;372 445 176;445 176 235;176 235 378;235 378 429;378 429 561;429 561 651;561 651 467;651 467 527;467 527 668;527 668 841; 668 841 526;841 526 480;526 480 567;480 567 685]';%输入数据,共15组,每组3个输入
t=[176 235 378 429 561 651 467 527 668 841 526 480 567 685 507];%输出数据,共15组,每组1个输出
%---------------------------------------------------
%数据归一化处理
%mapminmax函数默认将数据归一化到[-1,1],调用形式如下
%[y,ps] =%mapminmax(x,ymin,ymax)
%x需归化的数据输入
%ymin,ymax为需归化到的范围,不填默认为归化到[-1,1]
%y归一化后的样本数据
%ps处理设置,ps主要在结果反归一化中需要调用,或者使用同样的settings归一化另外一组数据
%---------------------------------------------------
[normInput,ps] = mapminmax(p);
[normTarget,ts] = mapminmax(t);

%---------------------------------------------------
%数据乱序,及分类处理
%将输入的15组数据的20%,即3组,用来作为测试数据;
% 样本的20%,即3组,用来作为变化数据;
%另外9组用来正常输入,用来训练;
%dividevec()用来重新随机抽取上述三种分类的数据,原来的顺序被打乱
%函数调用的语法
%[trainV,valV,testV] = dividevec(p,t,valPercent,testPercent)
%输入p为输入数据,t为输出数据
%valPercent为训练用的变化数据在总输入中的百分比
%testPercent为训练用的测试数据在总输入中的百分比
%输出trainV,valV,testV分别为按乱序及相应百分比,抽取得到的数据
%另外,打乱后的数据,p和t都是对应的,请放心使用
%---------------------------------------------------
testPercent = 0.20;  % Adjust as desired
validatePercent = 0.20;  % Adust as desired
[trainSamples,validateSamples,testSamples] = dividevec(normInput,normTarget,validatePercent,testPercent);

for j=1:200
%---------------------------------------------------
% 设置网络参数
%---------------------------------------------------
NodeNum1 = 20; % 隐层第一层节点数
NodeNum2=40;   % 隐层第二层节点数
TypeNum = 1;   % 输出维数

TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';%各层传输函数,TF3为输出层传输函数
net=newff(minmax(normInput),[NodeNum1,NodeNum2,TypeNum],{TF1 TF2 TF3},'traingdx');%网络创建

%---------------------------------------------------
% 设置训练参数
%---------------------------------------------------
net.trainParam.epochs=10000;%训练次数设置
net.trainParam.goal=1e-6;%训练目标设置
net.trainParam.lr=0.01;%学习率设置,应设置为较少值,太大虽然会在开始加快收敛速度,但临近最佳点时,会产生动荡,而致使无法收敛
%---------------------------------------------------
% 指定训练参数
%---------------------------------------------------
% net.trainFcn = 'traingd'; % 梯度下降算法
% net.trainFcn = 'traingdm'; % 动量梯度下降算法
%
% net.trainFcn = 'traingda'; % 变学习率梯度下降算法
% net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法

net.trainfcn='traingdm';
[net,tr] = train(net,trainSamples.P,trainSamples.T,[],[],validateSamples,testSamples);

%---------------------------------------------------
% 训练完成后,就可以调用sim()函数,进行仿真了
%---------------------------------------------------
[normTrainOutput,Pf,Af,E,trainPerf] = sim(net,trainSamples.P,[],[],trainSamples.T);%正常输入的9组p数据,BP得到的结果t
[normValidateOutput,Pf,Af,E,validatePerf] = sim(net,validateSamples.P,[],[],validateSamples.T);%用作变量3的数据p,BP得到的结果t
[normTestOutput,Pf,Af,E,testPerf] = sim(net,testSamples.P,[],[],testSamples.T);%用作测试的3组数据p,BP得到的结果t

%---------------------------------------------------
% 仿真后结果数据反归一化,如果需要预测,只需将预测的数据P填入
% 将获得预测结果t
%---------------------------------------------------
trainOutput = mapminmax('reverse',normTrainOutput,ts);%正常输入的9组p数据,BP得到的归一化后的结果t
trainInsect = mapminmax('reverse',trainSamples.T,ts);%正常输入的9组数据t
validateOutput = mapminmax('reverse',normValidateOutput,ts);%用作变量3的数据p,BP得到的归一化的结果t
validateInsect = mapminmax('reverse',validateSamples.T,ts);%用作变量3的数据t
testOutput = mapminmax('reverse',normTestOutput,ts);%用作变量3组数据p,BP得到的归一化的结果t
testInsect = mapminmax('reverse',testSamples.T,ts);%用作变量3组数据t

%绝对误差计算
absTrainError = trainOutput-trainInsect;
absTestError = testOutput-testInsect;
error_sum=sqrt(absTestError(1).^2+absTestError(2).^2+absTestError(3).^2);
All_error=[All_error error_sum];
eps=90;%其为3组测试数据的标准差,或者每个数据偏差在一定范围内而判别
if ((abs(absTestError(1))<=30 )&(abs(absTestError(2))<=30)&(abs(absTestError(3))<=30)|(error_sum<=eps))
save mynetdata net
break
end
j
end
j
Min_error_sqrt=min(All_error)

testOutput
testInsect

%---------------------------------------------------
% 数据分析和绘图
%---------------------------------------------------
figure
plot(1:12,[trainOutput validateOutput],'b--',1:12,[trainInsect validateInsect],'g--',13:15,testOutput,'m*',13:15,testInsect,'ro');
title('o为真实值,*为预测值')
xlabel('年份');
ylabel('交通量(辆次/昼夜)');

figure
xx=1:length(All_error);
plot(xx,All_error)
title('误差变化图')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息