%% 基于GRU的时间序列区间预测
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
%% 导入数据(时间序列的单列数据)
% 功率数据
result = xlsread('data.xlsx');
%% 数据分析
num_samples = length(result); % 样本个数
kim = 4; % 延时步长(kim个历史数据作为自变量)
zim = 1; % 跨zim个时间点进行预测
%% 划分数据集
for i = 1: num_samples - kim - zim + 1
res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];
end
%% 数据集分析
outdim = 1; % 最后一列为输出
num_size = 0.7; % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
%% 划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
%% 数据归一化
[P_train, ps_input] = mapminmax(P_train, 0, 1);
P_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% 数据平铺
P_train = double(reshape(P_train, f_, 1, 1, M));
P_test = double(reshape(P_test , f_, 1, 1, N));
t_train = t_train';
t_test = t_test' ;
%% 数据格式转换
for i = 1 : M
p_train{i, 1} = P_train(:, :, 1, i);
end
for i = 1 : N
p_test{i, 1} = P_test( :, :, 1, i);
end
%% 创建模型GRU
for i = 0.1:0.1:0.9
layers = [ ...
sequenceInputLayer(f_,'name','input') %输入层设置
gruLayer(50,'Outputmode','sequence','name','hidden1')
reluLayer % Relu激活层
dropoutLayer(0.3,'name','dropout_1')
gruLayer(50,'Outputmode','last','name','hidden2')
dropoutLayer(0.3,'name','drdiopout_2')
fullyConnectedLayer(outdim,'name','fullconnect') % 全连接层设置(影响输出维度)(cell层出来的输出层)
quanRegressionLayer('out',i)];
% 参数设置
options = trainingOptions('adam', ... % Adam 梯度下降算法
'MiniBatchSize', 64, ... % 批大小
'MaxEpochs',100, ... % 最大迭代次数
'InitialLearnRate', 1e-2, ... % 初始学习率为
'LearnRateSchedule', 'piecewise', ... % 学习率下降
'LearnRateDropFactor', 0.5, ... % 学习率下降因子
'LearnRateDropPeriod', 50, ... % 经过训练后 学习率为 0.01 * 0.5
'Shuffle', 'every-epoch', ... % 每次训练打乱数据集
'Plots', 'none', ... % 不画出曲线
'Verbose', 1);
%
% 网络训练
net1 = trainNetwork(p_train, t_train, layers, options);
net2(floor(i*10)) = trainNetwork(p_train, t_train, layers, options);
end
%% 仿真测试
t_sim1 = predict(net1, p_train);
t_sim2 = predict(net1, p_test );
% 区间预测
for i = 1:length(net2)
l_sim1(:, i) = predict(net2(i), p_train);
l_sim2(:, i) = predict(net2(i), p_test );
end
%% 查看网络结构
analyzeNetwork(net1)
%% 数据反归一化
L_sim1 = mapminmax('reverse', l_sim1, ps_output);
L_sim2 = mapminmax('reverse', l_sim2, ps_output);
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
%% 均方根误差
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N);
%% 绘图
figure
fill([1 : M, M : -1 : 1], [L_sim1(:, 1); flipud(L_sim1(:, 9))], ...
'r', 'FaceColor', [250 192 0]./255, 'EdgeColor', 'none')
hold on
plot(1 : M, T_train, 'k-', 1 : M, L_sim1(:, 5), 'r-', 'LineWidth', 1)
legend('90%的置信区间', '真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE = ' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
fill([1 : N, N : -1 : 1], [L_sim2(:, 1); flipud(L_sim2(:, 9))], ...
'r', 'FaceColor', [250 192 0]./255, 'EdgeColor', 'none')
hold on
plot(1 : N, T_test, 'k-', 1 : N, L_sim2(:, 5), 'r-', 'LineWidth', 1)
legend('90%的置信区间', '真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['RMSE = ' num2str(error2)]};
title(string)
xlim([1, N])
grid
%% 相关指标计算
% R2
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test ))^2;
disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])
% MAE
mae1 = sum(abs(T_sim1' - T_train)) ./ M ;
mae2 = sum(abs(T_sim2' - T_test )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])
% MBE
mbe1 = sum(T_sim1' - T_train) ./ M ;
mbe2 = sum(T_sim2' - T_test ) ./ N ;
disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])
%% 指标计算(区间覆盖率和区间平均宽度百分比)
L_sim1 = L_sim1'; T_train = T_train';
L_sim2 = L_sim2'; T_test = T_test' ;
picp1 = PICP (L_sim1, T_train);
pimw1 = PIMWP(L_sim1, T_train);
disp(['训练集的区间覆盖率为:', num2str(picp1), '。区间平均宽度百分比为:', num2str(pimw1)])
picp2 = PICP (L_sim2, T_test);
pimw2 = PIMWP(L_sim2, T_test);
disp(['测试集的区间覆盖率为:', num2str(picp2), '。区间平均宽度百分比为:', num2str(pimw2)])
没有合适的资源?快使用搜索试试~ 我知道了~
MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测(完整程序和数据)

共5个文件
m:4个
xlsx:1个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 61 浏览量
2023-08-17
23:37:49
上传
评论 1
收藏 20KB ZIP 举报
温馨提示
MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测(完整程序和数据) (主要应用于风速,负荷,功率)(完整程序和数据) 运行环境matlab2020及以上,输入输出单个变量。 excel数据,方便学习和替换数据。 QRGRU是一种基于GRU神经网络的模型,用于时间序列区间预测。它是使用分位数回归来进行预测的,这意味着它可以预测一系列可能的结果,而不仅仅是单个点预测。 具体来说,QRGRU使用GRU网络来学习时间序列的长期和短期依赖关系,然后使用分位数回归来预测一系列可能的结果。分位数回归是一种非常有用的技术,它可以预测出给定置信水平下的上限和下限,这对于时间序列预测非常有用。 GRU模型的预测能力很强,特别是在处理非线性时间序列时。它已经被广泛应用于股票市场、气象预测、交通预测等领域。
资源推荐
资源详情
资源评论



























收起资源包目录







共 5 条
- 1
资源评论


机器学习之心
- 粉丝: 2w+
- 资源: 1144
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
