精华内容
下载资源
问答
  • 局部最优和鞍点   造成神经网络难以优化的一个重要(乃至主要)原因不是高维优化问题中有很多局部极值,而是存在大量鞍点。   吴恩达视频中讲的,虽然没有理论的证明,局部最小值就是全局最小值,但是很多实际的...

    局部最优和鞍点

      造成神经网络难以优化的一个重要(乃至主要)原因不是高维优化问题中有很多局部极值,而是存在大量鞍点。
      吴恩达视频中讲的,虽然没有理论的证明,局部最小值就是全局最小值,但是很多实际的经验告诉我们,最后,只能收敛到一个最小值,也就是说,很多现实实际问题是只有一个最小值的。但这个最小值通常是鞍点。

    认识鞍点的历史

      BP算法自八十年代发明以来,一直是神经网络优化的最基本的方法。神经网络普遍都是很难优化的,尤其是当中间隐含层神经元的个数较多或者隐含层层数较多的时候。长期以来,人们普遍认为,这是因为较大的神经网络中包含很多局部极小值(local minima),使得算法容易陷入到其中某些点。这种看法持续二三十年,至少数万篇论文中持有这种说法。举个例子,如著名的Ackley函数 。对于基于梯度的算法,一旦陷入到其中某一个局部极值,就很难跳出来了。

      到2014年,一篇论文《Identifying and attacking the saddle point problem in high-dimensional non-convex optimization》(https://arxiv.org/pdf/1406.2572v1.pdf)。
      指出高维优化问题中根本没有那么多局部极值。作者依据统计物理,随机矩阵理论和神经网络理论的分析,以及一些经验分析提出高维非凸优化问题之所以困难,是因为存在大量的鞍点(梯度为零并且Hessian矩阵特征值有正有负)而不是局部极值。

      这个问题目前仍有讨论,不过大体上人们接受了这种观点,即造成神经网络难以优化的一个重要(乃至主要)原因是存在大量鞍点。造成局部极值这种误解的原因在于,人们把低维的直观认识直接推到高维的情况。在一维情况下,局部极值是仅有的造成优化困难的情形(Hessian矩阵只有一个特征值)。该如何处理这种情况,目前似乎没有特别有效的方法。

    理解鞍点,以及如何有效地避开它们

      大家都知道局部最小值是我们的克星,所以一个重要的问题就是如何避免局部最小值。但问题并不明显,有很多机器学习的问题没有局部最小值。即使你有局部最小值,梯度下降似乎可以轻松回避它们。神经网络如果足够大的话就会有足够的冗余,要做到这一点并不难。达到零就是全局最优解。
      如果一个回路的局部最大值不是问题,它的鞍点是剩下需要解决的。
      鞍点在这些体系结构中大量存在,不论是在简单的模型还是在神经网络中。它们会导致学习曲线变平。你会经常看到一个学习曲线下降很快,之后很久都是平的。这就是靠近鞍点的表现。最终你会逃离鞍点。
      继续下去,你可能会碰到另一个鞍点。你会看到一个学习曲线,它这样上升和下降。某种意义上,这不是问题,如果你最终得到正确答案。但是你可能会碰到一个鞍点并在那里停滞很长一段时间,时间过久,以至于你都不知道在某个地方能找到更好的答案。特别是如果你没有那么多时间来运行你的算法。所以你可以在多维度中理解这个。

      让我给你们看一张鞍点的图片。在左边我们有一个“严格”的鞍点。有一个负曲率的方向,这个负曲率是严格小于零的。在右边,它是个非严格鞍点,但第二个特征值严格为零。

    如何逃离鞍点?

      如果你沿着中间部分往下走,你最终会摆脱它,但这可能需要很长时间。这只是两个维度上,但如果你有上十万甚至上百万维度呢?就像现在一般的研究中一样。在这种情况下,可能只有一条出路,其他的方向都不行,所以要找到逃逸的方向可能要花很长时间。当维度越来越大的时候,就有问题了。基于梯度下降的算法可能会有麻烦。
      只用一阶导数是难以区分最优点和鞍点的。但如果你有一个海森矩阵,这个问题将会消失,因为你会知道所有的方向,但你必须计算一个海森矩阵的特征向量。这两种情况都不好,因为它太复杂了也太慢。所以,梯度方法是个问题。

      我们想一下,最优点和鞍点的区别不就在于其在各个维度是否都是最低点嘛~只要某个一阶导数为0的点在某个维度上是最高点而不是最低点,那它就是鞍点。而区分最高点和最低点当然就是用二阶导数(斜率从负变正的过程当然就是“下凸”,即斜率的导数大于0,即二阶导数大于0。反之则为“上凹”,二阶导数小于0)。也就是说,若某个一阶导数为0的点在至少一个方向上的二阶导数小于0,那它就是鞍点啦。
      那么二阶导数大于0和小于0的概率各是多少呢?由于我们并没有先验知识,因此按照最大熵原理,我们认为二阶导数大于和小于0的概率均为0.5!

      那么对于一个有n个参数的机器学习/深度学习模型,“loss曲面”即位于n+1维空间(loss值为纵轴,n个参数为n个横轴)。在这个空间里,如果我们通过梯度下降法一路下滑终于滑到了一个各方向导数均为0的点,那么它为局部最优点的概率即0.5^ n,为鞍点的概率为1-0.5^n,显然,当模型参数稍微一多,即n稍微一大,就会发现这个点为鞍点的概率会远大于局部最优点!

    实际操作中避开鞍点

      使用的mini-batch梯度下降法本身就是有噪声的梯度估计,哪怕我们位于梯度为0的点,也经常在某个mini-batch下的估计把它估计偏了,导致往前或者往后挪了一步摔下马鞍,也就是mini-batch的梯度下降法使得模型很容易逃离特征空间中的鞍点。

      更多的,我们可以从以下方面考虑:
      1)如何去设计一个尽量没有“平坦区”等危险地形的loss空间,即着手于loss函数的设计以及深度学习模型的设计;
      2)尽量让模型的初始化点远离空间中的危险地带,让最优化游戏开始于简单模式,即着手于模型参数的初始化策略;
      3)让最优化过程更智能一点,该加速冲时加速冲,该大胆跳跃时就大胆跳,该慢慢踱步时慢慢走,对危险地形有一定的判断力,如梯度截断策略;
      4)开外挂,本来下一步要走向死亡的,结果被外挂给拽回了安全区,如batch normalization策略等。

    展开全文
  • 思维进化算法有极强的全局搜索能力,能够弥补BP神经网络陷入局部最优和对初始权值和阈值敏感的问题,因此在训练BP神经网络之前,利用思维进化算法获取该网络的初始权值和阈值。实验证明,与传统的维纳滤波、BP、遗传...
  • 基于遗传算法优化的BP神经网络是科研中的常用方法,通过遗传算法优化初始神经网络的权值阈值,使模型更快收敛,同时降低陷入局部最优的可能,本资源代码中,只需更改加载数据,拿来即用。
  • 针对BP神经网络对初始权重敏感,容易陷入局部最优,人工蜂群算法局部搜索能力和开发能力相对较弱等问题,提出一种基于改进人工蜂群和反向传播的神经网络训练方法。引进差分进化思想改进人工蜂群算法,并对跟随蜂的...
  • 说明,这个matlab程序的目标是对BP神经网络中的神经元连接权和阈值构成的高维参数空间进行最优求解,试图用PSO算法求解神经网络中的参数,而不是用传统的误差反传算法。但由于经典粒子群算法存在局部最优的问题。该...
  • 针对基于传统BP神经网络的井下定位算法存在收敛速度慢、易形成局部极值、在煤矿井下强时变性电磁环境中定位误差大等问题,提出了一种基于模拟退火思想的粒子群优化算法加BP神经网络(SAPSO-BP)的井下自适应定位算法...
  • 传统的BP神经网络通过梯度下降法来调整网络的权值和阈值,使网络存在易陷入局部最优且收敛速度慢等缺陷,在很大程度上限制了BP神经网络的应用。针对BP网络存在的不足,提出利用自适应花授粉算法来优化BP网络的权值和...
  • 为提高BP神经网络预测模型的预测准确性,提出了一种基于改进粒子群算法优化BP神经网络的混沌时间序列预测方法。引入自适应变异算子对陷入局部最优的粒子进行变异,改进了粒子群算法的寻优性能; 利用改进粒子群算法...
  • 以6种水化离子浓度作为判别突水来源的依据,为克服人工神经网络采用标准BP算法修正初始权值和阈值所带来的具有随机性和易陷入局部最小缺点,拟采取具有全局最优功能的遗传算法(GA)优化BP神经网络,从而建立突水水源的GA...
  • 摘要穴位的位置是否找准会直接影响治疗效果,因此设计了一种基于粒子群算法优化神经网络(PSO-BP)的...实验结果表明:经粒子群优化过的BP神经网络有效地改善了局部极值缺陷,可应用于定位端预测穴位的位置,并在LC...
    f42d1b48b572472645630266b3d2217f.gif

    摘要

    穴位的位置是否找准会直接影响治疗效果,因此设计了一种基于粒子群算法优化神经网络(PSO-BP)的穴位相对坐标预测模型,然后与ARM结合构成一个可以用于人体穴位定位的系统。首先采用PC进行MATLAB仿真训练学习,然后将最优权值及阈值保存下来并简化算法嵌入ARM内,将在线预测转变为离线过程。实验结果表明:经粒子群优化过的BP神经网络有效地改善了局部极值缺陷,可应用于定位端预测穴位的位置,并在LCD中显示穴位相关信息,控制端收到位置数据后可执行电机上的运动操作。

    狭义的家装:指室内装饰;是从美化的角度来考虑的,以使室内的空间更美观;

    广义的家装:包括室内空间的改造、装修;今天我们说的家装多为广义的家装,是室内装修和装饰的综合。

    中文引用格式:杨向萍,吴玉丹. 基于PSO-BP神经网络的人体穴位定位系统设计[J].电子技术应用,2018,44(9):75-78.

    英文引用格式:Yang Xiangping,Wu Yudan. Acupoint positioning system based on PSO-BP neural network[J]. Application of Electronic Technique,2018,44(9):75-78.

    0 引言

    人体穴位分布容易受到人体尺寸和比例的影响,所以具有以下两个特性:非线性、模糊不确定性。人体穴位分布的解决方法主要有3种:视觉技术、光学定位法和专家系统法。但是这些方法存在着一些不足:视觉技术采用的是二维视觉测量结合图像处理进行人工标志穴位定位,庞大的分析系统降低了定位的实时性,并且应用场合有局限[1];光学定位法可模拟人眼得出物体的三维坐标达到定位目的,但是定位标靶和周围环境背景都会给定位造成极大的干扰,降低定位精度[2];专家系统法是整合专家经验知识,在实际应用中很难将这些经验转化成一系列规则。

    人工智能和仿生技术的发展,出现了很多基于人工智能的预测方法。为了提高中医按摩机器人穴位寻找行为规划的精度,山东建筑大学提出了一种基于遗传算法优化BP神经网络的中医按摩机器人穴位坐标预测方法。结果表明,该方法对中医按摩机器人寻找患者穴位坐标具有较好的精度和预测准确性[3]。由于遗传算法的交叉变异部分会使整个收敛过程变慢,在实际应用中,稳定性可能会比较低。而粒子群算法过程比较简单,所以采用粒子群算法优化BP神经网络算法建立稳定准确的穴位坐标预测模型[4],简化学习过程后将过程移植进ARM[5-6]。最后测试表明:优化后的BP神经网络具有更快的收敛性和适应性,还有比较高的预测精度和稳定性。

    本文提出的整体系统设计方案是基于ARM和PSO-BP的人体穴位定位,该系统还具备穴位坐标实时显示及穴位信息播报的功能。由于整个算法的学习过程比较复杂,循环次数非常多,会拖慢整个系统的运行速度,因此在PC上完成整个动态学习过程然后将最优权值及阈值保存输出,并将简化后的算法嵌入ARM内,实际使用时直接根据提示输入信息后即可达到穴位定位的目的。

    1 PSO-BP神经网络

    1.1 算法模型设计

    BP神经网络是目前应用最为广泛和成功的神经网络之一,该网络的特点是信号前向传递,误差反向传播调整网络的权值和阈值。BP神经网络的拓扑结构包括输入层(input)、隐含层(hide layer)和输出层(output layer),如图1所示,最终系统想要达到的效果是输入已知的某穴位坐标值(X坐标,Y坐标),然后预测出其他3个穴位的坐标值。

    e7700426b409e6251ea83b29cc23843c.png

    系统设计的BP神经网络结构采用可以预测几乎所有的非线性函数的三层拓扑结构,输入层神经元为2,输出层神经元为6。对于隐含层(中间层)的神经元数目的选取采用式(1)来确定[7]

    462e0c36a3d9b348c880767ca555d0ea.png

    其中,MidNum为隐层节点数,InNum、OutNum分别是输入和输出节点数,a是1~10之间的常数。

    最后BP神经网络的拓扑结构为2 —8—6;训练函数采用“taingdx”;隐含层和输出层选取的传递函数均为“tansig”;选择的训练次数为3 000;训练目标误差为0.000 1。

    粒子群(PSO)算法用于网络训练可以对权值和阈值的选取进行优化,而不是盲目地给定初值,而且优化过的神经网络会防止神经网络陷入局部最优并提高精度。因此PSO优化BP神经网络的核心是:BP网络中的权值和阈值的集合是群体中的每个粒子的位置集合,其个数是粒子的维度。然后对神经网络进行迭代优化训练,网络的输出误差作为算法的适应度函数即式(2)。

    b862e09de615b72a8cadec964fb935f4.png

    式中,S是学习训练样本,Tk是期望输出,Yk是实际输出。整个算法流程如图2所示。

    f99038f9e1750742ed0504156703e891.png

    1.2 MATLAB仿真

    以人体的背部为例,穴位是有规律分布的,所以将大椎穴作为坐标原点(0,0)建立坐标系,然后选取大柕穴的相对坐标作为输入,目标输出为脾俞、膈关和命门的相对坐标。仿真训练测量了70组不同测试者的穴位相对坐标,随机选取其中的60组作为学习样本,剩下的10组作为测试样本训练神经网络。

    在MATLAB中进行编程,粒子群算法反复迭代200次后将粒子编码转换成BP神经网络的初始的阈值和权值再继续网络的学习过程。仿真结果如图3所示,可发现均方误差随着训练的次数增加在逐渐变小,直到训练1 015次时可达到要求的误差值。

    c4e24df7597de53b2dbedaa71c6f89cb.png

    为了方便清晰观察,以第一组预测数据为例通过MATLAB输出预测曲线图,如图4所示,可以看出预测值非常接近实际值,初步证明预测模型的建立是正确的。

    e42a755f05d5af0b5e515538cf3b6014.png

    最后计算PSO-BP算法数据的预测值和实际值的绝对误差,输入一组大柕穴的坐标(X轴:24 mm,Y轴:24 mm),如表1所示,绝对误差没有超过10 mm,可以看出神经网络对穴位位置的预测精度可以保证在10 mm以内,满足定位要求。

    d5934a02af113466e37903948eb3fdf7.png

    2 系统硬件设计

    系统采用双机通信和独立电源的方式来工作,主要分为两部分:主机是穴位定位系统实现穴位预测功能,从机为位置控制系统实现穴位实现功能。系统的整体硬件结构如图5所示。

    3db597eab8cf17e60cd6ba3014eb5ea6.png

    2.1 穴位定位系统

    这部分主要以可视听为目的,按键采用的是4×4行列式的排列,包括0~9数字键和确认取消键。使用3.2寸TFT LCD液晶屏进行参数输入和预测结果的显示。按键输入所需穴位坐标值,此时在LCD可监视输入是否正确,按下确认键后便可执行编写好的预测程序,并在液晶屏上显示输出的穴位坐标值同时通过WiFi向位置控制系统发送坐标值。

    2.2 位置控制系统

    这部分是控制操作为主,当WiFi连接成功后会有语音提示然后启动电机,电机控制模块有4个直线步进电机,其中分别对应了背部3条主要经络督脉和两条足太阳膀胱经。穴位定位系统发出相应的穴位位置后,电机带动装置移动到对应位置,移动结束LED指示灯亮起提醒使用者操作已完成,如果控制系统接收到的位置信息有误,蜂鸣器会发出三声声警报。最后操作无误语音会播报相应的穴位相关信息,便于使用者了解穴位的相关知识和治疗功效。

    3 PSO-BP算法简化软件设计

    整个算法体系非常庞大,而且数据的处理形式都是以浮点数进行的,单片机的计算能力有限,所以考虑将算法简化后移植进穴位定位系统的主芯片中。思路是首先利用MATLAB训练出神经网络的最佳权值和阈值矩阵,然后将神经网络导出移植到ARM中。对于定点CPU来说必须要按照IEEE-754标准算法来完成运算,会耗费大量的时间。系统使用的定位芯片STM32F407I属于Cortex-M4F架构,带有32位单精度硬件FPU,支持浮点指令集,相对于Cortex-M0和Cortex-M3等,高出数十倍甚至上百倍的运算性能。

    神经网络算法主要分为两个阶段:第一为学习阶段,这个阶段的任务就是通过反向误差传播调节最适权值和阈值,PSO算法主要就是优化这个过程,寻找到最优的初始权值及阈值给网络;第二为应用阶段,这一阶段就是使用达到要求的权值及阈值来解决实际的问题。第一阶段需要做大量的循环并且PSO算法的加入使这一过程的计算量更大,所以采取将第二阶段用C语言输出融合进ARM芯片中的方案。

    利用MATLAB搭建神经网络学习框架对这一过程进行在线训练,提取出输入层及隐含层的权值及阈值,将这些训练好的参数以浮点数数组的形式存入ARM中。接下来就是在ARM中应用神经网络算法对人体穴位位置进行预测,这一部分是将数据输入给一个已知结构的神经网络,然后对网络的前向过程进行求解。

    简化后过程包含归一化处理、神经元乘加运算和传递函数计算。归一化处理是将输入数据的值限制在[0,1]之间,这样统一标准会提高数据的精确性。系统采用的方法是离差标准化,对原始数据进行线性变换,转换函数为:

    ad688de2941909bc44a8d61a85c34963.png

    其中Xmax为样本数据的最大值,Xmin为样本数据的最小值。接下来神经元的加乘过程如图6所示。

    2bd0b1f542970bc34c2af79b670e89fb.png

    所以加乘运算的公式为:

    0f8c68b6d452e4f47d4c420476b7e7a2.png

    这个公式涉及的两个关键参数权值Wkn和偏置bk,在ARM中转换成float可以精确到小数点后7位。

    传递函数的选择是非线性双曲正切S型函数tanh,在STM32F4的函数库内没有这个双曲正切函数,所以要采用泰勒展开的形式化简。tanh的公式为:

    47713490f86b851e27c396afa1204c15.png

    将e2x展开结果带入式(6)中,精度可达到小数点后4位。

    STM32F4采用硬件开启FPU的方式,首先将协处理器控制寄存器(CPACR)的第20~23设为1,然后在编译器Code Generation中设置Use FPU开启FPU的硬件使能。将上述3个部分转换成3个C语言程序子程序,然后在主程序中依次调用即可达到实时输出预测结果的目的。整个系统的软件设计如图7所示。

    f7cb6a8f84d0526b4a78e9ba22221342.png

    4 硬件测试与结果分析

    将算法简化程序写进STM32F4中,向定位系统输入一组大柕穴的坐标(X轴:24 mm,Y轴:24 mm)然后在LCD液晶屏上记录下预测结果,同样采用相对误差作为衡量指标,如表2所示。

    5a5de6e98b73c846bfaa51a6fda1fb7d.png

    从表2中可以看出预测的绝对误差没有超过15 mm,但是相对于MATLAB给出的预测结果(表1)准确性下降了。原因是从MATLAB中导出参数以浮点数形式存入ARM时会影响精度,而且对于传递函数的泰勒展开时也会牺牲掉一些精度,这些损失叠加后会对最后位置输出的准确性造成影响。

    5 结束语

    本文设计了基于ARM和PSO-BP的人体穴位定位系统,该系统可以根据输入大柕穴的位置后预测出命门、脾俞、膈关的穴位坐标。因为BP神经网络容易陷入局部最优,所以加入了PSO算法对其进行优化处理,然后在STM32F407I中嵌入PSO-BP简化算法软件,可以进行实时穴位坐标预测。实验表明该系统可以比较好地预测出穴位位置,然后控制电机移动到相应位置,再进行微调,完成对穴位定位。

    参考文献

    [1] 马哲文,于豪光.基于视觉定位的按摩机器人穴位跟踪系统[J].机器人技术与应用,2010(6):33-35.

    [2] 林雪华.光学定位法人体经络可视化中提高精度方法的研究[D].福州:福州大学,2014.

    [3] 张秋云,张营,李臣.遗传算法优化BP神经网络在中医按摩机器人中的应用[J].应用科技,2017,44(2):73-77.

    [4] 徐顺,卢文科,左锋.基于PSO-BP神经网络的光纤压力传感器温度补偿研究[J].仪表技术与传感器,2016(10):1-5,9.

    [5] 李锐,熊杰.基于BP神经网络的原油持水率检测仪[J].仪表技术与传感器,2017(10):29-32.

    [6] 赵延军,程守光,高承彬,等.基于BPNN的固相质量流量软测量方法[J].仪表技术与传感器,2014(7):103-105.

    [7] 黄家才,李宏胜,滕福林,等.BP网络在阻抗式原油含水率测量仪中的应用[J].仪表技术与传感器,2011(12):24-26.

    作者信息:

    杨向萍,吴玉丹

    (东华大学 机械工程学院,上海201600)

    6a0db3708f80baa737851522bd676aaa.gifc789e6ccb3398ff05d46e288b949349b.png
    展开全文
  • 基于遗传算法的BP神经网络

    千次阅读 2019-04-14 16:32:40
    基于遗传算法的BP神经网络 源码地址:https://github.com/Grootzz/GA-BP 介绍: 利用遗传算法并行地优化BP网络的权值和阈值,从而避免了BP网络在优化权值和阈值时陷入局部最优的缺点 背景: 这个项目的背景为客运量...

    基于遗传算法的BP神经网络

    源码地址:https://github.com/Grootzz/GA-BP
    介绍:
    利用遗传算法并行地优化BP网络的权值和阈值,从而避免了BP网络在优化权值和阈值时陷入局部最优的缺点

    背景:
    这个项目的背景为客运量和货运量的预测

    文件介绍:

    1. freightFlow.xlsx : 货运量数据集,前7列为影响货运量的因素,第8列为货运量
    2. passengerFlow.xlsx : 客运量数据集,前7列为影响货运量的因素,第8列为客运量
    3. Data.mat:这是一个结构体,成员P为从客运量数据集,成员F为货运量数据集

    函数概述:

    1. gadecod:对输入的染色体编码,编码方式一般有两种,实数编码和二进制编码。
      此项目中对应的为实数编码,所以编码后的值即为解码后的值。
    2. getBPinfo:获取BP网络的基本信息。
    3. gabpEval:计算适应度
    4. normInit:数据获取,存入结构体Data.mat
    5. mainFun:主函数,完成训练和预测

    GAOT使用说明:

    因为项目中用到了GAOT工具包中的函数,所以需要将GAOT工具包加入路径。
    操作步骤为:点击GAOT文件—>添加到路径—>选定文件夹和子文件夹
    这样,工程中就可以调用GAOT工具包中的函数了

    初始种群的生成函数:

    [pop]=initializega(num,bounds,eevalFN,eevalOps,options)

    • 【输出参数】

    pop–生成的初始种群

    • 【输入参数】

    num–种群中的个体数目
    bounds–代表变量的上下界的矩阵
    eevalFN–适应度函数
    eevalOps–传递给适应度函数的参数
    options–选择编码形式(浮点编码或是二进制编码)[precision F_or_B]
    precision–变量进行二进制编码时指定的精度
    F_or_B–为1时选择浮点编码,否则为二进制编码,由precision指定精度)

    遗传算法函数:

    [x,endPop,bPop,traceInfo]=ga(bounds,evalFN,evalOps,startPop,opts,termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)
    【输出参数】
    x--求得的最优解
    endPop--最终得到的种群
    bPop--最优种群的一个搜索轨迹
    traceInfo--每一代的最好的适应度和平均适应度
    【输入参数】
    bounds--代表变量上下界的矩阵
    evalFN--适应度函数
    evalOps--传递给适应度函数的参数
    startPop-初始种群
    opts[epsilonprob_opsdisplay]--opts(1:2)等同于initializega的options参数,第三个参数控制是否输出,一般为0。如[1e-610]
    termFN--终止函数的名称,如['maxGenTerm']
    termOps--传递个终止函数的参数,如[100]
    selectFN--选择函数的名称,如['normGeomSelect']
    selectOps--传递个选择函数的参数,如[0.08]
    xOverFNs--交叉函数名称表,以空格分开,如['arithXoverheuristicXoversimpleXover']
    xOverOps--传递给交叉函数的参数表,如[20;23;20]
    mutFNs--变异函数表,如['boundaryMutationmultiNonUnifMutationnonUnifMutationunifMutation']
    mutOps--传递给交叉函数的参数表,如[400;61003;41003;400]
    

    源码地址:https://github.com/Grootzz/GA-BP

    展开全文
  • 引入自适应变异算子对陷入局部最优的粒子进行变异, 改进了粒子群算法的寻优性能, 利用改进粒子群算法优化 BP 神经网络的权值和阈值, 然后训练 BP 神经网络预测模型求得最优解. 将该预测方法应用到实测交通流的时间...
  • 针对标准BP神经网络收敛速度慢,容易陷入局部极小等缺陷,采用改变传递函数和改变学习率寻找最优权2种方法对其改进。通过分析车削零件表面粗糙度的影响因素,应用改进的BP神经网络,借助计算机编程计算,进行车削加工的...
  • 文章目录BP神经网络数据格式代码部分 auto arima代码部分 rolling_size = 2000,test_size = 1000 这已经算是经过尝试后的局部最优,rmse=0.3884 BP神经网络 BP神经网络理论及代码部分 数据格式 代码部分 #!usr/...


    auto arima代码部分

    • rolling_size = 2000,test_size = 1000
      在这里插入图片描述
      这已经算是经过尝试后的局部最优,rmse=0.3884

    BP神经网络

    BP神经网络理论及代码部分

    数据格式

    在这里插入图片描述

    代码部分

    #!usr/bin/env python
    # -*- coding:utf-8 _*-
    """
    @author: liujie
    @software: PyCharm
    @file: BP1.py
    @time: 2020/11/8 21:57
    """
    import warnings
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import tensorflow as tf
    from tensorflow import keras
    from sklearn.preprocessing import StandardScaler
    from tensorflow.keras import layers,optimizers
    from sklearn.metrics import mean_squared_error as MSE
    
    # 读取数据
    def read_data(datapath):
        # read data
        data1 = pd.read_csv(datapath,index_col=0)
        # 填充或者删去
        data1.fillna(method='pad',inplace=True)      # 填充
        # data.dropna(inplace = True)                 # 删去
        return data1
    
    # 分割数据
    def splitdata(data,Sequence_length,horizon):
        all_data = []
        for dta in range(len(data) - sequence_length -horizon + 1):
            all_data.append(data[dta : dta + sequence_length])
    
        all_data = np.array(all_data)
        ydata = data[(horizon + sequence_length -1) :]
        ydata = list(ydata)
    
        # 加入y变量
        all_data = pd.DataFrame(all_data)
        all_data['y'] = ydata
        all_data = np.array(all_data)
    
        # split data-训练数据、验证数据、测试数据比例0.6/0.2/0.2
        # round函数-进行四舍五入转化的
        row_1 =round(0.4 * int(all_data.shape[0]))
        row_2 = round(0.2 * int(all_data.shape[0]))
    
        x_train_initial = all_data[:-int(row_1),:-1]
        y_train_initial = all_data[:-int(row_1),-1]
    
        x_val_initial = all_data[-int(row_1):-int(row_2),:-1]
        y_val_initial = all_data[-int(row_1):-int(row_2),-1]
    
        x_test_initial = all_data[-int(row_2):,:-1]
        y_test_initial = all_data[-int(row_2):,-1]
    
        return x_train_initial,y_train_initial,x_val_initial,y_val_initial,x_test_initial,y_test_initial
    
    
    # 标准化处理
    def standard(x_train_initial,y_train_initial,x_val_initial,y_val_initial,x_test_initial,y_test_initial):
        x_scaler = StandardScaler()
        y_scale = StandardScaler()
    
        # 分别对x与y进行标准化
        x_train = x_scaler.fit_transform(x_train_initial)
        x_val = x_scaler.transform(x_val_initial)
        x_test = x_scaler.transform(x_test_initial)
    
        y_train = y_scale.fit_transform(y_train_initial.reshape(-1,1))
        y_val = y_scale.transform(y_val_initial.reshape(-1,1))
        y_test = y_scale.transform(y_test_initial.reshape(-1,1))
    
        # 生成正式的数据格式
        amount_of_features = 1
        x_train = np.reshape(x_train,(x_train.shape[0],x_train.shape[1],amount_of_features))
        x_val = np.reshape(x_val,(x_val.shape[0],x_val.shape[1],amount_of_features))
        x_test = np.reshape(x_test,(x_test.shape[0],x_test.shape[1],amount_of_features))
    
        return x_train,y_train,x_val,y_val,x_test,y_test
    
    # keras 版本模型
    def get_uncompiled_model():
    
        inputs = tf.keras.Input(shape=(10,),name = 'digits')             
    
        x = layers.Dense(24,activation='relu',name='dense_1')(inputs)   
        x = layers.Dense(8,activation='relu',name='dense_2')(x)                                                
        x = layers.Dense(1,name='dense_3')(x)
    
        model = tf.keras.Model(inputs=inputs,outputs=x)
    
        return model
    
    # 转换到标准化前的格式
    def inverse_data(y_train_initial,y_pre,y_test):
        y_scale = StandardScaler()
        y_scale = y_scale.fit(y_train_initial.reshape(-1,1))
        y_pre = y_scale.inverse_transform(y_pre)
        y_test = y_scale.inverse_transform(y_test)
    
        return y_pre,y_test
    
    if __name__ == '__main__':
        # 读取数据-dataframe
        index = 'data'
        path = '../data/Data.csv'
        sequence_length = 10           # 序列长度
        horizon = 1                    # 移动的步长
        data = read_data(path)[index]
        # 分割数据
        x_train_initial,y_train_initial,x_val_initial,y_val_initial,x_test_initial,y_test_initial = splitdata(data,sequence_length,horizon=horizon)
        # 标准化
        x_train,y_train,x_val,y_val,x_test,y_test = standard(x_train_initial,y_train_initial,x_val_initial,y_val_initial,x_test_initial,y_test_initial)
    
        # print('size = ',y_test.size)
    
        # 训练模型
        model = get_uncompiled_model()
        # model.compile()模型配置损失和度量、优化器
        model.compile(optimizer=optimizers.Adam(learning_rate=1e-3),
                      loss='mean_squared_error',
                     )
        # model.fit()对模型进行训练
        model.fit(x_train, y_train, batch_size=64, epochs=200,validation_data=(x_val,y_val))
        # model.predict()对模型进行预测
        y_pre = model.predict(x_test)
        print('y_pre = ',y_pre)
        # model.summary()
    
        # 转换到原来的数据格式
        y_pre_rel,y_test_rel = inverse_data(y_train_initial,y_pre,y_test)
    
        y_pre_rel = np.array(y_pre_rel).reshape(-1,1)
        y_test_rel = np.array(y_test_rel).reshape(-1,1)
    
        # rmse
        rmse = np.sqrt(MSE(y_pre_rel,y_test_rel))
    
        # 画图
        # pd.Series()
        fig = plt.figure()
        plt.plot(y_pre_rel,'y-',label='predictions')
        plt.plot(y_test_rel,'r--',label='test')
        plt.legend(loc = 'best')
        plt.title('RMSE : %.4f'%(rmse))
        plt.show()
    

    在这里插入图片描述
    使用很简单的BP神经网络,效果就已经超过传统的ARIMA

    下面一章节我会尝试调试BP神经网络层数及每层神经元的个数来改善效果,
    敬请期待!!!

    展开全文
  • BP神经网络数学推导

    2020-03-08 18:14:15
    神经网络一种求解W权值的算法,分为正向传播(FP)求损失,反向传播(BF)回传误差,根据误差值求解权值W梯度更新其权重,反复迭代,直到找到W最优解(不考虑局部最优)。 本次使用单层神经网络进行推导,隐藏层与输出层...
  • 摘要穴位的位置是否找准会直接影响治疗效果,因此设计了一种基于粒子群算法优化神经网络(PSO-BP)的...实验结果表明:经粒子群优化过的BP神经网络有效地改善了局部极值缺陷,可应用于定位端预测穴位的位置,并在LC...
  • BP神经网络算法存在收敛速度慢和容易陷入局部最小值的缺陷,利用粒子群算法的全局最优和收敛速度快的特性改良BP神经网络,然后利用粒子群优化BP神经网络对PID的3个参数进行在线调整。仿真结果表明,经过粒子群优化后...
  • 为了提高BP神经网络在保险欺诈识别中的准确率,利用改进的遗传算法优化BP神经网络初始权重,以克服BP神经网络容易陷入局部极小点、收敛速度慢以及样本依赖性等问题的缺点。改进的遗传算法充分考虑了遗传算法中种群适应...
  • BP算法基于梯度下降原理是一种局部寻优算法,在...将二者结合起来,由GA寻找最优BP神经网络权值与相应节点的阈值。仿真结果表明:此方法既能快速收敛,又能大大提高避免陷入局部极小的能力,改善了故障诊断的精度和速度。
  • 为提高矿井通风风速预测的准确度,提出一种基于改进遗传算法和BP神经网络的矿井通风风速预测方法。该方法采用前向神经网络建立矿井通风风速预测模型,将排序选择策略和概率生存策略相结合,从而代替传统选择算子,得到一...
  • 穴位的位置是否找准会直接影响治疗...实验结果表明:经粒子群优化过的BP神经网络有效地改善了局部极值缺陷,可应用于定位端预测穴位的位置,并在LCD中显示穴位相关信息,控制端收到位置数据后可执行电机上的运动操作。
  • BP神经网络建立多步预测模型并预测系统输出值,用LM(Levenberg-Marquardt)算法和PSO(Particle Swarm Optimization)算法组合的混合算法对目标性能指标函数进行滚动优化求解,得到非线性系统的最优控制量;利用误差修正...
  • 由GA寻找最优BP神经网络权值与相应节点的阀值,可以有效防止搜索过程收敛于局部最优解。通过仿真结果得出:此方法既能快速收敛,又能大大提高避免陷入局部极小的能力,并且预测精度高,为柴油机噪声主观评价提供了...
  • 神经网络中的BP算法

    千次阅读 2017-04-25 10:48:55
    在我们了解过神经网络的人中,都了解神经网络一个有很常见的训练方法,BP训练算法.通过BP算法,我们可以不断的训练网络,最终使得网络可以无限的逼近一种我们想要拟合的函数,最终训练好的网络它既能在训练集上表现...
  • 基于 MATLAB 的遗传算法优化神经网络

    万次阅读 多人点赞 2018-08-14 00:43:38
    面对较复杂的非线性系统问题时,由于 BP 网络设置的初始权值依赖设计者的经验和样本空间的反复试验,容易产生收敛速度慢、网络不稳定以及陷入局部最优等一系列问题.将 BP 神经网络算法与遗传算法结合,理论上可以对...
  • 目前,在控制领域内神经网络正在... 在控制中,应用较多的网络是BP网络,但BP网络存在局部最优问题,并且训练速度慢,效率低。RBF网络在一定程度上克服了这些问题,因此它的研究与应用越来越得到重视。下面将简单介...
  • 目前,在控制领域内神经网络正在... 在控制中,应用较多的网络是BP网络,但BP网络存在局部最优问题,并且训练速度慢,效率低。RBF网络在一定程度上克服了这些问题,因此它的研究与应用越来越得到重视。下面将简单介...
  • 充分利用BP神经网络的非线性拟合能力,将遗传算法与其相结合,避免BP网络陷入局部最优.利用编写的程序确定隐含层节点数,相比以往经验公式取值更具优势.最后在任家庄煤矿成功应用.研究结果表明:利用粗糙集与改进神经...
  • 论文研究-训练前向神经网络的全局优化新算法及其应用....该算法首先由BP算法得到一个局部极小点,然后利用充函数使BP算法跳出局部最优,得到一个更低的极小点。重复此过程最终求得全局最优解。最后给出一个应用实例。
  • 提出了一种将蚁群算法与算法相融合共同完成反传神经网络训练的方法,ACO一BP算法...将ACO一BP神经网络用于函数逼近问题,并与BP神经网络、蚁群算法神经网络和遗传神经网络的逼近结果进行了比较,验证了该算法的有效性。

空空如也

空空如也

1 2 3 4 5
收藏数 96
精华内容 38
关键字:

bp神经网络局部最优