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

news2025/1/16 19:05:20

适用平台: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
%% 来自:公众号《创新优化及预测代码》

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解读 PICO 全新无灯环手柄背后的技术突破

从上世纪70年代的雅达利游戏机开始到后来的PS,Xbox和Switch等,按钮式控制器一直是团队输入的主要方式,并将继续在相当长的时间里继续作为重要的交互方式。这种控制器同样在新兴的XR系统中扮演着关键的角色,通过熟悉的按钮布局和物…

Scala--01--简介、环境搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. Scala简介1.1 Scala是什么?官网: [https://scala-lang.org/](https://scala-lang.org/)官方文档: [https://docs.scala-lang.…

Unity中的网格创建和曲线变形

Unity中的网格创建和曲线变形 3D贝塞尔曲线变形贝塞尔曲线基础线性公式二次方公式三次方公式 Unity 实现3D贝塞尔曲线变形准备工作脚本概述变量定义 变量解析函数解析 获取所有子节点GetAllChildren 获取所有子节点UpdateBezierBend 控制点更新CalculateBezier Bezier 曲线公式…

解锁基于LLMS的咒语:通过上下文学习重新思考对齐

一、写作动机: 最近的一项研究,LIMA,表明仅使用1K个示例进行SFT也可以实现显著的对齐性能,这表明对齐微调的效果可能是“表面的”。(知识和推理能力来源于预训练,而不是必须通过对齐微调获得的。&#xff…

掌握未来数据管理:Tidb数据库学习网站全攻略!

介绍:TiDB是一个开源的分布式关系型数据库,由PingCAP公司设计和研发。以下是对TiDB的详细介绍: HTAP支持:TiDB能够同时处理在线事务处理(OLTP)和在线分析处理(OLAP),这使…

50、东北大学、阿尔伯塔大学:Hi-GCN从2个层次角度进行图学习,用来诊断脑部疾病[你这和MVS-GCN套娃呢?]

本文由东北大学医学图像智能计算教育部重点实验室&#xff0c;加拿大阿尔伯塔大学于2020年10.24日发表于<Computers in Biology and Medicine> JCR\IF: Q1\7.7 Abstract&#xff1a; 目的:近年来&#xff0c;脑连接网络已被用于神经系统疾病的分类&#xff0c;如自闭症…

数据仓库的设计开发应用(二)

目录 四、数据仓库的设计&#xff08;一&#xff09;需求分析&#xff08;二&#xff09;概念设计&#xff08;三&#xff09;逻辑设计&#xff08;四&#xff09;物理设计 四、数据仓库的设计 数据仓库的设计包括需求分析、概念设计、逻辑设计和物理设计四个阶段&#xff0c;其…

计算机毕业设计-基于大数据分析的服装定制网的设计与实现

概要 人民的日常生活离不开“衣食住行”&#xff0c;四者之中“食住行”发展迅猛&#xff0c;突飞猛进的发展推动了产业的升级更新。而与之形成鲜明对比的是&#xff0c;服装行业作为传统古老的行业&#xff0c;因为产业结构特征、个性化需求等问题&#xff0c;难以出现推动行业…

算法第二十七天-猜数字游戏

猜数字游戏 题目要求 解体思路 有多少位属于数字和确切位置都猜对了&#xff1a;统计 s e c r e t [ i ] g u e s s [ i ] secret[i]guess[i] secret[i]guess[i]的个数。 有多少位属于数字猜对了但是位置不对&#xff1a;用两个数组&#xff08;哈希表&#xff09;分别统计…

C#实现哈希查找算法​

C#实现哈希查找算法 下面是一个简单的C#代码示例&#xff0c;实现了哈希查找算法&#xff1a; using System; using System.Collections.Generic;class HashSearch {// 哈希查找函数static int HashSearchFunction(int[] array, int target){// 创建一个Dictionary用于存储数…

this是什么?为什么要改变this?怎么改变 this 指向?

目录 this 是什么&#xff1f; 箭头函数中的 this 为什么要改变 this 指向&#xff1f; 改变 this 指向的三种方法 call(无数个参数) apply(两个参数) bind(无数个参数) this 是什么&#xff1f; 在对象方法中&#xff0c;this 指的是所有者对象&#xff08;方法的拥有者…

程序人生——Java数组和集合使用建议(1)

目录 引出数组和集合建议60&#xff1a;性能考虑&#xff0c;数组是首选建议61&#xff1a;若有必要&#xff0c;使用变长数组建议62&#xff1a;警惕数组的浅拷贝 建议63&#xff1a;在明确的场景下&#xff0c;为集合指定初始容量建议64&#xff1a;多种最值算法&#xff0c;…

YOLOv8 | 添加注意力机制报错KeyError:已解决,详细步骤

目录 添加注意力机制报错 报错的原因 注意事项 解决错误流程 代码分享 ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;h…

Linux中GPU相关命令

Linux查看显卡信息&#xff1a; lspci | grep -i vga 使用nvidia GPU可以&#xff1a; lspci | grep -i nvidia1 前边的序号 "00:0f.0"是显卡的代号(这里是用的虚拟机); 查看指定显卡的详细信息用以下指令&#xff1a; lspci -v -s 00:0f.01 Linux查看Nvidia显…

探索仿函数(Functor):C++中的灵活函数对象

文章目录 一、仿函数定义及使用二、仿函数与函数指针的区别三、仿函数与算法的关系四、仿函数的实践用例 在C编程中&#xff0c;我们经常需要对数据进行排序、筛选或者其他操作。为了实现这些功能&#xff0c;C标准库提供了许多通用的算法和容器&#xff0c;而其中一个重要的概…

Linux--基本知识入门

一.几个基本知识 终端: CtrlAltT 或者桌面/文件夹右键,打开终端切换为管理员: sudo su 退出:exit查看内核版本号: uname -a内核版本号含义: 5 代表主版本号;13代表次版本号;0代表修订版本号;30代表修订版本的第几次微调;数字越大表示内核越新. 二.目录…

git bash 命令行反应慢、卡顿(定位出根本原因)

参考该博主&#xff1a; https://blog.csdn.net/weixin_50212044/article/details/131575987?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-131575987-blog-130024908.235v43pc_blog_bottom_relevance_base4&spm1001.210…

26.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-实现生成日志文件的功能

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;25.利用全新的通…

【北京大学】徐高《金融经济学二十五讲》

一、经济的任务 经济的任务之一是确保有效地分配稀缺资源&#xff0c;这是经济学中的一个核心问题。资源是有限的&#xff0c;而需求是无限的&#xff0c;因此经济系统需要通过合理的机制来分配资源以满足社会的需求。以下是关于经济分配资源的几个方面&#xff1a; 1. 资源配…

Matlab进阶绘图第45期—蝴蝶气泡图

蝴蝶气泡图是一种特殊的柱泡图/气泡柱状图。 蝴蝶图一般由左右两个水平柱状图组合而成&#xff0c;其形如蝴蝶展翅&#xff0c;可以很直观地展示两种数据直接的差异。 而蝴蝶气泡图则是在两个水平柱状图每根柱子外侧额外添加大小不同的气泡&#xff0c;用于表示另外一个数据变…