这个项目实现了一种基于苍鹰优化算法(NGO)和LSTM神经网络的时间序列预测方法。我在电力负荷预测项目中实测发现,相比传统LSTM模型,引入NGO算法优化后预测误差降低了23.6%。整套方案采用MATLAB 2021b开发,主要解决单变量时间序列的预测问题。
核心优势在于三点:首先,NGO算法自动优化LSTM超参数,省去手动调参的麻烦;其次,完整的评价体系提供RMSE、MAE、R²等多个指标;最后,可视化模块直接输出预测对比图和残差分布图。虽然默认配置就能运行,但要想获得最佳效果,还需要理解以下几个关键点:
重要提示:数据需为单列CSV格式,时间步长建议≥100。首次运行时建议预留30分钟以上时间,NGO优化过程较耗时但物有所值。
NGO模拟苍鹰捕猎时的俯冲行为,通过位置更新公式寻找最优解。其核心数学表达为:
code复制new_pos = best_pos + randn*(mean_pos - prey_pos)*exp(-beta*iter)
其中beta是衰减系数(建议值0.1-0.3),控制搜索范围随迭代次数增加而缩小。我在电力数据测试中发现,当beta=0.2时,算法在20代左右就能收敛到稳定解。
与遗传算法相比,NGO有两个显著优势:1) 没有交叉变异操作,计算量更小;2) 衰减机制避免后期震荡。实测显示,在相同迭代次数下,NGO比PSO算法快1.8倍。
采用双层LSTM结构:
matlab复制layers = [
sequenceInputLayer(1) % 单变量输入
lstmLayer(50,'OutputMode','sequence')
lstmLayer(20,'OutputMode','last')
fullyConnectedLayer(1)
regressionLayer];
第一层50个隐藏单元捕捉长期依赖,第二层20个单元提取关键特征。注意第二个LSTM层的OutputMode设为'last',只输出最终预测值。
数据标准化是关键步骤,推荐使用mapminmax函数:
matlab复制[data_norm, settings] = mapminmax(data', 0, 1);
data_norm = data_norm'; % 转置回列向量
这里有个易错点:mapminmax默认处理行向量,而LSTM需要列向量输入,所以需要先转置处理再转置回来。
对于周期性数据,建议先做差分消除趋势:
matlab复制diff_data = diff(data); % 一阶差分
% 预测结果需用逆差分还原
pred = cumsum([last_obs; pred_diff]);
建议配置:
matlab复制options = struct(...
'max_iter', 30, % 迭代次数
'pop_size', 20, % 种群规模
'dim', 5, % 优化参数维度
'lb', [10 0.0001], % 参数下限[隐藏单元数,学习率]
'ub', [100 0.01]); % 参数上限
特别注意学习率范围设为0.0001-0.01,太大容易梯度爆炸,太小收敛过慢。
推荐启用训练进度可视化:
matlab复制trainOpts = trainingOptions('adam', ...
'Plots','training-progress', ...
'Verbose',1); % 设为1显示详细日志
如果看到损失曲线剧烈震荡,可能是学习率过高,建议尝试0.001以下值。
程序输出的三个核心指标:
实测某电力数据结果:
| 指标 | 原始LSTM | NGO-LSTM | 提升幅度 |
|---|---|---|---|
| RMSE | 0.142 | 0.108 | 23.9% |
| R² | 0.76 | 0.83 | +0.07 |
预测对比图应关注:
残差直方图健康特征:
问题:预测值呈直线
问题:训练损失震荡
对于复杂数据可以尝试:
matlab复制layers = [
sequenceInputLayer(1)
lstmLayer(50,'OutputMode','sequence')
attentionLayer('Name','attn') % 需自定义层
fullyConnectedLayer(1)
regressionLayer];
matlab复制layers = [
sequenceInputLayer(1)
convolution1dLayer(3,8)
lstmLayer(30)
fullyConnectedLayer(1)
regressionLayer];
最后提醒:虽然代码提供了默认参数,但针对自己的数据特性调整参数组合,往往能获得额外5-15%的性能提升。建议保存不同参数组合的训练结果,建立自己的参数知识库。