失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【优化预测】基于matlab差分进化算法优化BP神经网络预测【含Matlab源码 1315期】

【优化预测】基于matlab差分进化算法优化BP神经网络预测【含Matlab源码 1315期】

时间:2024-03-23 05:29:34

相关推荐

【优化预测】基于matlab差分进化算法优化BP神经网络预测【含Matlab源码 1315期】

一、差分进化算法简介

1 前言

在遗传、选择和变异的作用下,自然界生物体优胜劣汰,不断由低级向高级进化和发展。人们注意到,适者生存的进化规律可以模式化,从而构成一些优化算法;近年来发展的进化计算类算法受到了广泛的关注。

差分进化算法(Differential Evolution, DE) 是一种新兴的进化计算技术[1] 。它是由S torn等人于1995年提出的, 其最初的设想是用于解决切比雪夫多项式问题,后来发现它也是解决复杂优化问题的有

效技术。

差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法。但相比于进化计算,它保留了基于种群的全局搜索策略,采用实数编码、基于差分的简单

变异操作和“一对一”的竞争生存策略,降低了进化计算操作的复杂性。同时,差分进化算法特有的记忆能力使其可以动态跟踪当前的搜索情况,以调整其搜索策略,它具有较强的全局收敛能力和稳健性,

且不需要借助问题的特征信息,适用于求解一些利用常规的数学规划方法很难求解甚至无法求解的复杂优化问题[2-5]。因此,差分进化算法作为一种高效的并行搜索算法,对其进行理论和应用研究具有重要的学术意义和工程价值。

目前,差分进化算法已经在许多领域得到了应用,如人工神经元网络、电力、机械设计、机器人、信号处理、生物信息、经济学、现代农业和运筹学等。然而,尽管差分进化算法获得了广泛研究,但相

对于其他进化算法而言,其研究成果相当分散,缺乏系统性,尤其在理论方面还没有重大突破。

2 差分进化算法理论

2.1差分进化算法原理

差分进化算法是一种随机的启发式搜索算法,简单易用,有较强的鲁棒性和全局寻优能力。它从数学角度看是一种随机搜索算法,从工程角度看是一种自适应的迭代寻优过程。除了具有较好的收敛性外,差分进化算法非常易于理解与执行,它只包含不多的几个控制参数,并且在整个迭代过程中,这些参数的值可以保持不变。差分进化算法是一种自组织最小化方法,用户只需很少的输入。它的关键思想与传统进化方法不同:传统方法是用预先确定的概率分布函数决定向量扰动;而差分进化算法的自组织程序利用种群中两个随机选择的不同向量来干扰一个现有向量,种群中的每一个向量都要进行干扰。差分进化算法利用一个向量种群,其中种群向量的随机扰动可独立进行,因此是并行的。如果新向量对应函数值的代价比它们的前辈代价小,它们将取代前辈向量。

同其他进化算法一样,差分进化算法也是对候选解的种群进行操作,但其种群繁殖方案与其他进化算法不同:它通过把种群中两个成员之间的加权差向量加到第三个成员上来产生新的参数向量,该操作

称为“变异”; 然后将变异向量的参数与另外预先确定的目标向量参数按一定规则混合来产生试验量,该操作称为“交叉”;最后,若试验向量的代价函数比目标向量的代价函数低,试验向量就在下一代中代替目标向量,该操作称为“选择”。种群中所有成员必须当作目标向量进行一次这样的操作,以便在下一代中出现相同个数竞争者。

在进化过程中对每一代的最佳参数向量都进行评价,以记录最小化过程。这样利用随机偏差扰动产生新个体的方式,可以获得一个收敛性非常好的结果,引导搜索过程向全局最优解逼近[6-7]。

2.2差分进化算法的特点

差分进化算法从提出到现在,在短短二十几年内人们对其进行了广泛的研究并取得了成功的应用。该算法主要有如下特点:

(1)结构简单,容易使用。差分进化算法主要通过差分变异算子来进行遗传操作,由于该算子只涉及向量的加减运算,因此很容易实现;该算法采用概率转移规则,不需要确定性的规则。此外,差分进化算法的控制参数少,这些参数对算法性能的影响已经得到一定的研究,并得出了一些指导性的建议,因而可以方便使用人员根据问题选择较优的参数设置。

(2)性能优越。差分进化算法具有较好的可靠性、高效性和鲁棒性,对于大空间、非线性和不可求导的连续问题,其求解效率比其他进化方法好,而且很多学者还在对差分进化算法继续改良,以不断提高其性能。

(3)自适应性。差分进化算法的差分变异算子可以是固定常数,也可以具有变异步长和搜索方向自适应的能力,根据不同目标函数进行自动调整,从而提高搜索质量。

(4)差分进化算法具有内在的并行性,可协同搜索,具有利用个体局部信息和群体全局信息指导算法进一步搜索的能力。在同样精度要求下,差分进化算法具有更快的收敛速度。

(5)算法通用,可直接对结构对象进行操作,不依赖于问题信息,不存在对目标函数的限定。差分进化算法操作十分简单,易于编程实现,尤其利于求解高维的函数优化问题。

3 差分进化算法种类

3.1基本差分进化算法

基本差分进化算法的操作程序如下[8]:

(1)初始化;

(2)变异;

(3)交叉;

(4)选择;

(5)边界条件处理。

初始化

差分进化算法利用NP个维数为D的实数值参数向量,将它们作为每

一代的种群,每个个体表示为:

另外一个方法是进行边界吸收处理,即将超过边界约束的个体值设置为临近的边界值。

3.2差分进化算法的其他形式

上面阐述的是最基本的差分进化算法操作程序,实际应用中还发展了差分进化算法的几个变形形式,用符号DE/x/y/z加以区分,其中:x限定当前被变异的向量是“随机的”或“最佳的”;y是所利用的差向量的个数;z指示交叉程序的操作方法。前面叙述的交叉操作表示为“bin”。利用这个表示方法, 基本差分进化算法策略可描述为DE/rand/1/bin。

还有其他形式[5,如:

3.3改进的差分进化算法

自适应差分进化算法

作为一种高效的并行优化算法,差分进化算法发展很快,出现了很多改进的差分进化算法。下面介绍一种具有自适应算子的差分进化算法[9].

4差分进化算法流程

差分进化算法采用实数编码、基于差分的简单变异操作和“一对一”的竞争生存策略,其具体步骤如下:

(1)确定差分进化算法的控制参数和所要采用的具体策略。差分进化算法的控制参数包括:种群数量、变异算子、交叉算子、最大进化代数、终止条件等。

(2)随机产生初始种群,进化代数k=1。

(3)对初始种群进行评价,即计算初始种群中每个个体的目标函数值。

(4)判断是否达到终止条件或达到最大进化代数:若是,则进化终止,将此时的最佳个体作为解输出;否则,继续下一步操作。

(5)进行变异操作和交叉操作,对边界条件进行处理,得到临时种群。

(6)对临时种群进行评价,计算临时种群中每个个体的目标函数值。

(7)对临时种群中的个体和原种群中对应的个体,进行“一对-”的选择操作,得到新种群。

(8)进化代数k=k+1,转步骤(4)。

差分进化算法运算流程如图3.1所示。

5关键参数的说明

控制参数对一个全局优化算法的影响是很大的,差分进化算法的控制变量选择也有一些经验规则。

种群数量NP

一般情况下,种群的规模AP越大,其中的个体就越多,种群的多样性也就越好,寻优的能力也就越强,但也因此增加了计算的难度。所以,NP不能无限取大。根据经验,种群数量NP的合理选择在5D~

10D之间,必须满足NP≥4,以确保差分进化算法具有足够的不同的变异向量。

变异算子F

变异算子FE[0,2]是一个实常数因数,它决定偏差向量的放大比例。变异算子熨小,则可能造成算法“早熟”。随着/值的增大,防止算法陷入局部最优的能力增强,但当F>1时,想要算法快速收敛到最优值会变得十分不易;这是由于当差分向量的扰动大于两个个体之间的距离时,种群的收敛性会变得很差。目前的研究表明,F小于0.4和大于1的值仅偶尔有效,/=0.5通常是一个较好的初始选择。若种

群过早收敛,那么F或NP应该增大。

交叉算子CR

交叉算子CR是一个范围在[0,1]内的实数,它控制着一个试验向量参数来自于随机选择的变异向量而不是原来向量的概率。交叉算子CK越大,发生交叉的可能性就越大。CR的一个较好的选择是0.1,但

较大的CK通常会加速收敛,为了看看是否可能获得一个快速解,可以先尝试CR=0.9或CF=1.0.

最大进化代数G

最大进化代数6是表示差分进化算法运行结束条件的一个参数,表示差分进化算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。一般,6取100~500。

终止条件

除最大进化代数可作为差分进化算法的终止条件外,还可以增加其他判定准则。一般当目标函数值小于阈值时程序终止,阈值常选为10-6。上述参数中,F、CR与NP一样,在搜索过程中是常数,一般F和CR影响搜索过程的收敛速度和稳健性,它们的优化值不仅依赖于目标函数的特性,还与NP有关。通常可通过对不同值做一些试验之后,利用试验和结果误差找到F、CR和NP的合适值。

二、BP神经网络简介

1 BP神经网络概述

BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科研小组提出,参见他们发表在Nature上的论文 Learning representations by back-propagating errors 。

BP神经网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的 输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断 调整网络的权值和阈值,使网络的误差平方和最小。

2 BP算法的基本思想

上一次我们说到,多层感知器在如何获取隐层的权值的问题上遇到了瓶颈。既然我们无法直接得到隐层的权值,能否先通过输出层得到输出结果和期望输出的误差来间接调整隐层的权值呢?BP算法就是采用这样的思想设计出来的算法,它的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。

正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。

反向传播时,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。这两个过程的具体流程会在后文介绍。

BP算法的信号流向图如下图所示

3 BP网络特性分析——BP三要素

我们分析一个ANN时,通常都是从它的三要素入手,即

1)网络拓扑结构;

2)传递函数;

3)学习算法。

每一个要素的特性加起来就决定了这个ANN的功能特性。所以,我们也从这三要素入手对BP网络的研究。

3.1 BP网络的拓扑结构

上一次已经说了,BP网络实际上就是多层感知器,因此它的拓扑结构和多层感知器的拓扑结构相同。由于单隐层(三层)感知器已经能够解决简单的非线性问题,因此应用最为普遍。三层感知器的拓扑结构如下图所示。

一个最简单的三层BP:

3.2 BP网络的传递函数

BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。

单极性S型函数曲线如下图所示。

双极性S型函数曲线如下图所示。

3.3 BP网络的学习算法

BP网络的学习算法就是BP算法,又叫 δ 算法(在ANN的学习过程中我们会发现不少具有多个名称的术语), 以三层感知器为例,当网络输出与期望输出不等时,存在输出误差 E ,定义如下

下面我们会介绍BP网络的学习训练的具体过程。

4 BP网络的训练分解

训练一个BP神经网络,实际上就是调整网络的权重和偏置这两个参数,BP神经网络的训练过程分两部分:

前向传输,逐层波浪式的传递输出值;

逆向反馈,反向逐层调整权重和偏置;

我们先来看前向传输。

前向传输(Feed-Forward前向反馈)

在训练网络之前,我们需要随机初始化权重和偏置,对每一个权重取[ − 1 , 1 ] [-1,1][−1,1]的一个随机实数,每一个偏置取[ 0 , 1 ] [0,1][0,1]的一个随机实数,之后就开始进行前向传输。

神经网络的训练是由多趟迭代完成的,每一趟迭代都使用训练集的所有记录,而每一次训练网络只使用一条记录,抽象的描述如下:

while 终止条件未满足:for record:dataset:trainModel(record)

4.1 逆向反馈(Backpropagation)

4.2 训练终止条件

每一轮训练都使用数据集的所有记录,但什么时候停止,停止条件有下面两种:

设置最大迭代次数,比如使用数据集迭代100次后停止训练

计算训练集在网络上的预测准确率,达到一定门限值后停止训练

5 BP网络运行的具体流程

5.1 网络结构

输入层有n nn个神经元,隐含层有p pp个神经元,输出层有q qq个神经元。

5.2 变量定义

第九步:判断模型合理性

判断网络误差是否满足要求。

当误差达到预设精度或者学习次数大于设计的最大次数,则结束算法。

否则,选取下一个学习样本以及对应的输出期望,返回第三部,进入下一轮学习。

6 BP网络的设计

在进行BP网络的设计是,一般应从网络的层数、每层中的神经元个数和激活函数、初始值以及学习速率等几个方面来进行考虑,下面是一些选取的原则。

6.1 网络的层数

理论已经证明,具有偏差和至少一个S型隐层加上一个线性输出层的网络,能够逼近任何有理函数,增加层数可以进一步降低误差,提高精度,但同时也是网络 复杂化。另外不能用仅具有非线性激活函数的单层网络来解决问题,因为能用单层网络解决的问题,用自适应线性网络也一定能解决,而且自适应线性网络的 运算速度更快,而对于只能用非线性函数解决的问题,单层精度又不够高,也只有增加层数才能达到期望的结果。

6.2 隐层神经元的个数

网络训练精度的提高,可以通过采用一个隐含层,而增加其神经元个数的方法来获得,这在结构实现上要比增加网络层数简单得多。一般而言,我们用精度和 训练网络的时间来恒量一个神经网络设计的好坏:

(1)神经元数太少时,网络不能很好的学习,训练迭代的次数也比较多,训练精度也不高。

(2)神经元数太多时,网络的功能越强大,精确度也更高,训练迭代的次数也大,可能会出现过拟合(over fitting)现象。

由此,我们得到神经网络隐层神经元个数的选取原则是:在能够解决问题的前提下,再加上一两个神经元,以加快误差下降速度即可。

6.3 初始权值的选取

一般初始权值是取值在(−1,1)之间的随机数。另外威得罗等人在分析了两层网络是如何对一个函数进行训练后,提出选择初始权值量级为s√r的策略, 其中r为输入个数,s为第一层神经元个数。

6.4 学习速率

学习速率一般选取为0.01−0.8,大的学习速率可能导致系统的不稳定,但小的学习速率导致收敛太慢,需要较长的训练时间。对于较复杂的网络, 在误差曲面的不同位置可能需要不同的学习速率,为了减少寻找学习速率的训练次数及时间,比较合适的方法是采用变化的自适应学习速率,使网络在 不同的阶段设置不同大小的学习速率。

6.5 期望误差的选取

在设计网络的过程中,期望误差值也应当通过对比训练后确定一个合适的值,这个合适的值是相对于所需要的隐层节点数来确定的。一般情况下,可以同时对两个不同 的期望误差值的网络进行训练,最后通过综合因素来确定其中一个网络。

7 BP网络的局限性

BP网络具有以下的几个问题:

(1)需要较长的训练时间:这主要是由于学习速率太小所造成的,可采用变化的或自适应的学习速率来加以改进。

(2)完全不能训练:这主要表现在网络的麻痹上,通常为了避免这种情况的产生,一是选取较小的初始权值,而是采用较小的学习速率。

(3)局部最小值:这里采用的梯度下降法可能收敛到局部最小值,采用多层网络或较多的神经元,有可能得到更好的结果。

8 BP网络的改进

P算法改进的主要目标是加快训练速度,避免陷入局部极小值等,常见的改进方法有带动量因子算法、自适应学习速率、变化的学习速率以及作用函数后缩法等。 动量因子法的基本思想是在反向传播的基础上,在每一个权值的变化上加上一项正比于前次权值变化的值,并根据反向传播法来产生新的权值变化。而自适应学习 速率的方法则是针对一些特定的问题的。改变学习速率的方法的原则是,若连续几次迭代中,若目标函数对某个权倒数的符号相同,则这个权的学习速率增加, 反之若符号相反则减小它的学习速率。而作用函数后缩法则是将作用函数进行平移,即加上一个常数。

三、部分源代码

%% 差分进化算法应用于优化BP神经网络的初始权值和阈值%% 清空环境变量clear all;clc;warning offload v357;load y357;Pn_train=v;Tn_train=y;Pn_test=v;Tn_test=y;P_train=v;T_train=y;% P_train=[0 25.27 44 62.72 81.4 100.2;%290.5 268.8 247.2 224.5 206 184.4;%0 16.12 33.25 50.42 67.62 84.73;%542.5 517.8 493 465.3 435.6 410.8;%0 11.1 28.1 44.93 61.38 78.57;%826.1 800.2 769.1 740.0 706.2 669.3];% T_train=[0 1 2 3 4 5];%以上是未处理的数据% P_test=[0 25.25 43 62.75 81.6 100.7;%290.3 268.4 247.5 224.6 206 184.2;%0 16.14 33.26 50.47 67.68 84.79;%542.7 517.9 495 465.8 435.6 410.9;%0 11.4 28.6 44.94 61.36 78.59;%826.3 800.7 769.8 740.5 706.7 669.3];% T_test=[0 1 2 3 4 5];% Pn_train=[0 0.252 0.439 0.626 0.813 1 0 0.19 0.392 0.595 0.798 1 0 0.141 0.358 0.572 0.781 1;% 1 0.795 0.592 0.378 0.204 0 1 0.815 0.626 0.415 0.189 0 1 0.835 0.637 0.451 0.235 0];% %T 为目标矢量 ,归一化后的数据% Tn_train=[0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95]; % Pn_test=[ 0 0.17 0.39 0.595 0.798 1 0 0.141 0.358 0.572 0.781 1 0 0.258 0.439 0.626 0.813 1;%1 0.815 0.625 0.415 0.189 0 1 0.835 0.635 0.451 0.235 0 1 0.795 0.599 0.378 0.204 0 ];% Tn_test=[0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95,0.05,0.23,0.41,0.59,0.77,0.95];%% 参数设置S1 = size(Pn_train,1); % 输入层神经元个数S2 = 6; % 隐含层神经元个数S3 = size(Tn_train,1); % 输出层神经元个数Gm=10; %最大迭代次数F0=0.5;%F为缩放因子Np=5; %种群规模CR=0.5; %杂交参数G=1;%初始化代数N=S1*S2 + S2*S3 + S2 + S3;%所求问题的维数%% 创建BP神经网络%net_optimized = newff(Pn_train,Tn_train,S2);net_optimized=newff(minmax(Pn_train),[6,1],{'logsig','purelin'},'traingdm');%隐含层神经元S型正切,输出层S型对数,动量梯度下降法训练BP网络,%%差分进化算法ge=zeros(1,Np);%各代的最优值bestx=zeros(Np,N);%各代的最优解%产生初始种群xmin=-1;xmax=1;X0=(xmax-xmin)*rand(Np,N)+xmin;X=X0;%%%%%%%%%%变异操作X1new=zeros(Np,N);%初始化X1_new=zeros(Np,N);%初始化X1=zeros(Np,N);%初始化value=zeros(1,Np);while G<=Gmfor i=1:Np%产生j,k,p三个不同的数a=1;b=Np;dx=randperm(b-a+1)+a-1;%randperm()随机打乱一个数字序列j=dx(1);k=dx(2);p=dx(3);if j==ij=dx(4);elseif k==ik=dx(4);elseif p==ip=dx(4);end%%%%%%%%%%%%%%%变异操作namd=exp(1-Gm/(Gm+1-G));%变异算子F=F0*2.^namd;bon=X(p,:)+F*(X(j,:)-X(k,:));if (bon>xmin)&(bon<xmax) %防止变异超出边界X1new(i,:)=bon;else X1new(i,:)=(xmax-xmin)*rand(1,N)+xmin;end%%%%%%%%%%%%%%%交叉操作 if rand>CR %利用二项分布来交叉X1_new(i,:)=X(i,:);elseX1_new(i,:)=X1new(i,:);end%%%%%%%%%%%%%%%选择操作if fun(X1_new(i,:),S1,S2,S3,net_optimized,Pn_train,Tn_train)<fun(X1(i,:),S1,S2,S3,net_optimized,Pn_train,Tn_train)X1(i,:)=X1_new(i,:);value(i)=fun(X1(i,:),S1,S2,S3,net_optimized,Pn_train,Tn_train);elseX1(i,:)=X(i,:);endend[fmin,nmin]=min(value);ge(G)=fmin;bestx(G,:)=X1(nmin,:); G=G+1;X=X1;end[gmin,n]=min(ge);bestvalue=gminbestsolution=bestx(n,:)%% 解码最优个体x = bestsolution;% 前S1*S2个编码为W1temp1 = x(1:S1*S2);W1 = reshape(temp1,S2,S1);% 接着的S2*S3个编码为W2temp2 = x(S1*S2+1:S1*S2+S2*S3);W2 = reshape(temp2,S3,S2);% 接着的S2个编码为B1temp3 = x(S1*S2+S2*S3+1:S1*S2+S2*S3+S2);B1 = reshape(temp3,S2,1);%接着的S3个编码B2temp4 = x(S1*S2+S2*S3+S2+1:S1*S2 + S2*S3 + S2 + S3);B2 = reshape(temp4,S3,1);function error = fun(x,S1,S2,S3,net_optimized,inputn,outputn)%该函数用来计算适应度值%xinput个体%S1 input输入层节点数%S2 input隐含层节点数%S3 input输出层节点数%net_optimized input网络%inputninput训练输入数据%outputn input训练输出数据%erroroutput 个体适应度值%提取w1=x(1:S1*S2);w2=x(S1*S2+1:S1*S2+S2*S3);B1=x(S1*S2+S2*S3+1:S1*S2+S2*S3+S2);B2=x(S1*S2+S2*S3+S2+1:S1*S2 + S2*S3 + S2 + S3);%网络进化参数net_optimized.trainParam.epochs = 3000;net_optimized.trainParam.show = 100;net_optimized.trainParam.goal = 0.001;net_optimized.trainParam.lr = 0.1;%网络权值赋值net_optimized.IW{1,1} = reshape(w1,S2,S1);net_optimized.LW{2,1} = reshape(w2,S3,S2);net_optimized.b{1} = reshape(B1,S2,1);net_optimized.b{2} =reshape(B2,S3,1);%网络训练net_optimized=train(net_optimized,inputn,outputn);an=sim(net_optimized,inputn);error1=an-outputn;error=mse(error1);

四、运行结果

五、matlab版本及参考文献

1 matlab版本

a

2 参考文献

《智能优化算法及其MATLAB实例(第2版)》包子阳 余继周 杨杉著 电子工业出版社

如果觉得《【优化预测】基于matlab差分进化算法优化BP神经网络预测【含Matlab源码 1315期】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。