【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码

1 简介

风能,作为一种重要,有潜力,无污染,可再生、可持续的能源,已经成为全球发电最为迅速的能源之一,越来越受到世界各国的青睐。近年来,为缓解能源短缺问题,改善环境,实现经济乃至人类的可持续发展,世界各国纷纷大力发展风能资源。然而,在实际操作中,风能固有的波动性和间歇性通常会增加风能入网的难度,致使风电场输出功率不稳定,严重影响输出的电能质量,大大增加了电网安全性和稳定性运行风险,因此,风速预测在风电相关工作中至关重要,准确、可靠的预测结果不仅有利于调度人员事先掌握风电场的功率变化情况,及时制定调度运行计划,提高能量转换效率、降低风险,增加发电量等,同时也有利于风电并网稳定运行和有效消纳,对可能存在影响电网安全稳定运行的风险及时预警,从而避免风电功率随机波动造成电能损耗甚至电网崩溃。近年来,国内外学者进行了大量风速预测相关研究,风速预测水平得到一定程度的提升。单一预测模型虽简单容易实施,但其预测精度往往较低,难以满足风电场发电的需求。相比之下,基于优化算法和数据分解法的混合预测模型对风速预测性能有很大的提升。因此,这些模型往往会降低预测结果的稳定性,对风电场发电以及风电并网的安全性和稳定性带来巨大的挑战。针对如上问题,本文构建出一个基于哈里斯鹰算法和Elman神经网络的混合预测模型,本文所提出的混合预测模型不仅可以降低预测误差,提高风速预测精度,增强预测结果的稳定性,同时对风电场发电的完善,发展以及风电并网安全管理也大有裨益。

Elman 神经网络是一种局部反馈递归神经网络,包括输入层、隐藏层、承接层和输出层,由于其良好的动态记忆和时变能力,自1990年Elman首次提出以来,Elman神经网络在时间序列预测中得到了广泛的应用,但由于随机选择初始值和阈值,且采用梯度下降法寻优,其网络学习速度较慢且预测的精度比较低。本文利用 HHO优化 Elman神经网络的初始权值及阈值,提高了 Elman 神经网络的预测精度。

第一步 初始化 Elman 网络所需参数,并新建 Elman 网 络,net=newelm(minmax(input),[11,1],{'tansig','purelin'},'traingdx'),其中 input 是训练集数据,tansig 是隐藏层的激活函数,purelin是输出层激活函数,traingdx是梯度下降函数;

第二步 初始化HHO各参数,包括鹰的数量m 、最大迭代次数Maxiter,参数的上界ub及下界lb;

第三步 不断迭代哈里斯鹰位置优化网络,直到迭代结束形成最优个体,其中最优个体包括权值w1、w2及w3,阈值b1和b2;

第四步 Elman 神经网络解析最优个体,利用解析后的权值及阈值训练Elman神经网络并预测风速数据。

2 部分代码

function [sFeat,Sf,Nf,curve] = jBHHO(feat,label,N,max_Iter,HO)

beta = 1.5;

ub   = 1; 

lb   = 0;

fun = @jFitnessFunction; 

dim = size(feat,2);

X   = zeros(N,dim); 

for i = 1:N

  for d = 1:dim

    if rand() > 0.5

      X(i,d) = 1;

    end

  end

end

fitR = inf; 

fit  = zeros(1,N); 

Y    = zeros(1,dim); 

Z    = zeros(1,dim);

curve = inf;  

t = 1; 

%---Iteration start-------------------------------------------------

while t <= max_Iter

  for i = 1:N

    fit(i) = fun(feat,label,X(i,:),HO);

    if fit(i) < fitR

      fitR = fit(i);

      Xrb  = X(i,:);

    end

  end

  X_mu = mean(X,1);

  for i = 1:N

    E0 = -1 + 2 * rand();

    E  = 2 * E0 * (1 - (t / max_Iter)); 

    if abs(E) >= 1

      q = rand(); 

      if q >= 0.5

        k  = randi([1,N]);

        r1 = rand();

        r2 = rand();

        for d = 1:dim

          Xn = X(k,d) - r1 * abs(X(k,d) - 2 * r2 * X(i,d));

          S  = 1 / (1 + exp(-Xn));

          if rand() < S

            X(i,d)= 1;

          else 

            X(i,d) = 0;

          end

        end

      elseif q < 0.5

        r3 = rand();

        r4 = rand();

        for d = 1:dim

          Xn = (Xrb(d) - X_mu(d)) - r3 * (lb + r4 * (ub - lb));

          S  = 1 / (1 + exp(-Xn));

          if rand() < S

            X(i,d) = 1;

          else

            X(i,d) = 0;

          end

        end

      end

    elseif abs(E) < 1

      J = 2 * (1 - rand());

      r = rand();

      if r >= 0.5  &&  abs(E) >= 0.5

        for d = 1:dim

          DX = Xrb(d) - X(i,d);

          Xn = DX - E * abs(J * Xrb(d) - X(i,d));

          S  = 1 / (1 + exp(-Xn));

          if rand() < S

            X(i,d) = 1;

          else

            X(i,d) = 0;

          end

        end

      elseif r >= 0.5  &&  abs(E) < 0.5

        for d = 1:dim

          DX = Xrb(d) - X(i,d);

          Xn = Xrb(d) - E * abs(DX);

          S  = 1 / (1 + exp(-Xn));

          if rand() < S

            X(i,d) = 1;

          else

            X(i,d) = 0;

          end

        end

      elseif r < 0.5  &&  abs(E) >= 0.5

        LF = jLevyDistribution(beta,dim); 

        for d = 1:dim

          Yn = Xrb(d) - E * abs(J * Xrb(d) - X(i,d));

          S  = 1 / (1 + exp(-Yn));

          if rand() < S

            Y(d) = 1;

          else

            Y(d) = 0;

          end

          Zn = Y(d) + rand() * LF(d);

          S  = 1 / (1 + exp(-Zn));

          if rand() < S

            Z(d) = 1;

          else

            Z(d) = 0;

          end

        end

        fitY = fun(feat,label,Y,HO);

        fitZ = fun(feat,label,Z,HO);

        if fitY <= fit(i)

          fit(i) = fitY; 

          X(i,:) = Y;

        end

        if fitZ <= fit(i)

          fit(i) = fitZ;

          X(i,:) = Z;

        end

      elseif r < 0.5  &&  abs(E) < 0.5

        LF = jLevyDistribution(beta,dim); 

        for d = 1:dim

          Yn = Xrb(d) - E * abs(J * Xrb(d) - X_mu(d));

          S  = 1 / (1 + exp(-Yn));

          if rand() < S

            Y(d) = 1;

          else

            Y(d) = 0;

          end

          Zn = Y(d) + rand() * LF(d);

          S  = 1 / (1 + exp(-Zn));

          if rand() < S

            Z(d) = 1;

          else

            Z(d) = 0;

          end

        end

        fitY = fun(feat,label,Y,HO); 

        fitZ = fun(feat,label,Z,HO);

        if fitY <= fit(i)

          fit(i) = fitY; 

          X(i,:) = Y;

        end

        if fitZ <= fit(i)

          fit(i) = fitZ; 

          X(i,:) = Z;

        end        

      end

    end

  end

  curve(t) = fitR; 

  fprintf('\nIteration %d Best (BHHO)= %f',t,curve(t))

  t = t + 1;

end

Pos   = 1:dim;

Sf    = Pos(Xrb == 1);

Nf    = length(Sf);

sFeat = feat(:,Sf); 

end

function LF = jLevyDistribution(beta,dim)

nume  = gamma(1 + beta) * sin(pi * beta / 2);

deno  = gamma((1 + beta) / 2) * beta * 2 ^ ((beta - 1) / 2);

sigma = (nume / deno) ^ (1 / beta); 

u     = randn(1,dim) * sigma; 

v     = randn(1,dim);

step  = u ./ abs(v) .^ (1 / beta); 

LF    = 0.01 * step;

end

3 仿真结果

【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码

【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码

【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码

4 参考文献

[1]朱昶胜, 康亮河, and 冯文芳. "基于自适应鲸鱼优化算法结合Elman神经网络的股市收盘价预测算法." 计算机应用 40.5(2020):9.

[2]郭剑鹰, 夏李玮, and 刘华军. "基于Elman神经网络预测的机动目标跟踪滤波算法." 航天电子对抗 34.3(2018):6.

[3]郭雨鑫, 刘升, 高文欣, & 张磊. (2021). 多策略改进哈里斯鹰优化算法. 微电子学与计算机, 38(7), 7.​

【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码

上一篇:【预测模型-ELAMN预测】基于哈里斯鹰算法优化ELMAN神经网络实现数据回归预测matlab代码


下一篇:Pytorch函数1 torch.max\ torch.min\ torch.squeeze\ torch.unsqueeze\ torch.rand \randn \randint