IWOA-BILSTM:改进鲸鱼算法优化双向LSTM的时间序列预测

发布时间:2026/10/18 19:20:49
IWOA-BILSTM:改进鲸鱼算法优化双向LSTM的时间序列预测 简介改进鲸鱼算法优化双向长短期记忆网络IWOA-BILSTM的时间序列预测对比项目提供了完整的MATLAB实现源码与数据支撑适合需要开展回归预测、参数优化或算法对比研究的高校师生与工程技术人员。项目核心是基于改进鲸鱼算法自动搜索最优参数并与标准BILSTM进行预测效果对比优化对象涵盖迭代次数、隐藏层节点个数、学习率与正则化系数评价指标则集成了R2、MAE、MSE、RMSE等常用统计量可全面衡量模型精度与稳定性。整体压缩包共15个文件主要包括11个.m主程序与功能脚本、2个.mat结果数据、1个数据集Excel文件及1个说明文档压缩包仅约70KB文件层级紧凑代码注释详细运行环境要求MATLAB 2019及以上版本便于读者直接运行、替换数据并观察对比曲线。目前已有200人学习使用资源既可用于论文实验也适合作为深度学习时间序列预测的入门范例。1. 改进鲸鱼算法优化双向长短期记忆网络这个资源到底解决什么问题同样一组数据BILSTM 跑出来的预测结果能差出一大截问题往往不出在网络结构上而是出在迭代次数、隐藏层节点、学习率和正则化参数这四组超参数上。人工调参基本靠玄学调一晚上也未必能碰到好组合。这份基于改进鲸鱼算法优化双向长短期记忆网络IWOA-BILSTM的 MATLAB 时间序列预测资源把超参数搜索变成了算法迭代同时保留了普通 BILSTM 作为对照组输出 R2、MAE、MSE、RMSE 四项指标和收敛曲线。适合做时序预测实验对比的开发者、被调参折磨的研究生以及想给论文补一组优化算法对比实验的从业者。2. 原理拆解IWOA 与 BILSTM 怎么协作四个超参数为什么值得优化2.1 双向长短期记忆网络时间序列为什么需要“前向 后向”LSTM 处理时间序列时每一时刻的输出只依赖过去的信息也就是前向隐藏状态。但很多真实时序数据并不完全是这样电力负荷、交通流量、气象数据中某个时刻的异常往往同时受前后两个方向的影响。BILSTM 的做法是训练两个方向相反的 LSTM 层一个按时间正序读取序列一个按时间逆序读取序列再把两个方向的隐藏状态拼接起来作为这一时刻的最终表示。这份资源里的核心层是bilstmLayer配合OutputMode的设定来决定输出方式。当OutputMode设为last时只返回最后一个时间步的拼接隐藏状态适合做单步回归预测设为sequence时返回每个时间步的输出适合做逐点预测或序列标注。资源里默认走的是回归输出后接一个全连接层把隐藏状态映射到目标值维度。BILSTM 的问题在于参数比单向 LSTM 翻倍对超参数更敏感。隐藏层节点太多会过拟合且训练极慢太少则学不到时序依赖学习率稍微偏大损失曲线直接发散正则化系数设得不好要么欠拟合要么没用。这四项互相耦合手调非常痛苦而鲸鱼优化算法正好适合这种连续参数的组合搜索问题。2.2 改进鲸鱼算法从 WOA 到 IWOA 的三个改动标准鲸鱼算法模拟座头鲸的捕食行为包含三种位置更新机制包围猎物、气泡网攻击、随机搜索。搜索前期靠全局随机探索撒网搜索后期靠包围收缩和螺旋更新来精细逼近最优解。它结构简单、参数少但有个明显的毛病收敛因子是线性递减的前期全局搜索和后期的局部开发过渡得太机械遇到多峰函数容易早熟后期陷入局部最优就跳不出来。IWOA 的改进点通常会落在三个方向上。第一个是把线性收敛因子改成非线性递减比如按余弦或指数方式衰减让算法在前期保持更强的探索能力、后期更平滑地转入精细搜索。第二个是加入惯性权重或自适应权重让鲸鱼个体移动步长随迭代次数变化避免所有个体后期扎堆。第三个是对种群做划分或引入变异机制让一部分鲸鱼保持随机跳跃能力。这份资源里的initialization.m和位置更新代码就体现了这类改进的痕迹。和直接用 PSO、GA 优化神经网络相比WOA 家族的优势在于参数少、实现简单、收敛速度快。PSO 要调惯性权重、个体学习因子、社会学习因子GA 要调交叉率、变异率、选择策略。而 WOA 只需要确定种群大小和迭代次数剩下的机制都是内部自适应的这对不熟悉优化算法的 MATLAB 用户更友好。2.3 适应度函数与优化目标把训练误差变成寻优信号IWOA 优化 BILSTM 的关键是把超参数组合编码成鲸鱼个体的位置向量。资源里优化的四个参数依次是最大迭代次数MaxEpochs、隐藏层节点数numHiddenUnits、初始学习率InitialLearnRate、正则化系数L2Regularization。每一只鲸鱼的位置就是一个四维向量算法通过适应度函数评估这组参数下模型的预测误差再迭代更新位置。适应度函数设计上通常会留一部分数据做验证集每次寻优都临时训练一个 BILSTM在验证集上计算预测值和真实值的均方根误差 RMSE把这个 RMSE 作为该位置的适应度值。误差越小说明这组参数越合适鲸鱼的位置就越靠近最优解。迭代结束后解码全局最优位置得到一组训练参数再在测试集上完成最终预测。注意这里有一个天然代价每次适应度评估都要真正训练一次 BILSTM数据集稍大一点就很耗时。所以资源里把网络层数控制得比较简单训练轮数上限也做了约束整体算是在“搜索质量”和“单次训练开销”之间取的平衡。3. 资源结构与数据替换从下载到跑通自己的数据集3.1 文件清单解读主程序、目标函数、画图脚本的分工解压这份资源后约 22 个文件核心结构可以按功能分成四组。主程序是main1.m和main2.m前者跑普通 BILSTM 基线预测后者跑 IWOA-BILSTM 优化训练数据处理集中在data_process.m负责读 Excel、归一化、划分训练集和测试集。优化相关的是initialization.m、Bounds.m、fitness.m、forlstm.m分别是种群初始化、参数边界约束、适应度计算、LSTM 构建。绘图和指标输出由huatu.m、result.m、R2.m、NSE.m完成。两个.mat文件保存了训练完成后的网络结果方便直接载入做对比。文件功能说明main1.mBILSTM 基线预测定一组手工参数训练并输出预测曲线main2.mIWOA-BILSTM 主程序跑完整优化流程输出最优参数和预测结果data_process.m数据导入与预处理读数据集.xlsx做归一化和数据划分fitness.m适应度函数训练一个 BILSTM 并返回验证误差initialization.m种群初始化生成初始鲸鱼位置Bounds.m参数边界约束越界处理把鲸鱼拉回合法区间forlstm.m单次 LSTM 构建定义网络层结构和训练选项huatu.m / result.m绘图与结果汇总生成对比图、收敛曲线、指标表3.2 数据集.xlsx 的格式与替换步骤资源自带数据集.xlsx默认是单变量时间序列。打开能看到两列左右的内容一列是时间或序号另一列是待预测的观测值。实际使用时把自己的数据整列替换掉原有数值列即可。替换后需要关注data_process.m里的几个关键变量输入输出延迟步数、训练集占比、归一化方式。我一般会这样改造数据接入部分先读取 Excel 数据确认列号和观测数量把原序列改造成“用前 k 步预测下一步”的样本对形成特征矩阵和标签向量按比例切出训练集和测试集对训练集做归一化再用训练集的均值和标准差去归一化测试集避免引入未来信息。data readmatrix(数据集.xlsx); seq data(:, 2); % 取第二列观测值 seq seq(~isnan(seq)); % 去掉空值行 numSteps 12; % 前 12 步预测下一步 XTrain []; YTrain []; for i 1:length(seq) - numSteps XTrain [XTrain; seq(i:inumSteps-1)]; YTrain [YTrain; seq(inumSteps)]; end这里XTrain的每一行是一个长度为numSteps的滑动窗口YTrain是对应的下一时刻目标值。numSteps直接决定模型能看到多长的历史依赖太小模型学不到趋势太大会把训练样本数量压得很低一般先设 10 到 15 试跑再看验证集误差调整。这段代码跑通后main1.m和main2.m里补一句“调用 data_process 获取训练数据”后续预测流程基本不用动。3.3 运行顺序与 MATLAB 版本兼容性如果第一次跑通为主建议按“main2 → main1 → huatu”的顺序执行。先跑 main2 得到最优参数并保存.mat文件再跑 main1 对比 BILSTM 直接预测的结果最后用huatu.m把两条预测曲线、真实值曲线和适应度收敛曲线画在一起。版本方面资源标题里写了要求 2019 及以上版本这个要求主要来自两点一是bilstmLayer在 2019 版本才进入正式版更早的版本里trainNetwork是不支持双向 LSTM 层的二是部分训练选项如ValidationFrequency和相关输入格式在旧版本里行为不同。建议用 2019b 或更高版本运行。4. 核心代码逐段拆解适应度、主循环、边界约束怎么落地4.1 fitness.m 的结构训练一个 BILSTM 并返回误差适应度函数是整个优化过程的“裁判”。每次鲸鱼位置更新后算法都要调用一次fitness把位置向量解码成四个超参数临时训练一个 BILSTM计算验证集 RMSE 并返回。下面是这个文件的核心结构function rmse fitness(params, XTrain, YTrain, XVal, YVal) maxEpochs round(params(1)); % 最大迭代次数 numHidden round(params(2)); % 隐藏层节点数 learnRate params(3); % 初始学习率 l2Regular params(4); % 正则化系数 if numHidden 1 numHidden 1; end layers [ sequenceInputLayer(size(XTrain, 2)) bilstmLayer(numHidden, OutputMode, last) fullyConnectedLayer(1) regressionLayer]; options trainingOptions(adam, ... MaxEpochs, maxEpochs, ... InitialLearnRate, learnRate, ... L2Regularization, l2Regular, ... Verbose, 0, ... Shuffle, every-epoch); net trainNetwork(XTrain, YTrain, layers, options); YPred predict(net, XVal); rmse sqrt(mean((YVal - YPred).^2)); endround()把鲸鱼位置里的隐藏层节点数取整因为 LSTM 单元数必须是整数sequenceInputLayer(size(XTrain, 2))表示每个时间步输入的特征维度单变量预测时是 1多变量预测时改成特征列数。bilstmLayer(numHidden, OutputMode, last)返回的是最后一个时间步的拼接输出后面接fullyConnectedLayer(1)压成单个回归值。trainNetwork的输入XTrain是三维数组样本数 × 时间步 × 特征数注意数据维度写错会在这一步报错。4.2 IWOA 主循环鲸鱼位置更新与边界处理主循环的逻辑是这样先用initialization.m生成种群位置矩阵每一行是一条鲸鱼也就是一组四维参数随后在每次迭代里计算每条鲸鱼的适应度记录全局最优位置再按 WOA 机制更新位置。IWOA 的改进体现在收敛因子和步长更新方式上常见实现是把线性递减改成非线性衰减for t 1:maxIter a 2 * (1 - (t / maxIter)^0.7); % 非线性收敛因子 for i 1:popSize r rand(); if r 0.5 % 包围猎物 A 2 * a * rand() - a; C 2 * rand(); D abs(C * bestPos - positions(i, :)); newPos bestPos - A * D; else % 气泡网攻击螺旋更新 l ( -1 - t / maxIter ) * rand() 1; D abs(bestPos - positions(i, :)); newPos D * exp(2 * pi * l * 1i); % 复数螺旋 newPos real(newPos) bestPos * 0.5; end positions(i, :) boundCheck(newPos, lb, ub); % 越界拉回 end enda从接近 2 的位置往 0 非线性下降前半程下降较快、探索范围大后半程缓慢逼近 0、便于局部精细搜索这就是 IWOA 和标准 WOA 最直观的差异。boundCheck做边界修正如果某个维度的值超过Bounds.m定义的上限或下限就把它拉回最近边界避免出现负学习率或超过数据长度的隐藏层节点数。4.3 main1 与 main2 的分工单次预测和优化后对比main1.m比较简单手工设一组固定超参数训练普通 BILSTM在测试集上预测并计算 R2、MAE、MSE、RMSE。main2.m则是先执行完整的 IWOA 寻优流程把最优参数解码出来重新训练一次模型再同样计算指标并和 main1 的指标放在一起展示。% main1.m 核心流程 data_process; % 加载并预处理数据 layers [ ... sequenceInputLayer(1) bilstmLayer(64, OutputMode, last) fullyConnectedLayer(1) regressionLayer]; options trainingOptions(adam, ... MaxEpochs, 200, ... InitialLearnRate, 0.01, ... L2Regularization, 0.001); net trainNetwork(XTrain, YTrain, layers, options); YPred predict(net, XTest); r2 R2(YTest, YPred); rmse sqrt(mean((YTest - YPred).^2));data_process这里是无参调用因为数据已经从 Excel 读入工作区这种方式要求各脚本共享同一个工作区变量跑的时候要注意别在中间 clear 掉关键变量。R2()是资源自带的拟合优度计算函数R2 越接近 1 说明预测曲线和真实曲线贴合度越高RMSE 则反映绝对误差水平两者要放在一起看不能只看一个。5. 避坑与常见问题排查五个最容易翻车的现场5.1 报错“未定义函数或变量”现象下载后直接双击运行 main1.m第一行就报错提示某个函数名未定义。原因绝大多数是文件夹路径问题。MATLAB 默认不会自动把当前文件夹下的子文件加入搜索路径如果脚本散在多级目录里fitness.m、R2.m这些子函数找不到。解决打开资源根目录右键选择添加到路径或者用addpath(genpath(pwd))把整个目录树加入搜索路径然后再运行主程序。我是建议每次换机器都先执行一遍这句能省掉大量莫名其妙的下半场报错。5.2 数据读取后维度错乱现象数据集.xlsx 明明只有两列跑readmatrix读进来却变成100×3甚至更大。原因Excel 文件右侧残留了没用的格式或隐藏空列readmatrix默认读取整个 sheet 的有效范围把空列也读进来了。解决先用range参数指定读取区域比如只读A1:B200或者读进来后直接截取前两列。更稳妥的做法是自己在 data_process.m 开头写死数据范围再检查size(data)是否符合预期不对就报错提示。5.3 预测结果是一条斜线或近似常数现象IWOA 寻优结束最终预测曲线几乎是一条直线R2 可能是负的。原因数据没有做归一化或者归一化之后预测值没有做反归一化导致输出被全连接层压到某个均值附近。另一个常见原因是测试集和训练集分布差异过大模型学到的映射关系在新数据上完全失效。解决检查数据预处理流程训练集和测试集要使用同一组归一化参数预测完成后用训练集的均值和标准差做反变换。原则是归一化参数只能来自训练集绝不能用整个序列的全局参数不然就是引入了未来数据信息属于典型的泄漏。5.4 两次运行结果差异很大现象同样的代码第一次跑 R2 是 0.85第二次变成 0.91随机性很强。原因网络初始化权重随机、训练数据的 Shuffle 随机、鲸鱼种群初始化随机这几个随机源叠加导致结果不可复现。解决在 main1.m 和 main2.m 开头加rng(42)固定随机种子种群初始化里如果有rand也统一在同一个种子之后生成。做实验对比时必须固定种子否则你根本分不清结果差异来自算法改进还是随机波动。5.5 适应度评估太慢一次寻优要跑几小时现象主循环里每一次迭代都要训练几十条鲸鱼每条鲸鱼训练 200 轮总训练次数爆炸。原因这个问题不是 bug是机制决定的。每次适应度评估都要完整训练一次网络而MaxEpochs上限设得又很高。解决如果在自己的数据集上跑得太慢优先把优化参数里的最大迭代次数上限从 300 降到 100或者把训练集按比例抽稀验证集也减小到 100 个样本以内。IWOA 的核心目的是找到合理的超参数区间不是要精确比较每种参数的最终精度训练轮数少一点不影响参数排序趋势。6. 结果验证与进阶用法收敛曲线、指标对比与做实验的小习惯6.1 收敛曲线怎么看下降形态对应寻优质量main2.m跑完后会保存一条适应度收敛曲线。如果曲线在 10 代以内快速下降然后平走说明初始种群里就有比较好的参数组合后续迭代是在微调。如果曲线全程阶梯式下降每次下降都对应一次跳出了局部最优这是比较理想的状态。如果曲线从第 5 代开始就完全不变化且最终 RMSE 明显偏高说明种群已经早熟需要把 IWOA 的惯性权重参数调大一些或者在种群初始化时扩大参数范围。6.2 预测对比图与 R2、RMSE 的组合验证对比图里一般有三条线真实值、BILSTM 预测值、IWOA-BILSTM 预测值。不要只靠眼睛判断曲线贴合程度要把 R2、RMSE 两列指标摆在一起看。判定逻辑我一般是这样的R2 提升 0.02 以上同时 RMSE 下降 3% 以上才认为 IWOA 优化有效只提升 R2 但 RMSE 没变可能是曲线形状贴合但存在系统性偏移。多跑几组不同数据验证不要拿单一数据集的单次结果下结论。6.3 进阶实验替换算法、改适应度、扩展多变量输入这个资源最值钱的地方是框架清晰改造起来不怎么费劲。想证明 IWOA 比 WOA 有效就把位置更新部分替换回标准线性递减a保持其他条件完全一致跑一组对照想换评价指标把fitness.m里的 RMSE 改成 MAE模型会优先压低绝对误差在数据噪声大的场景里更合适想输入多变量特征把sequenceInputLayer的维度改成特征列数再把XTrain拼接成多列即可。% 多变量输入改造示意 XTrain XTrainAll(:, 1:numSteps, :); % 保留时间步和特征维度 featureDim size(XTrain, 3); layers [... sequenceInputLayer(featureDim) bilstmLayer(numHidden, OutputMode, last) fullyConnectedLayer(1) regressionLayer];从那以后我每次跑时序对比实验都强制走一遍固定流程先跑基线再跑优化算法每次运行前固定随机种子跑完把收敛曲线、最优参数、R2 和 RMSE 一起存档确认结果可复现再往下推进。这套习惯让我少踩了很多“优化无效”的坑也让我对这份资源的每一段代码都有了更深的把握希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询