WOA-CNN-LSTM鲸鱼优化深度学习预测模型的超参数,Mtlab代码,包含特征可视化,数据由Excel导入,直接运行!

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

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

欢迎感兴趣的小伙伴关注,小编会继续推送更有质量的学习资料、文章和程序代码!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值