适用平台:Matlab2023版及以上

BWO 白鲸优化算法,于2022年发表在SCI、中科院1区期刊《Knowledge-Based Systems》上。

我们利用该高创新算法对我们的CNN-BiGRU-Attention时序和空间特征结合-融合注意力机制的回归预测程序代码中的超参数进行优化。

该论文进行了一系列实验,包括定性分析、定量分析和可扩展性测试。定性分析包括搜索历史、平衡因子曲线、轨迹、平均适应值曲线和收敛曲线等。结果表明,BWO在探索和更新能力之间提供了很好的平衡,定量分析涉及对30个基准函数的实验。此外,还进行了可扩展性测试,对比了BWO与其他15种元启发式算法在可扩展性方面的表现。

BWO算法的创新点主要体现在以下几个方面:

1. 受到白鲸行为的启发:BWO算法的设计灵感来自于白鲸的行为,包括了其游泳、觅食和死亡下沉等行为。通过模拟这些行为,BWO算法能够在优化问题中平衡探索和开发的能力。

2. 自适应的平衡因子和概率:BWO算法引入了自适应的平衡因子和概率来控制探索和开发的能力。这样可以根据问题的特性自动调整算法的行为,提高求解的效果。

3. 引入了Levy飞行机制:BWO算法引入了Levy飞行机制,用于增强全局收敛性。Levy飞行是一种随机游走的方式,可以帮助算法跳出局部最优解,提高求解的全局搜索能力。

4. 在各个方面的性能表现优秀:实验证明,BWO算法在解决一元和多元优化问题方面表现出色,在比较的15种其他元启发式算法中排名靠前。此外,BWO算法在可扩展性分析方面也表现出较高的排名。

综上,BWO算法通过模拟白鲸的行为并引入自适应平衡因子和概率以及Levy飞行机制,实现了在优化问题中平衡探索和开发的能力,并取得了良好的性能表现。这使得BWO算法在解决复杂的实际优化问题方面具有巨大的潜力。

CNN-BiGRU-Attention模型的创新性:

结合卷积神经网络 (CNN) 和双向门控循环单元 (BiGRU):CNN 用于处理多变量时间序列的多通道输入,能够有效地捕捉输入特征之间的空间关系。BiGRU 是一种能够捕捉序列中长距离依赖关系的递归神经网络。通过双向性,BiGRU 可以同时考虑过去和未来的信息,提高了模型对时间序列动态变化的感知能力。

引入自注意力机制 (Self-Attention): Self-Attention 机制使得模型能够更灵活地对不同时间步的输入信息进行加权。这有助于模型更加集中地关注对预测目标有更大影响的时间点。

自注意力机制还有助于处理时间序列中长期依赖关系,提高了模型在预测时对输入序列的全局信息的感知。

优化套用:基于白鲸优化算法(BWO)、卷积神经网络(CNN)和双向门控循环单元 (BiGRU)融合注意力机制的超前24步多变量时间序列回归预测算法。

功能:

1、多变量特征输入,单序列变量输出,输入前一天的特征,实现后一天的预测,超前24步预测。

2、通过BWO优化算法优化学习率、卷积核大小、神经元个数,这3个关键参数,以最小MAPE为目标函数。

3、提供损失、RMSE迭代变化极坐标图;网络的特征可视化图;测试对比图;适应度曲线(若首轮精度最高,则适应度曲线为水平直线)。

4、提供MAPE、RMSE、MAE等计算结果展示。

适用领域:风速预测、光伏功率预测、发电功率预测、碳价预测等多种应用。

预测值与实际值对比:

训练特征可视化:

训练误差曲线的极坐标形式(误差由内到外越来越接近0)

适应度曲线:

%% 将优化目标参数传进来的值 转换为需要的超参数
learning_rate = x(1);            %% 学习率
KerlSize = round(x(2));          %% 卷积核大小
NumNeurons = round(x(3));        %% 神经元个数

%% %% CNN-BiGRU-Attention网络搭建
lgraph = layerGraph();

% 添加层分支
% 将网络分支添加到层次图中。每个分支均为一个线性层组。
tempLayers = sequenceInputLayer([18 24 1],"Name","sequence");
lgraph = addLayers(lgraph,tempLayers);

tempLayers = [
    convolution2dLayer(KerlSize,32,"Name","conv","Padding","same")
    batchNormalizationLayer("Name","batchnorm")
    reluLayer("Name","relu")
    maxPooling2dLayer([3 3],"Name","maxpool","Padding","same")
    flattenLayer("Name","flatten_1")
    fullyConnectedLayer(25,"Name","fc_1")];
lgraph = addLayers(lgraph,tempLayers);

tempLayers = flattenLayer("Name","flatten");
lgraph = addLayers(lgraph,tempLayers);

tempLayers = gruLayer(NumNeurons,"Name","gru1");
lgraph = addLayers(lgraph,tempLayers);

tempLayers = [
    FlipLayer("flip3")
    gruLayer(NumNeurons,"Name","gru2")];
lgraph = addLayers(lgraph,tempLayers);

tempLayers = [
    concatenationLayer(1,3,"Name","concat")
    selfAttentionLayer(1,50,"Name","selfattention")
    fullyConnectedLayer(24,"Name","fc")
    regressionLayer("Name","regressionoutput")];
lgraph = addLayers(lgraph,tempLayers);

% 清理辅助变量
clear tempLayers;

% 连接层分支
% 连接网络的所有分支以创建网络图。
lgraph = connectLayers(lgraph,"sequence","conv");
lgraph = connectLayers(lgraph,"sequence","flatten");
lgraph = connectLayers(lgraph,"flatten","gru1");
lgraph = connectLayers(lgraph,"flatten","flip3");
lgraph = connectLayers(lgraph,"gru1","concat/in1");
lgraph = connectLayers(lgraph,"gru2","concat/in2");
lgraph = connectLayers(lgraph,"fc_1","concat/in3");

%% 设置训练参数
options = trainingOptions('adam', ...   % adam 梯度下降算法
    'MaxEpochs',300, ...                % 最大训练次数 300
    'GradientThreshold',1,...           % 渐变的正阈值 1
    'ExecutionEnvironment','cpu',...    % 网络的执行环境 cpu
    'InitialLearnRate',learning_rate,...% 初始学习率 
    'LearnRateSchedule','none',...      % 训练期间降低整体学习率的方法 不降低
    'Shuffle','every-epoch',...         % 每次训练打乱数据集
    'SequenceLength',24,...             % 序列长度 24
    'MiniBatchSize',20,...              % 训练批次大小 每次训练样本个数20
    'Verbose',true);                    % 有关训练进度的信息不打印到命令窗口中

%% 训练网络
[net,info] = trainNetwork(XTrain,YTrain, lgraph, options);

部分图片来源于网络,侵权联系删除!

欢迎感兴趣的小伙伴关注并后台留言获得完整版代码,小编会继续推送更有质量的学习资料、文章和程序代码!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐