鲸鱼优化算法WOA优化BP神经网络(WOA-BP)回归预测-Matlab代码实现

一、鲸鱼优化算法WOA

        鲸鱼优化算法(Whale Optimization Algorithm,WOA)是由Mirjalili等人于2016年提出的一种新型启发式优化算法。WOA算法的灵感来源于座头鲸的狩猎行为,作为群居哺乳动物,它们狩猎时会通过相互合作的方式对猎物实行围捕,鲸鱼在群体狩猎中有包围和驱赶两种行为,群体中的鲸鱼通过朝着其它鲸鱼移动以实现包围猎物,通过环形游动并喷出气泡形成气泡网以实现驱赶猎物,这种独特的狩猎方法被称为泡泡网觅食法。WOA算法的核心思想就是源于座头鲸特殊的泡泡网觅食法,通过随机或最佳搜索代理来模拟鲸鱼的围捕行为,通过螺旋来模拟泡泡网觅食的攻击机制,以此进行数学建模达到优化目的。WOA算法具有操作简单、调整参数少以及跳出局部最优能力强的优点WOA的算法流程为:

(1)初始化WOA参数,包括初始化鲸鱼群体的规模、最大迭代次数、鲸鱼种群位置;

(2)计算鲸鱼群体的适应度,并根据适应度选择初始鲸鱼种群个数;

(3)计算个体适应度并选择当前最优位置;

(4)迭代更新下一代鲸鱼群体位置;

(5)达到终止条件,输出最优个体,即找到全局最优解。

二、WOA-BP预测模型建

        WOA算法优化BP神经网络的初始权值阈值,从而建立稳定的WOA-BP预测模型,提高预测精度和泛化能力。具体过程如下:

(1)数据归一化,建立BP神经网络,确定拓扑结构并初始化网络的权值和阈值;

(2)初始化WOA参数,计算WOA算法的决策长度,选取均方误差作为优化的目标函数;

(3)设置算法停止准则,利用WOA优化BP神经网络的权值阈值参数;

(4)WOA算法优化后的最优权值阈值参数赋予BP神经网络,即输出最优的WOA-BP模型,利用WOA-BP进行训练和预测并与优化前的BP网络进行对比分析。

扫描二维码关注公众号,回复: 15027820 查看本文章

代码获取:直接点击此处跳转

三、关键代码

%% 建立BP模型
net=newff(inputn,outputn,hiddennum_best,{'tansig','purelin'},'trainlm');

% 设置BP参数
net.trainParam.epochs=1000;        % 训练次数
net.trainParam.lr=0.01;            % 学习速率
net.trainParam.goal=0.00001;       % 训练目标最小误差
net.trainParam.show=25;            % 显示频率
net.trainParam.mc=0.01;            % 动量因子
net.trainParam.min_grad=1e-6;      % 最小性能梯度
net.trainParam.max_fail=6;         % 最高失败次数

%% 设置WOA参数
popsize=30;    %初始种群规模
maxgen=50;     %最大进化代数
dim=inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum;    %自变量个数
lb=repmat(-3,1,dim);    %自变量下限
ub=repmat(3,1,dim);     %自变量上限
%初始化位置向量和领导者得分
Leader_pos=zeros(1,dim);
Leader_score=10^20;   

%% 初始化种群
for i=1:dim
    ub_i=ub(i);
    lb_i=lb(i);
   Positions(:,i)=rand(popsize,1).*(ub_i-lb_i)+lb_i;
end
curve=zeros(maxgen,1);%初始化收敛曲线

%% 进化过程
h0=waitbar(0,'WOA优化中...');
for t=1:maxgen
    for i=1:size(Positions,1)%对每个个体一个一个检查是否越界
        % 返回超出搜索空间边界的搜索代理
        Flag4ub=Positions(i,:)>ub;
        Flag4lb=Positions(i,:)<lb;
        Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
       fit(i)=fitness(Positions(i,:),inputnum,hiddennum_best,outputnum,net,inputn,outputn,output_train,inputn_test,outputps,output_test);     
        % 更新领导者位置
        if fit(i)<Leader_score
            Leader_score=fit(i);
            Leader_pos=Positions(i,:);
        end
    end
    
    a=2-t*((2)/maxgen);
    a2=-1+t*((-1)/maxgen);
    %参数更新
    for i=1:size(Positions,1)
        r1=rand();r2=rand();
        A=2*a*r1-a;
        C=2*r2;
        b=1;
        l=(a2-1)*rand+1;
        p = rand();
        for j=1:size(Positions,2)%对每一个个体地多维度进行循环运算
            %收缩包围机制
            if p<0.5
                if abs(A)>=1
                    rand_leader_index = floor(popsize*rand()+1);
                    X_rand = Positions(rand_leader_index, :);
                    D_X_rand=abs(C*X_rand(j)-Positions(i,j));
                    Positions(i,j)=X_rand(j)-A*D_X_rand;
                elseif abs(A)<1
                    D_Leader=abs(C*Leader_pos(j)-Positions(i,j));
                    Positions(i,j)=Leader_pos(j)-A*D_Leader;
                end
            elseif p>=0.5
                distance2Leader=abs(Leader_pos(j)-Positions(i,j));
                Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
            end
        end
    end
    curve(t)=Leader_score;
    waitbar(t/maxgen,h0)
end
close(h0)
setdemorandstream(pi);

%% 权重阈值更新
w1=Leader_pos(1:inputnum*hiddennum_best);   
B1=Leader_pos(inputnum*hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best);  
w2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum);   
B2=Leader_pos(inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+1:inputnum*hiddennum_best+hiddennum_best+hiddennum_best*outputnum+outputnum);  
% 矩阵重构
net.iw{1,1}=reshape(w1,hiddennum_best,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum_best);
net.b{1}=reshape(B1,hiddennum_best,1);
net.b{2}=reshape(B2,outputnum,1);

四、仿真结果

(1)根据经验公式,通过输入输出节点数量,求得最佳隐含层节点数量:

(2)WOA-BP和BP的预测对比图和误差图

 (3)BP和WOA-BP的各项误差指标,预测准确率

(4)鲸鱼优化算法WOA适应度进化曲线

 (5)BP和WOA-BP模型的回归图

 (6)BP和WOA-BP模型的误差直方图

 四、结语

    需要注意的是,鲸鱼算法和BP神经网络都是基于随机性的算法,因此同一组参数的优化结果可能会有所不同,需要进行多次重复实验来验证模型的鲁棒性和可靠性。

猜你喜欢

转载自blog.csdn.net/baoliang12345/article/details/130493695
今日推荐