【ELMAN预测】基于布谷鸟算法改进ELMAN动态递归神经网络实现数据预测matlab源码

212 阅读5分钟

一、Elman神经网络介绍

1.特点
Elman神经网络是一种典型的动态递归神经网络,它是在BP网络基本结构的基础上,在隐含层增加一个承接层,作为一步延时算子,达到记忆的目的,从而使系统具有适应时变特性的能力,增强了网络的全局稳定性,它比前馈型神经网络具有更强的计算能力,还可以用来解决快速寻优问题。
2.结构
Elman神经网络是应用较为广泛的一种典型的反馈型神经网络模型。一般分为四层:输入层、隐层、承接层和输出层。其输入层、隐层和输出层的连接类似于前馈网络。输入层的单元仅起到信号传输作用,输出层单元起到加权作用。隐层单元有线性和非线性两类激励函数,通常激励函数取Signmoid非线性函数。而承接层则用来记忆隐层单元前一时刻的输出值,可以认为是一个有一步迟延的延时算子。隐层的输出通过承接层的延迟与存储,自联到隐层的输入,这种自联方式使其对历史数据具有敏感性,内部反馈网络的加入增加了网络本身处理动态信息的能力,从而达到动态建模的目的。其结构图如下图1所示,
Elman神经网络结构图
其网络的数学表达式为:
这里写图片描述


其中,y为m维输出节点向量;x为n维中间层节点单元向量;u为r维输入向量;​为n维反馈状态向量;​为中间层到输出层连接权值;​为输入层到中间层连接权值;​为承接层到中间层连接权值;g()为输出神经元的传递函数,是中间层输出的线性组合;f()为中间层神经元的传递函数,常采用S函数。
3.与BP网络的区别
它是动态反馈型网络,它能够内部反馈、存储和利用过去时刻输出信息,既可以实现静态系统的建模,还能实现动态系统的映射并直接反应系统的动态特性,在计算能力及网络稳定性方面都比BP神经网络更胜一筹。
4.缺点
与BP神经网络一样,算法都是采用基于梯度下降法,会出现训练速度慢和容易陷入局部极小点的缺点,对神经网络的训练较难达到全局最优。

二、布谷鸟算法

布谷鸟算法是布谷鸟育雏行为和萊维飞行结合的一种算法 。 ​​ 在CS算法中,有两个路径(或者说成是两个位置的更新)备受关注:

CS算法的执行过程如下: ​​

三、算法流程

步骤1:输入影响因素数据与目标输出数据,ELMAN神经网络划分训练集与测试集,对数据归一化处理,

步骤2:构建ELMAN神经网络,初始化网络结构。

步骤3:布谷鸟算法参数初始化。初始化最大迭代次数N,种群大小n,以及c1,c2,w参数。

步骤4:初始化粒子群算法PSO的种群位置。根据步骤2的网络结构,计算需要优化的变量元素个数。

步骤5:使用布谷鸟算法优化。将适应度函数设为ELMAN预测的均方误差。执行布谷鸟的循环体过程,即速度更新和位置更新,直至达到最大迭代次数,终止粒子群优化算法。

步骤6:将布谷鸟优化后的权值和阈值参数,赋给ELMAN神经网络。(或者在循环体当中,将网络结构理解为优化变量,输出最优的网络结构)。

步骤7:布谷鸟优化后的ELMAN神经网络训练和预测,并与优化前的ELMAN神经网络进行预测误差分析和对比。

四、演示代码

%#ok<*SAGROW> Remove hints of syntax
%#ok<*CLALL>
%#ok<*FNDSB>
clear all ; 
close all ;
clc ;
N = 25; % Number of nests(The scale of solution)
D = 10 ; %  Dimensionality of solution
T = 200 ; % Number of iterations
Xmax = 20 ;
Xmin = -20 ;
Pa = 0.25 ; % Probability of building a new nest(After host bird find exotic bird eggs)
nestPop = rand(N,D)*(Xmax-Xmin)+Xmin ;  % Random initial solutions
for t=1:T
    levy_nestPop =  func_levy(nestPop,Xmax,Xmin) ; % Generate new solutions by Levy flights
    nestPop = func_bestNestPop(nestPop,levy_nestPop);  % Choose a best nest among  new and old nests     
    rand_nestPop = func_newBuildNest(nestPop,Pa,Xmax,Xmin); % Abandon(Pa) worse nests and build new nests by (Preference random walk )
    nestPop = func_bestNestPop(nestPop,rand_nestPop) ; % Choose a best nest among  new and old nests
    [~,index] = max(func_fitness(nestPop)) ; % Best nests
    trace(t) = func_objValue(nestPop(index,:)) ; 
end
figure 
plot(trace);
xlabel('迭代次数') ;
ylabel('适应度值') ;
title('适应度进化曲线') ;

​五、仿真结果

代码结果图:

六、参考文献及代码私信博主

《排土场沉降预测的Elman模型及_省略_性分析_以大宝山矿李屋排土场为例_宁志杰》