数据准备
- 从一个Excel文件中加载数据,并将其重构为行向量。
将数据集分为训练集(前90%的数据)和测试集(后10%的数据)。
对训练数据进行标准化处理,使其均值为0,标准差为1。测试数据也使用相同的均值和标准差进行标准化。
准备LSTM网络的输入和输出。对于训练集和测试集,输入是当前时间步的数据,输出是下一个时间步的数据。
模型初始化
- 创建一个LSTM回归网络,包括一个序列输入层、一个LSTM层(100个隐藏单元)、一个全连接层和一个回归输出层。
LSTM用于处理时间序列数据,通过长短期记忆来捕捉时间序列的动态特性。
WOA+LSTM
使用鲸鱼优化算法(WOA)来优化LSTM网络的学习率。
- 初始化搜索代理的数量、最大迭代次数、领导者的位置向量和得分。
在每次迭代中,对每个搜索代理执行以下操作: - 保证搜索代理位置在预定的搜索空间内。
使用当前搜索代理的位置(即学习率)来训练LSTM网络,并评估其性能(使用均方根误差,RMSE)。
如果找到更好的解(即更低的RMSE),则更新领导者的位置和得分。
根据WOA算法更新搜索代理的位置,以探索更好的解。
迭代直到达到最大迭代次数。
预测
- 使用最佳找到的模型参数(即领导者的位置对应的学习率)和最佳网络模型来进行预测。
评判指标
- 计算和显示预测结果的MSE(均方误差)、MAE(平均绝对误差)、R(相关系数)和RMSE(均方根误差)。
绘图
绘制三个图形来展示预测结果:
- 第一个图展示了实际观测值和预测值。
- 第二个图展示了预测值和实际值之间的误差。
- 第三个图展示了WOA优化过程中误差适应度值随迭代次数的变化
部分代码
// An highlighted block
clc;clear;close all;
%% 数据准备
%加载数据,重构为行向量
data = xlsread('IMF.xlsx','Sheet1','A1:A1179')';
%序列的前 90% 用于训练,后 10% 用于测试
numTimeStepsTrain = floor(0.9*numel(data));
dataTrain = data(1:numTimeStepsTrain);
dataTest = data(numTimeStepsTrain:end);
% 数据标准化
mu = mean(dataTrain);
sigma = std(dataTrain);
dataTrainStandardized = (dataTrain - mu) / sigma;
dataTestStandardized = (dataTest - mu) / sigma;
%输入LSTM的时间序列交替一个时间步
XTrain = dataTrainStandardized(1:end-1);%训练集输入
YTrain = dataTrainStandardized(2:end);%训练集输出
XTest = dataTestStandardized(1:end-1);%测试集输入
YTest = dataTestStandardized(2:end);%测试集输出
%% 模型初始化
%创建LSTM回归网络,指定LSTM层的隐含单元个数96*3,序列预测,因此,输入一维,输出一维
numFeatures =1;%输入层数
numResponses = 1;%输出层数
numHiddenUnits = 100;%隐藏层,数值可以更改,可作为对比模型进行参数调试
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits)
fullyConnectedLayer(numResponses)
regressionLayer];
%% WOA+LSTM
lb=0.001;%学习率下限
ub=0.1;%学习率上限
dim=1;%维度,即一个优化参数
% 初始化搜索代理的数量
SearchAgents_no=1; % 搜索代理的数量
Max_iter=1; % 最大迭代次数
% 初始化领导者的位置向量和得分
Leader_pos=zeros(1,dim); % 领导者的位置初始化为零向量
Leader_score=inf; % 初始化领导者得分为无穷大,对于最小化问题
% 初始化搜索代理的位置
Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb; % 随机初始化搜索代理的位置
Convergence_curve=zeros(1,Max_iter); % 记录每次迭代中的最佳值
完整代码私信我发送