SCI一区级 | Matlab实现RIME-CNN-LSTM-Mutilhead-Attention多变量多步时序预测
目录
- SCI一区级 | Matlab实现RIME-CNN-LSTM-Mutilhead-Attention多变量多步时序预测
- 预测效果
- 基本介绍
- 程序设计
- 参考资料
预测效果
基本介绍
1.Matlab实现RIME-CNN-LSTM-Mutilhead-Attention霜冰算法优化卷积长短期记忆神经网络融合多头注意力机制多变量多步时间序列预测,开普勒算法优化学习率,卷积核大小,神经元个数,以最小MAPE为目标函数;
CNN卷积核大小:卷积核大小决定了CNN网络的感受野,即每个卷积层可以捕获的特征的空间范围。选择不同大小的卷积核可以影响模型的特征提取能力。较小的卷积核可以捕获更细粒度的特征,而较大的卷积核可以捕获更宏观的特征。
LSTM神经元个数:LSTM是一种适用于序列数据的循环神经网络,其神经元个数决定了模型的复杂性和记忆能力。较多的LSTM神经元可以提高模型的学习能力,但可能导致过拟合。
学习率:学习率是训练深度学习模型时的一个关键超参数,它控制每次参数更新的步长。学习率过大可能导致模型不稳定和发散,学习率过小可能导致训练过慢或陷入局部最小值。
多头自注意力层 (Multihead-Self-Attention):Multihead-Self-Attention多头注意力机制是一种用于模型关注输入序列中不同位置相关性的机制。它通过计算每个位置与其他位置之间的注意力权重,进而对输入序列进行加权求和。注意力能够帮助模型在处理序列数据时,对不同位置的信息进行适当的加权,从而更好地捕捉序列中的关键信息。在时序预测任务中,注意力机制可以用于对序列中不同时间步之间的相关性进行建模。
霜冰优化算法是2023年发表于SCI、中科院二区Top期刊《Neurocomputing》上的新优化算法,现如今还未有相关的优化算法应用文献。RIME主要对霜冰的形成过程进行模拟,将其巧妙地应用于算法搜索领域。
2.运行环境为Matlab2023a及以上,提供损失、RMSE迭代变化极坐标图;网络的特征可视化图;测试对比图;适应度曲线(若首轮精度最高,则适应度曲线为水平直线);
3.excel数据集(负荷数据集),输入多个特征,输出单个变量,考虑历史特征的影响,多变量多步时间序列预测(多步预测即预测下一天96个时间点),main.m为主程序,运行即可,所有文件放在一个文件夹;
4.命令窗口输出SSE、RMSE、MSE、MAE、MAPE、R2、r多指标评价,适用领域:负荷预测、风速预测、光伏功率预测、发电功率预测、碳价预测等多种应用。
程序设计
- 完整源码和数据获取方式:私信博主回复Matlab实现RIME-CNN-LSTM-Mutilhead-Attention多变量多步时序预测。
%% 清除内存、清除屏幕
clc
clear
%% 导入数据
data = xlsread('负荷数据.xlsx');
rng(0)
%% 数据分析
daynum=30; %% 数据量较大,选取daynum天的数据
step=96; %% 多步预测
data =data(end-step*daynum+1:end,:);
W_data = data(:,end)'; %% 实际值输出:每天24小时,每小时4个采样点
%% 数据归一化
[features, ~] = mapminmax(Features, 0, 1);
[w_data, ps_output] = mapminmax(W_data, 0, 1);
%% 数据平铺为4-D
LP_Features = double(reshape(features,fnum,step,1,daynum)); %% 特征数据格式
LP_WindData = double(reshape(w_data,step,1,1,daynum)); %% 实际数据格式
%% 格式转换为cell
NumDays = daynum; %% 数据总天数为daynum天
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:daynum-2); %% 训练集输入为 1-(daynum-2)天的特征
YTrain = RealData(:,2:daynum-1); %% 训练集输出为 2-(daynum-1)天的实际值
Best_rime = zeros(1, dim);
Best_rime_rate = inf; % 用于最大化问题,请将此值改为 -inf
for i = 1:dim
Rimepop(:, i) = lb(i) + rand(SearchAgents_no, 1) .* (ub(i) - lb(i)); % 初始种群
end
Lb = lb .* ones(1, dim); % 下边界
Ub = ub .* ones(1, dim); % 上边界
it = 1; % 迭代次数
Convergence_curve = zeros(1, Max_iter);
Rime_rates = zeros(1, SearchAgents_no); % 初始化适应度值
newRime_rates = zeros(1, SearchAgents_no);
W = 5; % 软霜冰参数,在论文第4.3.1节中有详细讨论
% 计算初始位置的适应度值
for i = 1:SearchAgents_no
[Rime_rates(1, i),Value{i},Net{i},Info{i}] = fobj(Rimepop(i, :)); % 计算每个搜索体的适应度值
% 进行贪婪选择
if Rime_rates(1, i) < Best_rime_rate
Best_rime_rate = Rime_rates(1, i);
Best_rime = Rimepop(i, :);
bestPred = Value{i};
bestNet = Net{i};
bestInfo = Info{i};
end
end
% 主循环
while it <= Max_iter
RimeFactor = (rand - 0.5) * 2 * cos((pi * it / (Max_iter / 10))) * (1 - round(it * W / Max_iter) / W); % 公式(3),(4),(5)的参数
E = (it / Max_iter)^0.5; % 公式(6)
newRimepop = Rimepop; % 记录新的种群
normalized_rime_rates = normr(Rime_rates); % 公式(7)的参数
for i = 1:SearchAgents_no
for j = 1:dim
% 软霜冰搜索策略
r1 = rand();
if r1 < E
newRimepop(i, j) = Best_rime(1, j) + RimeFactor * ((Ub(j) - Lb(j)) * rand + Lb(j)); % 公式(3)
end
% 硬霜冰穿刺机制
r2 = rand();
if r2 < normalized_rime_rates(i)
newRimepop(i, j) = Best_rime(1, j); % 公式(7)
end
end
end
参考资料
[1] https://blog.csdn.net/kjm13182345320/article/details/128577926?spm=1001.2014.3001.5501
[2] https://blog.csdn.net/kjm13182345320/article/details/128573597?spm=1001.2014.3001.5501