WOA-CNN-LSTM基于鲸鱼优化算法(WOA)、卷积神经网络(CNN)和长短期记忆网络(LSTM)的超前24步多变量时间序列回归预测算法。适用平台:Matlab2020及以上
WOA(Whale Optimization Algorithm)是一种启发式优化算法,用于寻找最优超参数组合,以改进深度学习模型的性能。对于CNN-LSTM回归预测模型,调整CNN卷积核大小、LSTM神经元个数和学习率等超参数可以对模型性能产生显著影响。
CNN卷积核大小:卷积核大小决定了CNN网络的感受野,即每个卷积层可以捕获的特征的空间范围。选择不同大小的卷积核可以影响模型的特征提取能力。较小的卷积核可以捕获更细粒度的特征,而较大的卷积核可以捕获更宏观的特征。
LSTM神经元个数:LSTM是一种适用于序列数据的循环神经网络,其神经元个数决定了模型的复杂性和记忆能力。较多的LSTM神经元可以提高模型的学习能力,但可能导致过拟合。
学习率:学习率是训练深度学习模型时的一个关键超参数,它控制每次参数更新的步长。学习率过大可能导致模型不稳定和发散,学习率过小可能导致训练过慢或陷入局部最小值。
WOA是一种全局性优化算法,可以帮助找到全局最优的超参数组合。它不依赖于梯度信息,因此适用于非凸问题和高度非线性的目标函数。WOA可以自动调整超参数,减少手动调整的工作量,提高超参数搜索的效率。使用WOA来进行CNN-LSTM回归预测模型的超参数寻优可以帮助您找到最佳的超参数配置,提高模型性能。它是一种有效的方法,特别适用于复杂的深度学习模型和大规模数据集。
鲸鱼优化算法(Whale Optimization Algorithm,WOA)是一种启发式优化算法,灵感来源于鲸鱼群体中的行为和社会性。这个算法被设计用来解决各种优化问题,尤其是连续型优化问题。WOA的核心思想是模仿鲸鱼群体中的行为,通过模拟鲸鱼的搜索策略来寻找最优解。
下面是鲸鱼优化算法的主要特点和工作原理:
初始种群初始化:在WOA中,初始种群是由一组随机生成的鲸鱼个体组成的。每个鲸鱼个体表示一个潜在的解,即超参数组合。
鲸鱼搜索行为:WOA模仿了不同类型鲸鱼的搜索行为,包括:蓝鲸(Blue Whale):随机游动,代表探索阶段。护卫鲸(Humpback Whale):向目标移动,代表局部搜索。巨型鲸(Giant Whale):朝着目标移动,代表全局搜索。这些行为受到鲸鱼生态行为的启发,使得算法能够在搜索空间中平衡探索和利用。
更新个体位置:根据不同类型的鲸鱼行为,每个鲸鱼个体的位置会被更新。更新的过程包括向目标位置移动和更新速度。
适应度评估:在每次迭代中,计算每个个体的适应度,根据问题定义的目标函数来评估。
选择最佳个体:在每次迭代后,选择适应度最好的个体作为当前的最优解。
迭代过程:重复上述步骤,直到满足停止条件(例如,达到最大迭代次数或收敛到满意的解)。
WOA-CNN-LSTM多变量回归预测程序的功能:
1、多变量特征输入,单序列变量输出,输入前一天的特征,实现后一天的预测,超前24步预测。
2、通过WOA优化算法优化学习率、卷积核大小、神经元个数,这3个关键参数,以最小MAPE为目标函数。
3、提供损失、RMSE迭代变化极坐标图;网络的特征可视化图;测试对比图;适应度曲线(若首轮精度最高,则适应度曲线为水平直线)。
4、提供MAPE、RMSE、MAE等计算结果展示。
适用领域:
风速预测、光伏功率预测、发电功率预测、碳价预测等多种应用。
程序出图:
卷积特征可视化:
适应度曲线:
RMSE及损失变化的极坐标表示:(误差内圈大外圈小)
部分代码:
%% 优化算法信息
SearchAgents_no = 2; %% 搜索个体的数量
Max_iter = 10; %% 最大迭代次数
lb = [0.001, 2, 100]; %% 变量下界(学习率,卷积核大小,神经元个数)
ub = [0.01, 5, 200]; %% 变量上界(学习率,卷积核大小,神经元个数)
dim = 3; %% 有几个需要优化的参数就是几维
fobj = @objectiveFunction;%% 目标函数
%% 鲸鱼算法WOA优化超参数
[Leader_score, Leader_pos, Convergence_curve, bestPred, bestNet, bestInfo] = WOA(SearchAgents_no, Max_iter, lb, ub, dim, fobj);
%% 优化结果导出
Best_Cost = Leader_score; %% 最佳适应度
Best_Solution = Leader_pos; %% 最佳网络参数
bestPred = bestPred; %% 最佳预测值
bestNet = bestNet; %% 最佳网络
bestInfo = bestInfo; %% 最佳训练曲线
% 显示优化结果
disp(['优化所得参数分别为' num2str(Leader_pos)]);
%% 绘制适应度曲线
figure
plot(Convergence_curve,LineWidth=2,Color=[1 0 0.4]); %% 颜色映射为玫红色R为1; G为0; B为0.4
title('鲸鱼优化WOA-CNN-LSTM适应度曲线')
%% %%%%%%%%%%%%%%%%%%% 绘制优化迭代曲线 %%%%%%%%%%%%%%%%%%%%%%%
%% 损失迭代变化曲线
num_iterations = size(bestInfo.TrainingLoss,2);
train_curve = smooth((bestInfo.TrainingLoss),2) ;%% 损失曲线
% 定义角度范围(由内到外)
theta = linspace(0, 2*pi, num_iterations); % 用于闭合圆形
% 转换训练曲线数据为极坐标系下的数据(半径由高到低)
rho = max(train_curve) - train_curve;
% 绘制极坐标图
figure;
polarplot(theta, rho, 'Color', [0.875 0 1], 'LineWidth', 3);
% 设置极坐标图属性
ax = gca; % 获取当前轴句柄
ax.RAxis.Label.String = '训练误差'; % 设置半径标签
ax.ThetaAxis.Label.String = '迭代次数'; % 设置角度标签
ax.RAxis.Label.FontSize = 12; % 设置标签字体大小
ax.ThetaAxis.Label.FontSize = 12;
ax.RLim = [0, max(rho)]; % 设置半径范围
ax.RTick = [];
title('损失迭代变化曲线', 'FontSize', 14);
%% RMSE迭代变化曲线
num_iterations = size(bestInfo.TrainingRMSE,2);
RMSE_curve = smooth((bestInfo.TrainingRMSE),2) ;%% 损失曲线
% 定义角度范围(由内到外)
theta = linspace(0, 2*pi, num_iterations); % 用于闭合圆形
% 转换训练曲线数据为极坐标系下的数据(半径由高到低)
rho = max(RMSE_curve) - RMSE_curve;
% 绘制极坐标图
figure;
polarplot(theta, rho, 'Color', [0 0.25 1], 'LineWidth', 3);
% 设置极坐标图属性
ax = gca; % 获取当前轴句柄
ax.RAxis.Label.String = '训练误差'; % 设置半径标签
ax.ThetaAxis.Label.String = '迭代次数'; % 设置角度标签
ax.RAxis.Label.FontSize = 12; % 设置标签字体大小
ax.ThetaAxis.Label.FontSize = 12;
ax.RLim = [0, max(rho)]; % 设置半径范围
ax.RTick = [];
title('RMSE迭代变化曲线', 'FontSize', 14);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 绘制某层的特征图,实现特征可视化
%激活某一层
LayersNeed = activations(bestNet,XTrain,'flatten','OutputAs','channels');% flatten层的特征
% 分析前4个训练样本
figure;
for i = 1:4 % 前4个样本特征图 i的不能超过训练集单元的个数
LayersFeature = reshape(cell2mat(LayersNeed(i,:)),18,[]); %根据analyzeNetwork分析结果,构造合适尺寸的特征图18*24
subplot(2, 2, i); % 创建该层的第i个子图
image(LayersFeature, 'CDataMapping', 'scaled');
colormap(hsv);
xlim([1, size(LayersFeature, 2)]); % 限制坐标轴
ylim([1, size(LayersFeature, 1)]); % 限制坐标轴
axis off; % 关闭坐标轴显示
box on;
title(['特征图', num2str(i)]); % 添加特征图标题
end
部分图片来源于网络,侵权联系删除!
欢迎感兴趣的小伙伴关注,小编会继续推送更有质量的学习资料、文章和程序代码!