适用平台: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
%% 来自:公众号《创新优化及预测代码》
欢迎感兴趣的小伙伴联系小编获取完整代码