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('误差变化图')
相关文章推荐
- 使用spark和spark mllib进行股票预测
- bp神经网络及matlab实现
- 2010年天灾预测年度报告简表
- 治安卡口方案
- 模式识别
- 基于神经网络的预测模型
- 2008年11月【51CTO版】软考考前冲刺预测卷
- 独立思考者模型:识别媒体与砖家的谎言
- 神经网络初步学习手记
- 大盘分析
- OpenCV的图像处理
- 灰色系统模型GM(1,1)的R语言实现
- 2045的世界?吓人...!!
- 分类器的设计(fisher准则函数设计俩个类别的分类器)
- 知道得越多,越难改变观点
- RBF的一点个人理解
- 利用自收敛深度人工神经网络构建(DNN)构建多语种大词汇量连续语音识别系统
- 最小外接矩形(MBR)
- UFLDL Exercise: Convolutional Neural Network
- 2017容器发展趋势预测:更快速的采纳和创新