9512.net
甜梦文库
当前位置:首页 >> >>

BP神经网络的matlab实现学习历程


考拉 BP 神经网络的 matlab 实现学习历程(一) 实现学习历程( 考拉 BP 神经网络的 matlab 实现学习历程(一) 本文《考拉 BP 神经网络的 matlab 实现学习历程》系列由论坛超级版主 akjuan 整理和原 《 实现学习历程》 超级版主 创,我们在此表示特别感谢

这两天在学习 bp,总结和汇报一下,和大家一起学习。希望初入神经网络能有所收获,给 新手一些帮组和启发。也希望熟悉 bp 的高手,多提宝贵意见和建议。 学习内容总结成五个小节,具体内容如下: 第一节内容: 第一节内容:包括神经网络的基础知识,BP 网络的特点,bp 主要应用的场合,使用时应注 意的问题。 第二节内容:主要是阐述 BP 中几个容易混绕的概念和问题,包括什么是网络的泛化能力? 二节内容: 过拟合是什么,怎么处理?学习速率有什么作用?神经网络的权值和阈值分别是个什么概 念?用 BP 逼近非线性函数,如何提高训练精度? 第三节内容: 第三节内容:主要阐述使用 matlab 实现,为了充分利用数据,得到最优的网络训练结果, 在网络建立前,应该进行的基本数据处理问题,包括:BP 神经网络 matlab 实现的基本步 骤,数据归一化问题和方法,输入训练数据的乱序排法,以及分类方法,如何查看和保存训 练的结果,每次结果不一样问题。 第四节内容: 第四节内容:bp 神经网络进行交通预测的 Matlab 例子及源代码,bp 神经网络进行交通预 测的 Matlab 程序的优化(主要是按设置误差要求,寻找最优网络过程) 第五节内容: 第五节内容:bp 神经网络处理蠓虫分类问题的 matlab 例子及源代码。 不多说,先如主题,第一节,很基础,高手见谅。 什么是神经网络? 什么是神经网络? 神经网络是由很多神经元组成的,首先我们看一下,什么是神经元

上面这个图表示的就是一个神经元,我们不管其它书上说的那些什么树突,轴突的。我用个 比较粗浅的解释,可能不太全面科学,但对初学者很容易理解: 1、我们把输入信号看成你在 matlab 中需要输入的数据,输进去神经网络后 2、这些数据的每一个都会被乘个数,即权值 w,然后这些东东与阀值 b 相加后求和得到 u, 3、上面只是线性变化,为了达到能处理非线性的目的,u 做了个变换,变换的规则和传输 函数有关

可能还有人问, 那么那个阀值是什么呢?简单理解就是让这些数据做了个平移, 这就是神经 元工作的过程。处理后的结果又作为输入,可输给别的神经元,很多这样的神经元,就组成 了网络。在 matlab 中具体用什么算法实现这些,我们先不管,我们需要注意的是怎么使用。 比如使用 BP 的神经网络 newff()构建一个网络,这些在后面的学习将提到。 BP 网络的特点 ①网络实质上实现了一个从输入到输出的映射功能, 而数学理论已证明它具有实现任何复杂 非线性映射的功能。这使得它特别适合于求解内部机制复杂的问题。我们无需建立模型,或 了解其内部过程,只需输入,获得输出。只要 BPNN 结构优秀,一般 20 个输入函数以下的 问题都能在 50000 次的学习以内收敛到最低误差附近。而且理论上,一个三层的神经网络, 能够以任意精度逼近给定的函数,这是非常诱人的期望; ②网络能通过学习带正确答案的实例集自动提取“合理的”求解规则,即具有自学习能力; ③网络具有一定的推广、概括能力。 bp 主要应用 回归预测(可以进行拟合,数据处理分析,事物预测,控制等)、 分类识别(进行类型划 分,模式识别等),在后面的学习中,我都将给出实例程序。 但无论那种网络,什么方法,解决问题的精确度都无法打到 100%的,但并不影响其使用, 因为现实中很多复杂的问题,精确的解释是毫无意义的,有意义的解析必定会损失精度。 BP 注意问题 1、BP 算法的学习速度很慢,其原因主要有: a 由于 BP 算法本质上为梯度下降法,而它所要优化的目标函数又非常复杂,因此,必然会 出现“锯齿形现象”,这使得 BP 算法低效; b 存在麻痹现象,由于优化的目标函数很复杂,它必然会在神经元输出接近 0 或 1 的情况 下,出现一些平坦区,在这些区域内,权值误差改变很小,使训练过程几乎停顿; c 为了使网络执行 BP 算法,不能用传统的一维搜索法求每次迭代的步长,而必须把步长的 更新规则预先赋予网络,这种方法将引起算法低效。 2、网络训练失败的可能性较大,其原因有: a 从数学角度看,BP 算法为一种局部搜索的优化方法,但它要解决的问题为求解复杂非线 性函数的全局极值,因此,算法很有可能陷入局部极值,使训练失败; b 网络的逼近、推广能力同学习样本的典型性密切相关,而从问题中选取典型样本实例组 成训练集是一个很困难的问题。 3、网络结构的选择: 尚无一种统一而完整的理论指导,一般只能由经验选定。为此,有人称神经网络的结构选择 为一种艺术。而网络的结构直接影响网络的逼近能力及推广性质。因此,应用中如何选择合

适的网络结构是一个重要的问题。 4、新加入的样本要影响已学习成功的网络,而且刻画每个输入样本的特征的数目也必须相 同。 5、采用 s 型激活函数,由于输出层各神经元的理想输出值只能接近于 1 或 0,而不能打到 1 或 0,因此设置各训练样本的期望输出分量 Tkp 时,不能设置为 1 或 0,设置 0.9 或 0.1 较为适宜。

实现学习历程( 考拉 BP 神经网络的 matlab 实现学习历程(二)
本文《考拉 BP 神经网络的 matlab 实现学习历程》系列由论坛超级版主 akjuan 整理和原 《 实现学习历程》 超级版主 创,我们在此表示特别感谢

本节主要学习 BP 中几个容易混绕的概念和问题:什么是网络的泛化能力?过拟合是什么, 怎么处理?学习速率有什么作用?神经网络的权值和阈值分别是个什么概念?用 BP 逼近 非线性函数,如何提高训练精度? 什么是网络的泛化能力? 什么是网络的泛化能力? 一个神经网路是否优良, 与传统最小二乘之类的拟合评价不同 (主要依据残差, 拟合优度等) , 不是体现在其对已有的数据拟合能力上,而是对后来的预测能力,既泛化能力。 网络的预测能力(也称泛化能力、推广能力)与训练能力(也称逼近能力、学习能力)的矛 盾。一般情况下,训练能力差时,预测能力也差,并且一定程度上,随训练能力地提高,预 测能力也提高。但这种趋势有一个极限,当达到此极限时,随训练能力的提高,预测能力反 而下降,即出现所谓“过拟合”现象。此时,网络学习了过多的样本细节,而不能反映样本内 含的规律。 过拟合是什么,怎么处理? 过拟合是什么,怎么处理? 神经网络计算不能一味地追求训练误差最小,这样很容易出现“过拟合”现象,只要能够实时 检测误差率的变化就可以确定最佳的训练次数,比如 15000 次左右的学习次数,如果你不 观察,设成 500000 次学习,不仅需要很长时间来跑,而且最后结果肯定令人大失所望。 避免过拟合的一种方法是: 在数据输入中, 给训练的数据分类, 分为正常训练用、 变量数据、 测试数据,在后面节将讲到如何进行这种分类。 其中变量数据,在网络训练中,起到的作用就是防止过拟合状态。 学习速率有什么作用? 学习速率有什么作用? 学习速率这个参数可以控制能量函数的步幅, 并且如果设为自动调整的话, 可以在误差率经

过快速下降后,将学习速率变慢,从而增加 BPNN 的稳定性。 此时训练方法采用 复制内容到剪贴板
代码: 代码

DE>net.trainFcn = 'traingda'; % 变学习率梯度下降算法 net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法 DE> 可以定义一个变动的学习速率,如 复制内容到剪贴板
代码: 代码

DE>p = [-1 -1 2 2; 0 5 0 5]; t = [-1 -1 1 1]; net = newff(p,t,3,{},'traingda'); net.trainParam.lr = 0.05; net.trainParam.lr_inc = 1.05; net = train(net,p,t); y = sim(net,p)DE> 在后面的拟合例题中,我们也将用到学习速率这个参数。 神经网络的权值和阈值分别是个什么概念? 神经网络的权值和阈值分别是个什么概念? 第一节中,我们已经谈到了权值和阀值的概念。这里我们更深入的说明一下,因为他们很重 要, 关系到网络最后的结果。 权值和阈值是神经元之间的连接, 将数据输入计算出一个输出, 然后与实际输出比较,误差反传,不断调整权值和阈值。 假如下面两个点属于不同的类,须设计分类器将他们分开
引用: 引用

p1=[1 1 -1]'; p2=[1 -1 -1]'; 这里用单层神经元感知器,假设初始权值 复制内容到剪贴板
代码: 代码

DE>w=[0.2 0.2 0.3]DE> 同时假设初始阀值 复制内容到剪贴板
代码: 代码

DE>b=-0.3DE> 输出 a1 a2 复制内容到剪贴板
代码: 代码

DE>a1=hardlims(w*p1+b) a2=hardlims(w*p2+b)DE> 如果不能分开,还须不断调整 w,b 逼近非线性函数, 用 BP 逼近非线性函数,如何提高训练精度 (1)调整网络结构 增加网络的层数可以进一步降低误差, 提高精度但会使网络复杂化, 从而增加网络的训练时 间。 精度的提高实际上也可以通过增加隐层神经元的数目来获得, 其效果更容易观察和掌握, 所以应优先考虑。 (2)初始值选取 为了使误差尽可能小 ,需要合理选择初始权重和偏置,如果太大就容易陷入饱和区,导致 停顿 。一般应选为均匀分布的小数,介于 (-1,1) 。 (3)学习速率调整 学习速率的选取很重要 ,大了可能导致系统不稳定,小了会导致训练周期过长、收敛慢, 达不到要求的误差。 一般倾向于选取较小的学习速率以保持系统稳定, 通过观察误差下降曲 线来判断。下降较快说明学习率比较合适,若有较大振荡则说明学习率偏大。同时,由于网 络规模大小的不同,学习率选择应当针对其进行调整。采用变学习速率的方案,令学习速率 随学习进展而逐步减少,可收到良好的效果。 (4)期望误差 期望误差当然希望越小越好,但是也要有合适值。

神经网络的 实现学习历程( 考拉 BP 神经网络的 matlab 实现学习历程(三)
本文《考拉 BP 神经网络的 matlab 实现学习历程》系列由论坛超级版主 akjuan 整理和原 《 实现学习历程》 超级版主 创,我们在此表示特别感谢

本节主要学习使用 matlab 实现 bp 算法的一般步骤和过程。 为了充分利用数据, 得到最优的网络训练结果, 在网络建立前应该进行的基本数据处理问题, 包括: (1)BP 神经网络 matlab 实现的基本步骤 (2)数据归一化问题和方法 (3)输入训练数据的乱序排法,以及分类方法 (4)如何查看和保存训练的结果

(5)每次结果不一样问题。 用 matlab 实现 bp,其实很简单,按下面步骤基本可以了 BP 神经网络 matlab 实现的基本步骤 1、数据归一化 2、数据分类,主要包括打乱数据顺序,抽取正常训练用数据、变量数据、测试数据 3、建立神经网络,包括设置多少层网络(一般 3 层以内既可以,每层的节点数(具体节点 数,尚无科学的模型和公式方法确定,可采用试凑法,但输出层的节点数应和需要输出的量 个数相等),设置隐含层的传输函数等。关于网络具体建立使用方法,在后几节的例子中将 会说到。 4、指定训练参数进行训练,这步非常重要,在例子中,将详细进行说明 5、完成训练后,就可以调用训练结果,输入测试数据,进行测试 6、数据进行反归一化 7、误差分析、结果预测或分类,作图等 数据归一化问题 归一化的意义: 首先说一下,在工程应用领域中,应用 BP 网络的好坏最关键的仍然是输入特征选择和训练 样本集的准备,若样本集代表性差、矛盾样本多、数据归一化存在问题,那么,使用多复杂 的综合算法、多精致的网络结构,建立起来的模型预测效果不会多好。若想取得实际有价值 的应用效果,从最基础的数据整理工作做起吧,会少走弯路的。 归一化是为了加快训练网络的收敛性,具体做法是: 1 把数变为(0,1)之间的小数 主要是为了数据处理方便提出来的,把数据映射到 0~1 范围之内处理,更加便捷快速,应 该归到数字信号处理范畴之内。 2 把有量纲表达式变为无量纲表达式 归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成 为纯量 比如,复数阻抗可以归一化书写:Z = R + jωL = R(1 + jωL/R) ,复数部分变成了纯数量了, 没有量纲。另外,微波之中也就是电路分析、信号系统、电磁波传输等,有很多运算都可以 如此处理,既保证了运算的便捷,又能凸现出物理量的本质含义。 神经网络归一化方法: 由于采集的各数据单位不一致,因而须对数据进行[-1,1]归一化处理,归一化方法主要有如 下几种,供大家参考: 1、线性函数转换,表达式如下:

复制内容到剪贴板
代码: 代码

DE>y=(x-MinValue)/(MaxValue-MinValue)DE> 说明:x、y 分别为转换前、后的值,MaxValue、MinValue 分别为样本的最大值和最小值。 2、对数函数转换,表达式如下: 复制内容到剪贴板
代码: 代码

DE>y=log10(x)DE> 说明:以 10 为底的对数函数转换。 3、反余切函数转换,表达式如下: 复制内容到剪贴板
代码: 代码

DE>y=atan(x)*2/PIDE> matlab 中归一化的实现: matlab 中的归一化处理有五种方法,只会其中一种就可以了,我喜欢用第 4 种,因为习惯 和方便 注意:第一组和第二组归一化函数在 Matlab7.0 以上已遗弃,他们的用法相似,pre**是归 一化,post**是反归一化,tram**是使用同样的设置归一化另外一组数据 1. 内部函数 premnmx、postmnmx、tramnmx,将数据归一化到(-1,1) premnmx 的语法格式是 复制内容到剪贴板
代码: 代码

DE>:[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T)DE> 其中 P, 分别为原始输入和输出数据, T minp 和 maxp 分别为 P 中的最小值和最大值。 mint 和 maxt 分别为 T 的最小值和最大值。 我们在训练网络时, 如果所用的是经过归一化的样本数据, 那么以后使用网络时所用的新数 据也应该和样本数据接受相同的预处理,这就要用到 tramnmx,换句话说使用同一个归一 化设置(setting)归一化另外一组数据。如下所示: 复制内容到剪贴板
代码: 代码

DE>[Pn]=tramnmx(P,minp,maxp)DE>

其中 P 和 Pn 分别为变换前、后的输入数据,maxp 和 minp 分别为 premnmx 函返回的最大 值 maxp 和最小值 minp。 2、prestd、poststd、trastd 归化数据到(0,1) 用法与 1 差不多。详细可以 help prestd。 上述两种方法是可以相互转化的,比如,第一种归化后的数据为 p,则(1+p)./2 的结果就是 第二种了 3、mapminmax()将数据归一化到(-1,1),是 6.5 中**mnmx 系列的替换函数 该函数同时可以执行归一化、 反归一化和归一化其他数据的功能, 具体看帮助和后面的实例 复制内容到剪贴板
代码: 代码

DE>% 归一化数据输入为 p,输出为 t [normInput,ps] = mapminmax(p); [normTarget,ts] = mapminmax(t); % 反归一化 trainOutput = mapminmax('reverse',normTrainOutput,ts); trainInsect = mapminmax('reverse',trainSamples.T,ts); validateOutput = mapminmax('reverse',normValidateOutput,ts); validateInsect = mapminmax('reverse',validateSamples.T,ts); testOutput = mapminmax('reverse',normTestOutput,ts); testInsect = mapminmax('reverse',testSamples.T,ts); %例子: x1 = [1 2 4; 1 1 1; 3 2 2; 0 0 0] [y1,PS] = mapminmax(x1,0,1)% 归化到 [0,1],若不填,则默认为[-1,1] %还原: x1_again = mapminmax('reverse',y1,PS)DE> 4、mapstd()将数据归一化到(0,1),是 6.5 中**std 系列的替代函数 同理,3 和 4 两种方法是可以相互转化的,比如,第一种归化后的数据为 p,则(1+p)./2 的 结果就是第二种了。 5、自己写归一化函数,这个网上很多,大家可以百度下

输入训练数据的乱序排法, 输入训练数据的乱序排法,以及分类 注意: 版本还可以使用 注意:dividevec()函数在 7.6 版本还可以使用 函数在

把数据重新打乱顺序,进行输入,可以让数据更加具备典型性和更优良的泛化能力! 把数据进行打乱,并分类为:训练输入数据、变量数据、测试数据的方法 我用百度搜了一下,发现有些方法,但居然很少看到使用 matlab 内部函数直接进行的,其 实 matlab 自带的内部函数 dividevec,完全能胜任上述工作,推荐! 但这个存在一个问题是,因为打乱了,最后分析结果的时候,数据重新排列困难,因为丢失 了数据在数组中的位置参数。具体用法可以参见下面我的 bp 交通预测的例子。 因为我用的 7.0 版本,Neural Network Toolbox Version 5.0.2 (R2007a)

昨天,我去 mathworks 公司查看了一下 nnet 的新手册,上述问题得到了解决,里面视乎没 有介绍 dividverc 这个函数了,但增加了新的函数来完成上述功能,并返回标号(手头没装 新版本 Neural Network Toolbox Version 6.0 (R2008a)),看 guide 大概是这个意思(有 新版本的,可以试一下,这个函数是不是这个意思): divideblock,divideind,divideint 和 dividerand , , 上述函数,用法和功能基本相同,只是打乱的方法不一样,分别是 block 方法抽取、按数组 标号自定义抽取、交错索引抽取和随机抽。 下面以 divideblock 为例,讲解其基本用法: 复制内容到剪贴板
代码: 代码

DE>[trainV,valV,testV,trainInd,valInd,testInd] =divideblock(allV,trainRatio,valRatio,testRatio) [训练数据,变量数据,测试数据,训练数据矩阵的标号,,变量数据标号,测试数据标号] =divideblock(所有数据,训练数据百分比,变量数据百分比,测试数据百分比)DE> 其实 dividevec 和后面四个分类函数的区别在于, dividevec 一般直接在 Matlab 代码中调用。 而后面四个函数是通过设置网络的 divideFcn 函数来实现,比如, net.divideFcn='divideblock',但不是说不可以在代码中像 dividevec 直接调用 如何查看和保存结果 训练好的权值、阈值的输出方法是: 输入到隐层权值: 复制内容到剪贴板
代码: 代码

DE>w1=net.iw{1,1}DE> 隐层阈值: 复制内容到剪贴板
代码: 代码

DE>theta1=net.b{1}DE> 隐层到输出层权值: 复制内容到剪贴板
代码: 代码

DE>w2=net.lw{2,1};DE> 输出层阈值: 复制内容到剪贴板
代码: 代码

DE>theta2=net.b{2}DE> 训练好的 BP 神经网络保存: 复制内容到剪贴板
代码: 代码

DE>%保存 save file_name net_name%Matlab 自动将网络保存为 mat 数据文件,下次使用时可以直接 载入 %载入 load file_nameDE> 每次结果不一样问题 因为每次初始化网络时都是随机的, 而且训练终止时的误差也不完全相同, 结果训练后的权 植和阀也不完全相同(大致是一样的),所以每次训练后的结果也略有不同。 找到比较好的结果后,用命令 save filen_ame net_name 保存网络,可使预测的结果不会变 化,在需要的调用时用命令 load filename 载入。 关于如何找到比较好的结果,进行保存,可以设置误差,在循环中保存,具体使用可以参看 bp 交通预测优化后的例子

—bp 考拉 BP 神经网络的 matlab 实现学习历程 四) ( 神经网络进行交通预测的 Matlab 源代码
本文《考拉 BP 神经网络的 matlab 实现学习历程》系列由论坛超级版主 akjuan 整理和原 《 实现学习历程》 超级版主 创,我们在此表示特别感谢

根据前面三节的学习内容,可以基本编写一个 BP 神经网络,来处理一些问题了。 下面我给出一个 bp 神经网络进行交通预测的 Matlab 源代码,里面备有较为详细的注释, 供给初学者! 复制内容到剪贴板
代码: 代码

DE>%bp 神经网络进行交通预测的 Matlab 源代码 % BP 神经网络用于预测 % 使用平台 - Matlab7.0 % 数据为 1986 年到 2000 年的交通量 ,网络为 3 输入,1 输出 % 15 组数据,其中 9 组为正常训练数据,3 组为变量数据,3 组为测试数据 %by akjuan %all rights preserved by www.4math.cn %2008.11 clc clear %--------------------------------------------------%原始数据 %--------------------------------------------------year=1986:2000;%数据是从 1986 到 2000 年的 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);

%--------------------------------------------------% 设置网络参数 %--------------------------------------------------NodeNum1 = 20; % 隐层第一层节点数 NodeNum2=40; % 隐层第二层节点数 TypeNum = 1; % 输出维数 TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';%各层传输函数,TF3 为输出层传输函数 %如果训练结果不理想,可以尝试更改传输函数,以下这些是各类传输函数 %TF1 = 'tansig';TF2 = 'logsig'; %TF1 = 'logsig';TF2 = 'purelin'; %TF1 = 'tansig';TF2 = 'tansig'; %TF1 = 'logsig';TF2 = 'logsig'; %TF1 = 'purelin';TF2 = 'purelin'; %注意创建 BP 网络函数 newff()的参数调用,在新版本(7.6)中已改变 net=newff(minmax(normInput),[NodeNum1,NodeNum2,TypeNum],{TF1 TF2 TF3},'traingdx');%创建四层 BP 网络

%--------------------------------------------------% 设置训练参数 %--------------------------------------------------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 = 'trainrp'; % RPROP(弹性 BP)算法,内存需求最小 % % (共轭梯度算法) % net.trainFcn = 'traincgf'; % Fletcher-Reeves 修正算法 % net.trainFcn = 'traincgp'; % Polak-Ribiere 修正算法,内存需求比 Fletcher-Reeves 修正算 法略大 % net.trainFcn = 'traincgb'; % Powell-Beal 复位算法,内存需求比 Polak-Ribiere 修正算法略 大 % % (大型网络的首选算法) %net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient 算法,内存需求与 Fletcher-Reeves 修正算法相同,计算量比上面三种算法都小很多 % net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需 求均比共轭梯度算法大,但收敛比较快 % net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比 BFGS 算 法小,比共轭梯度算法略大 % % (中型网络的首选算法) %net.trainFcn = 'trainlm'; % Levenberg-Marquardt 算法,内存需求最大,收敛速度最快 % net.trainFcn = 'trainbr'; % 贝叶斯正则化算法 % % 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm' 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

%--------------------------------------------------% 数据分析和绘图 %--------------------------------------------------figure plot(1:12,[trainOutput validateOutput],'b-',1:12,[trainInsect validateInsect],'g--',13:15,testOutput,'m*',13:15,testInsect,'ro'); title('o 为真实值,*为预测值') xlabel('年份'); ylabel('交通量(辆次/昼夜)');DE> 运行后的结果如下图,注意该程序是在 7.0 版本上实验的,没法在 6.5 版本运行,因为 6.5 版本的归一化函数被遗弃了;在 7.6 以上版本没有没法运行,因为 newff 函数参数形式改变 了。但是只要将上面提到部分相应修改下,就可以运行了 正常数据,是用来正常训练用 变量数据,主要目的是防止训练中出现过拟合状态

测试数据,是用来看训练效果的

—bp 考拉 BP 神经网络的 matlab 实现学习历程 五) ( 神经网络进行交通预测程序优化
本文《考拉 BP 神经网络的 matlab 实现学习历程》系列由论坛超级版主 akjuan 整理和原 《 实现学习历程》 超级版主 创,我们在此表示特别感谢

在第四节,给出的 BP 网络进行交通预测的程序,是个基本模式,更改少数几处参数后,可 用于其它方面! 但通过程序运行后,可以看出,预测效果并不理想,如何得到理想的预测训练结果,下面是 基本思路及 matlab 的实现: 1、设置一个误差项,为测试数据的网络仿真结果和实际结果偏差,并设置一个自己能接受 的精度值 2、每次训练网络后,将这个误差和设置值比较,也可通过测试获得网络能给出的最高预测 精度 3、得到满意训练网络后,保存 BP 结果,以便下次调用 下面这个程序是在第四节程序基础上优化而来, 可以运行前面的程序和这个程序, 比较两者 的差别,可以通过修改 eps 来控制预测的误差! 复制内容到剪贴板
代码: 代码

DE>%bp 神经网络进行交通预测的 Matlab 源代码 % BP 神经网络用于预测 % 使用平台 - Matlab7.0

% 数据为 1986 年到 2000 年的交通量 ,网络为 3 输入,1 输出 % 15 组数据,其中 9 组为正常训练数据,3 组为变量数据,3 组为测试数据 %by akjuan %all rights preserved by www.matlabsky.cn %2008.11 clc clear All_error=[];%所有误差存储 %--------------------------------------------------%原始数据 %--------------------------------------------------year=1986:2000;%数据是从 1986 到 2000 年的 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 为输出层传输函数 %如果训练结果不理想,可以尝试更改传输函数,以下这些是各类传输函数 %TF1 = 'tansig';TF2 = 'logsig'; %TF1 = 'logsig';TF2 = 'purelin'; %TF1 = 'tansig';TF2 = 'tansig'; %TF1 = 'logsig';TF2 = 'logsig'; %TF1 = 'purelin';TF2 = 'purelin';

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 = 'trainrp'; % RPROP(弹性 BP)算法,内存需求最小 % % (共轭梯度算法) % net.trainFcn = 'traincgf'; % Fletcher-Reeves 修正算法 % net.trainFcn = 'traincgp'; % Polak-Ribiere 修正算法,内存需求比 Fletcher-Reeves 修正算 法略大 % net.trainFcn = 'traincgb'; % Powell-Beal 复位算法,内存需求比 Polak-Ribiere 修正算法略 大 % % (大型网络的首选算法) %net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient 算法,内存需求与 Fletcher-Reeves 修正算法相同,计算量比上面三种算法都小很多 % net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需 求均比共轭梯度算法大,但收敛比较快 % net.trainFcn = 'trainoss'; % One Step Secant Algorithm,计算量和内存需求均比 BFGS 算 法小,比共轭梯度算法略大 % % (中型网络的首选算法) %net.trainFcn = 'trainlm'; % Levenberg-Marquardt 算法,内存需求最大,收敛速度最快 % net.trainFcn = 'trainbr'; % 贝叶斯正则化算法 % % 有代表性的五种算法为:'traingdx','trainrp','trainscg','trainoss', 'trainlm' 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('误差变化图')DE> 运行后的结果如下图,注意该程序是在 7.0 版本上实验的,没法在 6.5 版本运行,因为 6.5 版本的归一化函数被遗弃了;在 7.6 以上版本没有没法运行,因为 newff 函数参数形式改变 了。但是只要将上面提到部分相应修改下,就可以运行了 正常数据,是用来正常训练用 变量数据,主要目的是防止训练中出现过拟合状态 测试数据,是用来看训练效果的

来自: http://hi.baidu.com/%D0%A1%B7%BC%CF%C4/blog/item/dc0e3264f9445c49ebf8f8d0.html



更多相关文章:
BP神经网络的matlab实现学习历程.doc
BP神经网络的matlab实现学习历程 - 一位大牛学习BP神经网络的matlab实现学习历程,对新手学习神经网络有一定帮助!
BP人工神经网络matlab实现.ppt
BP人工神经网络matlab实现_理学_高等教育_教育专区...BP学习算法=前向计算过程+误差反向传播过程 前向...
BP神经网络的matlab实现学习历程..doc
BP神经网络的matlab实现学习历程. - 考拉 BP 神经网络的 matlab 实现学习历程(一) 考拉 BP 神经网络的 matlab 实现学习历程(一) 本文《考拉 BP 神经网络的 m....
bp神经网络matlab实现.doc
bp神经网络matlab实现 - bp 神经网络matlab 实现 分类: 算法学习 2012-06-20 20:56 66399 人阅读 评论(28) 收藏 举报 网络 matlab 算...
BP神经网络matlab实例(简单而经典).doc
BP神经网络matlab实例(简单而经典) - 学习神经网络的好助手,可以仿照其中的代码,只需修改个别参数便可以轻易实现自己需要完成的任务。 1、BP 网络构建 (1)生成 ...
考拉BP神经网络的matlab实现学习历程.txt
考拉BP神经网络的matlab实现学习历程 - 本文《考拉BP神经网络的matlab实现学习历程》系列由论坛超级版主akjuan整理和原创,我们在此表示特别感谢 这两天在学习bp,总结...
BP神经网络MATLAB实例(简单而经典)_2.pdf
BP神经网络MATLAB实例(简单而经典)_2 - 学习神经网络的好助手,可以仿照其中的代码,只需修改个别参数便可以轻易实现自己需要完成的任务。 p=p1';t=t1'; [pn,...
BP神经网络matlab教程解析_图文.ppt
BP神经网络matlab教程解析 - BP神经网络模型与学习算法 概述 ?Rumelhart,McClelland于1985年提出了BP网络的误...
bp神经网络matlab实现资料.doc
bp神经网络matlab实现资料 - bp 神经网络matlab 实现 分类: 算法学习 2012-06-20 20:56 66399 人阅读 评论(28) 收藏 举报 网络 matlab...
BP神经网络的MATLAB实现--研究生结课论文.doc
BP神经网络的MATLAB实现--研究生结课论文_工学_高等教育_教育专区。研究生期间...然而,在针对实际问题的 BP 网络建模过程中,选 择多少层网络,每层多少个神经元...
提供一个Matlab的BP神经网络的基础资料.doc
提供一个Matlab的BP神经网络的基础资料_数学_自然...让这些数据做了个平移, 这就是神经 元工作的过程...(进行类型划 分,模式识别等),在后面的学习中,都...
BP神经网络matlab教程_图文.ppt
BP神经网络matlab教程_计算机软件及应用_IT/计算机_专业资料。BP神经网络模型与...信号的正向传播 误差的反向传播 2.4.2 BP网络的标准学习算法-学习过程 ?正向...
BP神经网络预测的MATLAB实现.pdf
BP神经网络预测的MATLAB实现 - 2009年 3 月第 1期 哈尔滨金融高
BP神经网络matlab实例(简单而经典).doc
BP神经网络matlab实例(简单而经典) - 学习神经网络的好助手,可以仿照其中的代码,只需修改个别参数便可以轻易实现自己需要完成的任务。 1、BP 网络构建 (1)生成 ...
BP神经网络matlab工具箱和matlab实现使用实例.doc
BP 神经网络 matlab 工具箱和 matlab 实现使用实例经过最近一段时间的神经网络学习,终于能初步使用 matlab 实现 BP 网络仿真试验。这里特别 感谢研友 sistor2004 的...
BP神经网络预测的MATLAB实现_图文.pdf
BP神经网络预测的MATLAB实现 - 2009年3月第l期 哈尔滨金融高等专科
matlabBP神经网络预测程序_图文.pdf
matlabBP神经网络预测程序_数学_自然科学_专业资料。 您的评论 发布评论 用户评价 用matlabBP神经网络预测程序,如何下载 2018-06-28 23:06:36 力荐,...
BP神经网络的MATLAB编程实现及讨论_图文.pdf
BP神经网络的MATLAB编程实现及讨论 - 维普资讯 http://www.c
matlabBP神经网络预测程序加一个优秀程序.doc
求用matlabBP 神经网络预测程序 求一用 matlab的程序 P=[。。。];...r)组成 ,其学习过程分为信息的 正向传播过程和 误差的反向传播过程两个阶段 ...
BP神经网络MATLAB编程代码.doc
BP神经网络MATLAB编程代码_计算机软件及应用_IT/...附加动量因子的梯度下降学习函数 net.trainParam....[],vv,vt); %绘出训练过程中各误差的变化曲线 ...
更多相关标签:

All rights reserved Powered by 甜梦文库 9512.net

copyright ©right 2010-2021。
甜梦文库内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图