tic % 计时
%% 清空环境导入数据
clc %清空命令行的命令
clear all %清空工作区变量
close all %关闭程序运行过程中生成的所有图形窗口
warning off all
format compact;
currentFolder = pwd;
addpath(genpath(currentFolder)); %添加该目录以及子文件到路径
%% 初始数据导入数据
data = xlsread('data.xlsx', 'Sheet1');
n=6;
[x,y]=data_process(data,n);%前n个时刻 预测下一个时刻
%划分数据
n=size(x,1);
m=round(n*0.7);%前70%训练 后30%测试
input_train=x(1:m,:)';
input_test=x(m+1:end,:)';
output_train=y(1:m,:)';
output_test=y(m+1:end,:)';
%-------------------训练数据、测速数据个数确定--------------------
%% 划分训练集和测试集
M = size(input_train, 2);
N = size(input_test, 2);
% input_train=input_train'; output_train=output_train';
% input_test=input_test'; output_test=output_test';
% 数据归一化
[inputn_train,inputps] =mapminmax(input_train);
[outputn_train,outputps]=mapminmax(output_train);
inputn_test =mapminmax('apply',input_test,inputps);
outputn_test=mapminmax('apply',output_test,outputps);
%% --------------BiLSTM优化----------------------
% 参数设置
SearchAgents = 5; % 种群数量
Max_iterations =10; % 迭代次数
lowerbound = [1e-10 0.0001 10 ];%三个参数的下限
upperbound = [1e-2 0.002 400 ];%三个参数的上限
dim = 3;%数量,即要优化的BiLSTM超参数个数
fobj = @(x)fun(x,inputn_train,outputn_train,outputps); %调用函数fun计算适应度函数值
%% 赋值;
[Best_score,Best_pos,Convergence_curve]=NGO(SearchAgents,Max_iterations,lowerbound,upperbound,dim,fobj) %% 北方苍鹰算法
%得到最优参数
L2Regularization = Best_pos(1,1); % 最佳L2正则化系数
InitialLearnRate = Best_pos(1,2); % 最佳初始学习率
NumOfUnits =abs(round( Best_pos(1,3))); % 最佳隐藏层节点数
%% ------------------利用优化参数重新训练BiLSTM并预测----------------------------
% 数据输入x的特征维度
inputSize = size(inputn_train,1);
% 数据输出y的维度
outputSize = size(outputn_train,1);
% 设置网络结构
layers = [ ...
sequenceInputLayer(inputSize) %输入层,参数是输入特征维数
bilstmLayer(NumOfUnits) %学习层,隐含层神经元的个数
dropoutLayer(0.2) %权重丢失率
fullyConnectedLayer(outputSize) %全连接层,也就是输出的维数
regressionLayer]; %回归层,该参数说明是在进行回归问题,而不是分类问题
% trainoption(bilstm)
opts = trainingOptions('adam', ... %优化算法
'MaxEpochs',100, ... %最大迭代次数
'GradientThreshold',1,... %梯度阈值,防止梯度爆炸
'ExecutionEnvironment','cpu',... %对于大型数据集合、长序列或大型网络,在 GPU 上进行预测计算通常比在 CPU 上快。其他情况下,在 CPU 上进行预测计算通常更快。
'InitialLearnRate',InitialLearnRate, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',120, ...
'LearnRateDropFactor',0.2, ... % 指定初始学习率 0.005,在 100 轮训练后通过乘以因子 0.2 来降低学习率。
'L2Regularization', L2Regularization, ... % 正则化参数
'Verbose',false, ... %如果将其设置为true,则有关训练进度的信息将被打印到命令窗口中。
'Plots','training-progress'... %构建曲线图, 若将'training-progress'替换为'none',则不画出曲线
); % 'MiniBatchSize',outputSize*30, ...
% 训练
BiLSTMnet = trainNetwork(inputn_train ,outputn_train ,layers,opts); % 网络训练
% 预测
[BiLSTMnet,BiLSTMoutputr_train]= predictAndUpdateState(BiLSTMnet,inputn_train); % 训练样本拟合值
BiLSTMoutput_train = mapminmax('reverse',BiLSTMoutputr_train,outputps); % 数据反归一化
%网络测试输出
BiLSTMoutputr_test= [];
for i = 1:N
[BiLSTMnet,BiLSTMoutputr_test(:,i)] = predictAndUpdateState(BiLSTMnet,inputn_test(:,i),'ExecutionEnvironment','cpu');
end
BiLSTMoutput_test= mapminmax('reverse',BiLSTMoutputr_test,outputps); %反归一化
toc
%% -----------------预测结果-------------------------
% 数据格式转换
BiLSTM_train =BiLSTMoutput_train';
BiLSTM_test = BiLSTMoutput_test';
train_DATA=output_train'; %训练样本标签
test_DATA= output_test'; %测试样本标签
%% 绘图
%% 均方根误差 RMSE
error1 = sqrt(sum((BiLSTM_train - train_DATA).^2)./M);
error2 = sqrt(sum((BiLSTM_test- test_DATA).^2)./N);
%%
%%
%均方误差 MSE
mse1 = sum((BiLSTM_train - train_DATA).^2)./M;
mse2 = sum((BiLSTM_test - test_DATA).^2)./N;
%%
%RPD 剩余预测残差
SE1=std(BiLSTM_train-train_DATA);
RPD1=std(train_DATA)/SE1;
SE=std(BiLSTM_test-test_DATA);
RPD2=std(test_DATA)/SE;
%% 平均绝对误差MAE
MAE1 = mean(abs(train_DATA - BiLSTM_train));
MAE2 = mean(abs(test_DATA - BiLSTM_test));
%% 平均绝对百分比误差MAPE
MAPE1 = mean(abs((train_DATA - BiLSTM_train)./train_DATA));
MAPE2 = mean(abs((test_DATA - BiLSTM_test)./test_DATA));
%% 训练集拟合效果图
%% 训练集绘图
figure
plot(BiLSTM_train,'-','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on
plot(train_DATA,'-','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend('NGO-BiLSTM预测值','真实值')
xlabel('预测样本')
ylabel('预测结果')
string={'训练集预测结果对比';[' RMSE= ' num2str(error1) ' MSE= ' num2str(mse1) ' RPD= ' num2str(RPD1) ')' ]};
title(string)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 训练集误差图
figure
bar((BiLSTM_train - train_DATA)./train_DATA)
legend('NGO-BiLSTM模型训练集相对误差','Location','NorthEast','FontName','华文宋体')
title('NGO-BiLSTM模型训练集相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 测试集绘图
figure
plot(BiLSTM_test,'-','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
hold on
plot(test_DATA,'-','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255)
legend('NGO-BiLSTM预测值','真实值')
xlabel('预测样本')
ylabel('预测结果')
string={'测试集预测结果对比';[' RMSE= ' num2str(error2) ' MSE= ' num2str(mse2) ' RPD= ' num2str(RPD2) ')']};
title(string)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 测试集误差图
figure
bar((BiLSTM_test - test_DATA)./test_DATA)
legend('NGO-BiLSTM模型测试集相对误差','Location','NorthEast','FontName','华文宋体')
title('NGO-BiLSTM模型测试集相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
% 绘制适应度曲线图
figure
plot(Convergence_curve,'linewidth',1.5);
grid on
xlabel('迭代次数','fontsize',12,'FontName','宋体');
ylabel('适应度函数','fontsize',12,'FontName','宋体');
title('优化收敛曲线')
grid on
%% 打印出评价指标
disp(['-----------------------误差计算--------------------------'])
disp(['评价结果如下所示:'])
disp(['平均绝对误差MAE为:',num2str(MAE2)])
disp(['均方误差MSE为: ',num2str(mse2)])
disp(['均方根误差RMSEP为: ',num2str(error2)])
disp(['剩余预测残差RPD为: ',num2str(RPD2)])
disp(['平均绝对百分比误差MAPE为: ',num2str(MAPE2)])
grid
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Matlab实现NGO-BiLSTM北方苍鹰算法优化双向长短期记忆网络时间序列预测(完整源码和数据) 1.data为数据集,单变量时间序列数据集。 2.MainNGOBiLSTMTS.m为程序主文件,其他为函数文件无需运行。 3.命令窗口输出MAE、MSE、RMSEP、R^2、RPD和MAPE,可在下载区获取数据和程序内容。 4.北方苍鹰算法优化参数为学习率,隐藏层节点个数,正则化参数。 注意程序和数据放在一个文件夹,运行环境为Matlab2018及以上。 5.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 6.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 7.作者介绍:某大厂资深算法工程师,从事Matlab、Python算法仿真工作8年;擅长智能优化算法、神经网络预测、信号处理、元胞自动机等多种领域的算法仿真实验,更多仿真源码、数据集定制私信+。
资源推荐
资源详情
资源评论
收起资源包目录
时序预测:NGO-BiLSTMTS.zip (12个子文件)
3.png 45KB
1.png 52KB
NGO-BiLSTMTS
fun.m 6KB
NGO.m 3KB
MainNGOBiLSTMTS.m 8KB
data_process.m 174B
data.xlsx 9KB
6.png 18KB
NGO-BiLSTMTS.zip 13KB
5.png 26KB
4.png 30KB
2.png 31KB
共 12 条
- 1
资源评论
- zzkq11222332024-05-17这个资源内容超赞,对我来说很有价值,很实用,感谢大佬分享~
- m0_639598452024-02-07资源内容详实,描述详尽,解决了我的问题,受益匪浅,学到了。
机器学习之心
- 粉丝: 2w+
- 资源: 1014
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功