鲸鱼优化算法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网络进行对比分析。 

三、关键代码

%% 建立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算法优化

BP算法优化
遗传算法  GA-BP灰狼算法  GWO-BP
鲸鱼算法  WOA-BP粒子群算法  PSO-BP
麻雀算法  SSA-BP布谷鸟算法  CS-BP

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
WOA-BP鲸鱼算法优化BP神经网络是一种常见的神经网络优化方法。下面是一些基本概念和实现步骤: 1. WOA-BP鲸鱼算法简介 WOA-BP鲸鱼算法是一种基于鲸鱼群智能优化算法和BP神经网络优化方法。其基本思想是通过模拟鲸鱼的迁徙和捕食行为来寻找最优解。 2. BP神经网络简介 BP神经网络是一种常见的人工神经网络模型,其基本思想是通过反向传播算法来训练神经网络,从而实现对输入输出之间的映射关系进行学习和建模。 3. WOA-BP鲸鱼算法优化BP神经网络步骤 (1) 初始化BP神经网络参数和WOA算法参数; (2) 根据当前种群位置计算适应度函数值; (3) 利用WOA算法更新种群位置; (4) 根据更新后的位置计算新的适应度函数值,并根据新的适应度函数值对种群进行排序; (5) 判断是否满足停止条件,如果满足,则输出最优解,否则返回步骤2。 4. Matlab代码实现 以下是Matlab代码实现的基本框架: ``` % Step 1: 初始化BP神经网络参数和WOA算法参数 % Step 2: 根据当前种群位置计算适应度函数值 % Step 3: 利用WOA算法更新种群位置 % Step 4: 根据更新后的位置计算新的适应度函数值,并根据新的适应度函数值对种群进行排序 % Step 5: 判断是否满足停止条件,如果满足,则输出最优解,否则返回步骤2 % 以下是一个简单的示例代码: % Step 1: 初始化BP神经网络参数和WOA算法参数 pop_size = 10; % 种群大小 max_iter = 100; % 最大迭代次数 dim = 10; % 每个个体的维度 c1 = 2; % 常数c1 c2 = 2; % 常数c2 c3 = 2; % 常数c3 a = 2; % 常数a x_max = 100; % 变量x的上限 x_min = -100; % 变量x的下限 w_max = 1; % 权重w的上限 w_min = -1; % 权重w的下限 pop_position = rand(pop_size,dim); % 随机初始化种群位置 pop_fitness = zeros(1,pop_size); % 初始化种群适应度函数值 % Step 2: 根据当前种群位置计算适应度函数值 for i=1:pop_size pop_fitness(i) = fitness_func(pop_position(i,:)); % 计算适应度函数值 end % Step 3: 利用WOA算法更新种群位置 for t=1:max_iter % 迭代次数循环 for i=1:pop_size % 种群个体循环 r1 = rand(); r2 = rand(); A = 2*a*r1-a; C = 2*r2; b = 1; l = (a-1)*rand()+1; p = rand(); % 随机生成参数p if p<0.5 % 更新个体位置 for j=1:dim if rand()<0.5 D = abs(C*pop_position(i,j)-pop_position(i,j)); pop_position(i,j) = D*exp(b*l)*cos(2*pi*l)+pop_position(i,j); else D = abs(C*pop_position(i,j)-pop_position(i,j)); pop_position(i,j) = D*exp(b*l)*sin(2*pi*l)+pop_position(i,j); end if pop_position(i,j)>x_max % 边界处理 pop_position(i,j) = x_max; elseif pop_position(i,j)<x_min pop_position(i,j) = x_min; end end else % 更新种群位置 for j=1:dim % 根据WOA-BP算法来更新种群中所有个体的位置,并求出每个个体的适应度函数值 r3 = rand(); D = abs(pop_position(i,j)-pop_position(r3,j)); pop_position(i,j) = D*cos(c1*2*pi)*pop_position(r3,j)+D*cos(c2*2*pi)*pop_position(best_index,j)+D*cos(c3*2*pi)*rand(); if pop_position(i,j)>x_max % 边界处理 pop_position(i,j) = x_max; elseif pop_position(i,j)<x_min pop_position(i,j) = x_min; end end for j=1:dim % 根据新位置计算适应度函数值并更新最优解个体序号best_index fitness_val_new = fitness_func(pop_position(i,:)); if fitness_val_new<pop_fitness(i) pop_fitness(i) = fitness_val_new; best_index=i; end if fitness_val_new<pop_fitness(best_index) best_index=i; end end end end end % Step 4: 根据更新后的位置计算新的适应度函数值,并根据新的适应度函数值对种群进行排序 for i=1:pop_size % 根据新位置计算适应度函数值并更新最优解个体序号best_index fitness_val_new = fitness_func(pop_position(i,:)); if fitness_val_new<pop_fitness(i) pop_fitness(i) = fitness_val_new; best_index=i; end if fitness_val_new<pop_fitness(best_index) best_index=i; end end [sorted_fit, sorted_index] = sort(pop_fitness); % 排序 % Step 5: 判断是否满足停止条件,如果满足,则输出最优解,否则返回步骤2 if sorted_fit(1)<min_fitness_val % 达到最小误差则停止迭代,输出最优解 best_solution = pop_position(sorted_index(1),:); fprintf('The best solution is:\n'); disp(best_solution); else % 没有达到最小误差,则继续迭代下去 continue; end % 定义适应度函数fitness_func,根据当前权重计算误差值并返回fitness_val function fitness_val=fitness_func(weights) ... (根据权重weights计算误差并返回fitness_val) end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab神经网络深度学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值