适用平台:Matlab2023版及以上
雪消融优化算法(Snow Ablation Optimizer,SAO),于2023年6月发表在SCI、中科院1区顶级期刊《Expert Systems With Applications》上。该算法刚刚提出,目前还没有套用这个算法的文献,先到先得,抓住该创新点哦!
双重种群机制:SAO算法引入双重种群机制,将种群分为两个子群,分别负责探索和利用,以实现在解决方案空间中的平衡。
布朗运动探索策略:在探索阶段,算法采用布朗运动模拟蒸汽的不规则运动,使搜索代理具有高度分散的特征,从而探索潜在区域。
度日法利用策略:在利用阶段,SAO采用度日法模拟雪融过程,鼓励搜索代理在当前最佳解决方案附近寻找高质量解。
整体位置更新方程:SAO算法采用一种整体位置更新方程,结合探索和利用策略,以及种群动态变化,优化每个个体的位置。
CNN-BiGRU-SelfAttention模型的创新性:
②引入多头自注意力机制 (Multihead Self-Attention): 多头自注意力机制使得模型能够更灵活地对不同时间步的输入信息进行加权。这有助于模型更加集中地关注对预测目标有更大影响的时间点。自注意力机制还有助于处理时间序列中长期依赖关系,提高了模型在预测时对输入序列的全局信息的感知。
优化套用:基于雪消融优化算法(SAO)、卷积神经网络(CNN)和双向门控循环单元 (BiGRU)融合多头自注意力机制的超前24步多变量时间序列回归预测算法。
功能:
多变量特征输入,单序列变量输出,输入前一天的特征,实现后一天的预测,超前24步预测。 通过BWO优化算法优化学习率、卷积核大小、神经元个数,这3个关键参数,以最小MAPE为目标函数。 提供损失、RMSE迭代变化极坐标图;网络的特征可视化图;测试对比图;适应度曲线(若首轮精度最高,则适应度曲线为水平直线)。 提供MAPE、RMSE、MAE等计算结果展示。
%% 导入特征数据、当天的风速数据
data = xlsread('特征序列及实际值.xlsx');
Features = data(1:18,:); %% 特征输入 :75天,每天24小时,每小时一个采样点,共计75*24=1800小时,18个特征数据
Wind_data = data(19,:); %% 实际值输出:75天,每天24小时,每小时一个采样点,共计75*24=1800小时的风速数据
%% 数据平铺为4-D
LP_Features = double(reshape(Features,18,24,1,75)); %% 特征数据格式为18*24*1*75,分别对应18特征24小时,75天
LP_WindData = double(reshape(Wind_data,24,1,1,75)); %% 实际数据格式为24*1*1*75 ,分别对应24小时,75天
%% 格式转换为cell
NumDays = 75; %% 数据总天数为 75天
for i=1:NumDays
FeaturesData{1,i} = LP_Features(:,:,1,i);
end
for i=1:NumDays
RealData{1,i} = LP_WindData(:,:,1,i);
end
%% 划分数据
XTrain = FeaturesData(:,1:73); %% 训练集输入为 1-73 天的特征
YTrain = RealData(:,2:74); %% 训练集输出为 2-74天 的实际值
XTest = cell2mat(FeaturesData(: , 74)); %% 测试集输入第 74 天的特征
Ytest = cell2mat(RealData(: , 75)); %% 测试集输出为第 75天 的实际值
%% 将优化目标参数传进来的值 转换为需要的超参数
learning_rate = x(1); %% 学习率
KerlSize = round(x(2)); %% 卷积核大小
NumNeurons = round(x(3)); %% 神经元个数
%% 网络搭建
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,...% 初始学习率 0.01
'LearnRateSchedule','none',... % 训练期间降低整体学习率的方法 不降低
'Shuffle','every-epoch',... % 每次训练打乱数据集
'SequenceLength',24,... % 序列长度 24
'MiniBatchSize',20,... % 训练批次大小 每次训练样本个数20
'Verbose',true); % 有关训练进度的信息不打印到命令窗口中
%% 训练网络
[net,info] = trainNetwork(XTrain,YTrain, lgraph, options);
部分图片来源于网络,侵权联系删除!
完整代码:https://mbd.pub/o/bread/ZZeckpxw
欢迎感兴趣的小伙伴点击“阅读原文”或上方链接获得完整版代码哦~
关注小编会不定期推送高创新型、高质量的学习资料、文章程序代码,为你的科研加油助力~