非常实用的区间预测!基于QR-BiGRU的时间序列分位数区间预测程序,电池寿命、轴承寿命、负荷预测、光伏、风速、电价、碳价预测

适用平台:Matlab2022版及以上

  本程序参考中文EI期刊《电工技术学报》2024年1月30日网络首发文献:《基于QR-BiGRU神经网络与区间抗差增广状态估计的线路参数区间追踪估计》,提出基于QR-BiGRU双向门控循环单元网络的时间序列分位数区间预测程序。

文献解读:

文献提出基于 QR-BiGRU 神经网络的区间预测方法。所提方法考虑了历史状态估计时间序列数据的双向特征,实现了更为准确的时间序列预测;而分位数回归(Quantile Regression, QR)则是通过对预测结果的各分位点进行回归,实现对预测结果置信区间的获取, 通过融合区间预测,实现了电力系统线路参数更准确、可信的区间估计。

基于QR-BiGRU的区间预测方法:

什么是区间预测?

  想象一下你正在研究一支股票的价格走势。你知道股票价格每天都在波动,但你想了解的是未来某个时间点的股票价格可能会在什么范围内,这就是分位数回归要解决的问题。具体来说,分位数回归会为每个所选择的分位点拟合一个回归。

模型,这些模型可以用来预测在相应分位点处因变量的值。因此,每个模型的输出是根据所选择的分位点和自变量取值而变化的。

置信区间指标:置信区间告诉我们,在给定的置信水平下,真实值可能落在估计值周围的范围内。例如,95%置信区间:表示我们有95%的置信度认为真实值在这个黄色区间之间;80%置信区间:表示我们有80%的置信度认为真实值在这个淡粉色的区间之间,以此类推。这种区间表示方式可以帮助我们更好地理解估计值的可信程度。

QR-BiGRU区间预测的创新点:

BiGRU:是一种能够捕捉序列中长距离依赖关系的递归神经网络。通过双向性,BiGRU 可以同时考虑过去和未来的信息,提高了模型对时间序列动态变化的感知能力。

  • 更全面的特征:区间预测提供了一个预测结果的范围,而不是单一点估计值,这样可以更全面地反映预测的不确定性和可能的变化范围。

  • 决策制定:区间预测能够帮助决策者更准确地评估决策,从而制定更有效的战略和计划。

  • 应对不确定性:在不确定的环境下,区间预测能够更好地应对未来的变化和不确定性,使决策更为稳健。

  • 应对异常值:区间预测能够更好地应对异常值和噪声,因为它们不会过于依赖单一的数据点,而是考虑了整个预测范围。

  • 适用范围更广:区间预测不仅适用于金融领域,还可以应用于其他领域,如气象预测、供应链管理、电力市场、轴承寿命、电池寿命、电池SOC、SOH、负荷预测、光伏、风速、电价、碳价预测等。

程序数据集格式:

  • 数据格式:由时刻1—4的值预测时刻5的值,由时刻2—5的值预测时刻6的值,由时刻3—6的值预测时刻7的值,以此类推。

程序结果:模型结构

预测值与实际值对比:

评价指标结果:

部分核心代码:

%%  采用不同区间网络进行预测
for i = 1 : length(save_net)

    % 仿真预测
    p_sim1(i, :) = predict(save_net(i), p_train); 
    p_sim2(i, :) = predict(save_net(i), p_test ); 

    % 数据反归一化
    L_sim1{i} = mapminmax('reverse', p_sim1(i, :), ps_output);
    L_sim2{i} = mapminmax('reverse', p_sim2(i, :), ps_output);

    p_sim1(i, :) = mapminmax('reverse', p_sim1(i, :), ps_output);
    p_sim2(i, :) = mapminmax('reverse', p_sim2(i, :), ps_output);

end

%%  得到预测均值
T_sim1 = mean(p_sim1); 
T_sim2 = mean(p_sim2); 

%%  性能评估
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}, L_sim1{end}(end : -1 : 1)], ...
    'r', 'FaceColor', [1, 0.8, 0.8], 'EdgeColor', 'none')
hold on 
plot(1 : M, T_train, 'r-', 1 : M, T_sim1, 'b-', 'LineWidth', 1)
legend('95%的置信区间', '真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE = ' num2str(error1)]};
title(string)
xlim([1, M])
grid

figure
fill([1 : N, N : -1 : 1], [L_sim2{1}, L_sim2{end}(end : -1 : 1)], ...
    'r', 'FaceColor', [1, 0.913, 0.757], 'EdgeColor', 'none')
hold on 

fill([1 : N, N : -1 : 1], [L_sim2{3}, L_sim2{end-1}(end : -1 : 1)], ...
    'r', 'FaceColor', [1, 0.753, 0.896], 'EdgeColor', 'none')
hold on 

fill([1 : N, N : -1 : 1], [L_sim2{4}, L_sim2{end-2}(end : -1 : 1)], ...
    'r', 'FaceColor', [0.8, 0.412, 0.71], 'EdgeColor', 'none')
hold on 
plot(1 : N, T_test, 'r-', 1 : N, T_sim2, 'b-', 'LineWidth', 2)

legend('95%的置信区间','80%的置信区间','70%的置信区间', '真实值', '预测值')

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  - mean2(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)])

%%  指标计算(区间覆盖率和区间平均宽度百分比)
p_sim1 = p_sim1'; T_train = T_train';
p_sim2 = p_sim2'; T_test  = T_test' ;

picp1 = PICP (p_sim1, T_train);
pimw1 = PIMWP(p_sim1, T_train);
disp(['训练集的区间覆盖率为:', num2str(picp1), '。区间平均宽度百分比为:', num2str(pimw1)])

picp2 = PICP (p_sim2, T_test);
pimw2 = PIMWP(p_sim2, T_test);
disp(['测试集的区间覆盖率为:', num2str(picp2), '。区间平均宽度百分比为:', num2str(pimw2)])

%% 来自:公众号《创新优化及预测代码》
T_sim2 = T_sim2';         % 转置适应计算
%% 测试集结果
figure;
plotregression(T_test,T_sim2,['回归图']);
figure;
ploterrhist(T_test-T_sim2,['误差直方图']);

%% 均方根误差 RMSE
error2 = sqrt(sum((T_test - T_sim2).^2)./N);

%%
%决定系数
R2 = 1 - norm(T_test - T_sim2)^2 / norm(T_test - mean(T_test))^2;

%%
%均方误差 MSE
mse2 = sum((T_sim2 - T_test).^2)./N;
%%
%RPD 剩余预测残差
SE=std(T_sim2-T_test);
RPD2=std(T_test)/SE;

%% 平均绝对误差MAE
MAE2 = mean(abs(T_test - T_sim2));

%% 平均绝对百分比误差MAPE
MAPE2 = mean(abs((T_test - T_sim2)./T_test));

%% 预测集绘图
N = length(T_test);
figure
plot(1:N,T_test,'c-',1:N,T_sim2,'m-','LineWidth',2)
legend('真实值','模型预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'测试集预测结果对比';['(R^2 =' num2str(R2) ' RMSE= ' num2str(error2) ' MSE= ' num2str(mse2) ' RP= ' num2str(RPD2) ')']};
title(string)

%% 测试集误差图
figure 
ERROR3=T_test-T_sim2;
bar(ERROR3,'c')
xlabel('测试集样本编号')
ylabel('预测误差')
title('测试集预测误差')
grid on;
legend('模型预测输出误差')
%% 绘制线性拟合图 %% 来自:公众号《创新优化及预测代码》

%% 预测集拟合效果图
figure
plot(T_test,T_sim2,'ob');
xlabel('真实值')
ylabel('预测值')
string1 = {'测试集效果图';['R^2=' num2str(R2) ' RMSE=' num2str(error2) ]};
title(string1)
hold on ;h=lsline();
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])

%% 打印出评价指标
disp(['-----------------------误差计算--------------------------'])
disp(['评价结果如下所示:'])
disp(['平均绝对误差MAE为:',num2str(MAE2)])
disp(['均方误差MSE为: ',num2str(mse2)])
disp(['均方根误差RMSE为: ',num2str(error2)])
disp(['决定系数R^2为: ',num2str(R2)])
disp(['剩余预测残差RP为: ',num2str(RPD2)])
disp(['平均绝对百分比误差MAPE为: ',num2str(MAPE2)])
grid
%% 来自:公众号《创新优化及预测代码》

欢迎感兴趣的小伙伴联系小编获取完整代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值