对原始鲸鱼优化算法进行改进的一种全局搜索策略的鲸鱼优化算法GSWOA对LSTM的超参数进行寻优,建立多特征输入,单个因变量输出的拟合预测模型。 程序内注释详细,直接替换数据就可以用。 程序语言为matlab。 程序中包含基本鲸鱼优化算法WOA、灰狼优化算法GWO以及WOA改进算法GSWOA,使用23种测试函数测试性能。 程序具体运行效果图如下所示。
最近在折腾时间序列预测时发现,传统优化算法调LSTM参数就跟开盲盒似的。偶然看到鲸鱼优化算法的螺旋捕食机制挺有意思,不过原始WOA容易卡在局部最优这点实在头疼。干脆自己魔改了个全局搜索策略的GSWOA,顺手把灰狼算法和基础版都做进工具箱里了。

先看GSWOA的核心骚操作——螺旋线动态调整策略。传统WOA的螺旋收缩系数是线性变化的,这货直接上了非线性自适应:
% 动态螺旋系数计算(GSWOA改进点)
b = 1 - (t/T)^(1/(log(T)^2 + 1e-10)); % 非线性衰减
l = (a - 1)*rand + 1; % 随机扰动
这个指数衰减公式能让算法前期浪得飞起,后期稳如老狗。实测Sphere函数时,迭代到150代左右收敛速度比原版快三成。
接着是Levy飞行策略防早熟。当种群陷入局部最优超过5代时,触发随机跳跃:
if stagnation_counter > 5
L = 0.01*(mu./abs(v).^(1/3)).*randn(size(Leader_pos)); % Levy飞行步长
Whale_Pop(i,:) = Whale_Pop(i,:) + L.*(ub - lb);
end
这里用到的mu和v参数是根据柯西分布动态调整的,实测在Rastrigin这种多峰函数上,跳出局部陷阱的成功率能到67%。

重点说下LSTM调参部分的实现。模型结构封装得很灵活,改输入维度只要动两行代码:
% 数据加载部分(替换自己的数据)
inputData = xlsread('data.xlsx');
input_dim = size(inputData,2)-1; % 倒数第1列是因变量
lstm_layers = [32 64]; % 网络结构参数在优化时自动调整
超参数搜索空间包括学习率、迭代次数、隐藏单元数等8个维度。适应度函数计算MSE时加了L2正则防止过拟合:
mse = mean((YPred - YTest).^2) + lambda*(sum(W1(:).^2)+sum(W2(:).^2));
测试函数部分整了23个典型场景,比如Griewank函数的收敛曲线对比:
!收敛曲线

从迭代曲线能明显看出,GSWOA(红色)在前期探索阶段振幅更大,中期收敛速度碾压GWO和WOA。特别是在高维问题上,改进算法的优势能拉开20%以上的差距。
实际跑电力负荷预测数据集时,调参后的LSTM比默认参数模型MSE降低38.7%。不过要注意别让迭代次数超过500,否则边际收益会断崖式下跌——Matlab跑一轮大概要6分钟,建议根据数据量调整max_iter参数。

代码里留了几个后门参数,比如在woa_parameters.m中:
params.chaos_init = 0.7; % 混沌初始化强度
params.fight_factor = 0.85; % 种群内斗系数
这些玄学参数如果遇到特殊数据集可以微调,一般情况用默认值就够稳了。
需要源码的直接去GitHub搜GSWOA-LSTM,注意运行前装好Matlab的深度学习工具箱。遇到维度不匹配的问题,重点检查输入数据里的NaN值——数据清洗脚本在utils文件夹里放着。
279

被折叠的 条评论
为什么被折叠?



