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

机器学习之心
- 粉丝: 2w+
- 资源: 1124
最新资源
- 三段式电流保护Matlab Simulink仿真模型与实验:原理、相间距离保护及整定分析(多版本含操作指南),三段式电流保护Matlab Simulink仿真模型与实验:涵盖模型仿真文件、操作说明、保
- 批量下载源码:编译的Python whl包生成及其自动化源码获取方法,编译的Python二进制whl包批量下载源码解析与实现,编译的二进制Python的whl包批量下载源码 ,编译的二进制; Pyth
- 基于CFD的轴流风叶流体力学分析:高效能设计的策略与探讨,利用CFD计算流体力学分析轴流风叶的性能及优化设计,cfd 计算流体力学 分析轴流风叶 ,关键词:CFD;计算流体力学;轴流风叶;流场分析;气
- Matlab Simulink三闭环直流电机调速系统仿真:深度解析位置环、速度环与电流环的PI控制及PWM调制技术,附H桥正反转控制及详尽说明文档(R2022a版本),Matlab Simulink三
- 基于形状的跨平台模板匹配技术:Windows、Linux、ARM平台通用的C++实现与OpenCV、HALCON的替代方案,自研跨平台C++模板匹配技术:Windows、Linux、ARM通用,基于形
- 基于OpenCV的跨平台形状模板匹配:C++与C#在Windows与Linux下的应用与实现,适用于ARM等不同架构 ,基于OpenCV的跨平台模板匹配算法:C++与C#实现,支持Windows、Li
- 基于灰狼优化的高斯过程回归算法的锂电池SOH估算学习案例:利用NASA锂离子电池老化数据集的实验分析与MATLAB代码实现,基于Matlab的灰狼优化GPR算法锂电池SOH估算学习案例,电池SOH估
- 污水流量远程监测系统的设计
- 杏鲍菇栽培环境因子远程监测系统及模糊PID控制器的设计
- 医院室内空气质量实时监测系统
- 油浸式变压器三维温度场建模及在线温度监测系统研究
- 血液透析治疗仪的控制系统研究
- LCC-MMC三端混合直流系统:基于PSCAD的仿真研究与分析,LCC-MMC三端混合直流系统仿真分析与优化研究:基于PSCAD软件的模拟研究,LCC-MMC三端混合直流系统pscad仿真 ,LCC
- 诱芯诱捕器自动计数系统的研发
- 基于HTML+JavaScript等技术的心理咨询平台设计源码
- 光伏储能并网三端口仿真研究:DC升压与充放电管理、双PI控制及直流母线电压恒定策略探讨,“光伏储能并网三端口仿真:DC升降压、充放电管理、双向转换与稳压控制”,光伏 储能 并网 三端口 仿真 光伏 :
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


