区间预测 | MATLAB实现QRCNN-BiGRU卷积双向门控循环单元分位数回归时间序列区间预测

news2024/12/26 0:16:22

区间预测 | MATLAB实现QRCNN-BiGRU卷积双向门控循环单元分位数回归时间序列区间预测

目录

    • 区间预测 | MATLAB实现QRCNN-BiGRU卷积双向门控循环单元分位数回归时间序列区间预测
      • 效果一览
      • 基本介绍
      • 模型描述
      • 程序设计
      • 参考资料

效果一览

1
2

3

基本介绍

1.Matlab实现基于QRCNN-BiGRU分位数回归卷积双向门控循环单元的时间序列区间预测模型;
2.多图输出、多指标输出(MAE、RMSE、MSE、R2),多输入单输出,含不同置信区间图、概率密度图;
3.data为数据集,功率数据集,用过去一段时间的变量,预测目标,目标为最后一列,也可适用于负荷预测、风速预测;MainQRCNN_BiGRUTS为主程序,其余为函数文件,无需运行;
4.代码质量高,注释清楚,含数据预处理部分,处理缺失值,如果为nan,用上一行替代,也含核密度估计。

模型描述

QRCNN-BiGRU模型结合了卷积神经网络和双向门控循环单元,用于时间序列数据的分位数回归和区间预测。
分位数回归是一种回归分析方法,用于预测数据在不同分位数下的值,比如中位数、上四分位数、下四分位数等。区间预测则是指预测数据在一个给定的时间范围内的取值范围。
因此,QRCNN-BiGRU模型可以用于时间序列数据的分位数回归和区间预测,具有较好的预测性能。
QRCNN-BiGRU模型的具体公式可以分为两部分,一部分是QRCNN的公式,另一部分是BiGRU的公式。

  • QRCNN部分的公式如下:

  • 输入数据为 x ∈ R n × p x \in R^{n \times p} xRn×p,其中 n n n 是时间序列的长度, p p p 是每个时间步的特征数。

  • 卷积层:
    z i , j c = f ( ∑ k = 1 p W j , k c ∗ x i , k + b j c ) z^c_{i,j} = f(\sum_{k=1}^p W^c_{j,k} \ast x_{i,k} + b^c_j) zi,jc=f(k=1pWj,kcxi,k+bjc)

  • 其中 z i , j c z^c_{i,j} zi,jc 是第 i i i 个时间步的第 j j j 个卷积核的输出, W j , k c W^c_{j,k} Wj,kc 是第 j j j 个卷积核的第 k k k 个权重, ∗ \ast 表示卷积操作, b j c b^c_j bjc 是第 j j j 个卷积核的偏置, f f f 是激活函数。

  • 最大池化层:
    z i , j p = max ⁡ k = 1 l ( z i , j + k − 1 c ) z^p_{i,j} = \max_{k=1}^{l}(z^c_{i,j+k-1}) zi,jp=k=1maxl(zi,j+k1c)

  • 其中 z i , j p z^p_{i,j} zi,jp 是第 i i i 个时间步的第 j j j 个卷积核的最大池化输出, l l l 是池化窗口大小。

  • 全连接层:
    z i f = g ( ∑ j = 1 q W i , j f z i , j p + b i f ) z^f_i = g(\sum_{j=1}^q W^f_{i,j} z^p_{i,j} + b^f_i) zif=g(j=1qWi,jfzi,jp+bif)

  • 其中 z i f z^f_i zif 是第 i i i 个时间步的全连接层输出, W i , j f W^f_{i,j} Wi,jf 是第 i i i 个神经元连接到第 j j j 个池化输出的权重, b i f b^f_i bif 是第 i i i 个神经元的偏置, g g g 是激活函数。

  • 输出层:
    y ^ i = ∑ j = 1 k q j z i f + b \hat{y}_i = \sum_{j=1}^k q_j z^f_i + b y^i=j=1kqjzif+b

  • 其中 y ^ i \hat{y}_i y^i 是第 i i i 个时间步的预测值, q j q_j qj 是第 j j j 个分位数的权重, b b b 是偏置。

  • BiGRU部分的公式如下:

  • 输入数据为 x ∈ R n × p x \in R^{n \times p} xRn×p,其中 n n n 是时间序列的长度, p p p 是每个时间步的特征数。

  • 前向GRU:
    z t f = σ ( W f x t + U f h t − 1 + b f ) r t f = σ ( W r f x t + U r f h t − 1 + b r f ) h ~ t f = tanh ⁡ ( W h f x t + r t f ⊙ U h f h t − 1 + b h f ) h t f = ( 1 − z t f ) ⊙ h t − 1 f + z t f ⊙ h ~ t f z^f_t = \sigma(W^f x_t + U^f h_{t-1} + b^f) \\ r^f_t = \sigma(W_r^f x_t + U_r^f h_{t-1} + b_r^f) \\ \tilde{h}_t^f = \tanh(W_h^f x_t + r_t^f \odot U_h^f h_{t-1} + b_h^f) \\ h_t^f = (1 - z_t^f) \odot h_{t-1}^f + z_t^f \odot \tilde{h}_t^f ztf=σ(Wfxt+Ufht1+bf)rtf=σ(Wrfxt+Urfht1+brf)h~tf=tanh(Whfxt+rtfUhfht1+bhf)htf=(1ztf)ht1f+ztfh~tf

  • 其中 z t f z^f_t ztf 是前向GRU的更新门, r t f r^f_t rtf 是重置门, h ~ t f \tilde{h}_t^f h~tf 是候选隐藏状态, h t f h_t^f htf 是前向GRU的隐藏状态。

  • 后向GRU:
    z t b = σ ( W b x t + U b h t + 1 + b b ) r t b = σ ( W r b x t + U r b h t + 1 + b r b ) h ~ t b = tanh ⁡ ( W h b x t + r t b ⊙ U h b h t + 1 + b h b ) h t b = ( 1 − z t b ) ⊙ h t + 1 b + z t b ⊙ h ~ t b z^b_t = \sigma(W^b x_t + U^b h_{t+1} + b^b) \\ r^b_t = \sigma(W_r^b x_t + U_r^b h_{t+1} + b_r^b) \\ \tilde{h}_t^b = \tanh(W_h^b x_t + r_t^b \odot U_h^b h_{t+1} + b_h^b) \\ h_t^b = (1 - z_t^b) \odot h_{t+1}^b + z_t^b \odot \tilde{h}_t^b ztb=σ(Wbxt+Ubht+1+bb)rtb=σ(Wrbxt+Urbht+1+brb)h~tb=tanh(Whbxt+rtbUhbht+1+bhb)htb=(1ztb)ht+1b+ztbh~tb

  • 其中 z t b z^b_t ztb 是后向GRU的更新门, r t b r^b_t rtb 是重置门, h ~ t b \tilde{h}_t^b h~tb 是候选隐藏状态, h t b h_t^b htb 是后向GRU的隐藏状态。

  • 将前向和后向GRU的隐藏状态拼接起来:
    h t = [ h t f ; h t b ] h_t = [h_t^f ; h_t^b] ht=[htf;htb]

  • 最终输出层的公式为:
    y ^ i = ∑ j = 1 k q j h i + b \hat{y}_i = \sum_{j=1}^k q_j h_i + b y^i=j=1kqjhi+b

  • 其中 y ^ i \hat{y}_i y^i 是第 i i i 个时间步的预测值, q j q_j qj 是第 j j j 个分位数的权重, b b b 是偏置。

程序设计

  • 完整程序和数据获取方式:私信博主。
% 加载数据
load example_data.mat

% 分割数据集
train_ratio = 0.7;
validation_ratio = 0.2;
test_ratio = 0.1;
[train_data, validation_data, test_data] = split_data(data, train_ratio, validation_ratio, test_ratio);

% 设置超参数
num_epochs = 100;
batch_size = 32;
learning_rate = 0.001;
num_conv_filters = 32;
conv_filter_size = 3;
pooling_size = 2;
num_hidden_units = 64;
num_quantiles = 3;

% 训练模型
model = train_qrcnn_bigru(train_data, validation_data, num_epochs, batch_size, learning_rate, num_conv_filters, conv_filter_size, pooling_size, num_hidden_units, num_quantiles);

% 测试模型
[test_loss, test_predictions] = test_qrcnn_bigru(model, test_data);

% 可视化结果
plot_results(test_data, test_predictions);
function [train_data, validation_data, test_data] = split_data(data, train_ratio, validation_ratio, test_ratio)
% 分割数据集
total_length = size(data, 1);
train_length = floor(total_length * train_ratio);
validation_length = floor(total_length * validation_ratio);
test_length = total_length - train_length - validation_length;

train_data = data(1:train_length, :);
validation_data = data(train_length+1:train_length+validation_length, :);
test_data = data(train_length+validation_length+1:end, :);
end

function model = train_qrcnn_bigru(train_data, validation_data, num_epochs, batch_size, learning_rate, num_conv_filters, conv_filter_size, pooling_size, num_hidden_units, num_quantiles)
% 训练QRCNN-BiGRU模型
input_size = size(train_data, 2) - 1;

% 构建模型
input_layer = sequenceInputLayer(input_size);
conv_layer = convolution1dLayer(conv_filter_size, num_conv_filters, 'Padding', 'same');
pool_layer = maxPooling1dLayer(pooling_size, 'Stride', 2);
flatten_layer = flattenLayer();
fc_layer = fullyConnectedLayer(num_hidden_units);
gru_layer = bidirectionalgruLayer(num_hidden_units, 'OutputMode', 'last');
output_layer = qrcnnRegressionLayer(num_quantiles);

% 组装网络层
layers = [input_layer;
          conv_layer;
          pool_layer;
          flatten_layer;
          fc_layer;
          gru_layer;
          output_layer];

% 设置训练选项
options = trainingOptions('adam', ...
                          'MaxEpochs', num_epochs, ...
                          'MiniBatchSize', batch_size, ...
                          'InitialLearnRate', learning_rate, ...
                          'ValidationData', validation_data, ...
                          'ValidationFrequency', 10, ...
                          'ValidationPatience', 5, ...
                          'CheckpointPath', tempdir);

% 训练模型
model = trainNetwork(train_data, layers, options);
end

function [test_loss, test_predictions] = test_qrcnn_bigru(model, test_data)
% 测试QRCNN-BiGRU模型
test_sequences = test_data(:, 2:end)';
num_test_samples = size(test_sequences, 2);
test_labels = test_data(:, 1);

% 测试模型
test_predictions = predict(model, test_sequences, 'MiniBatchSize', 1);

% 计算测试集损失
test_loss = qrcnnLoss(test_labels', test_predictions);

% 将预测结果转换为列向量
test_predictions = test_predictions(:);
end

function plot_results(test_data, test_predictions)
% 可视化测试结果
test_labels = test_data(:, 1);
num_test_samples = length(test_labels);

% 绘制真实值和预测值的对比图
figure;
plot(1:num_test_samples, test_labels, 'b-', 1:num_test_samples, test_predictions, 'r-');
xlabel('Time Step');
ylabel('Value');
legend('True', 'Predicted');

% 绘制预测误差的直方图
prediction_errors = test_predictions - test_labels;
figure;
histogram(prediction_errors);
xlabel('Prediction Error');
ylabel('Frequency');
end

参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/127931217
[2] https://blog.csdn.net/kjm13182345320/article/details/127418340

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

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

相关文章

MySQL视图与联集

一、VIEW(视图) 1、 概念 可以被当作是虚拟表或存储查询 视图跟表格的不同是,表格中有实际储存资料,而视图是建立在表格之上的一个架构,它本身并不实际储存资料。 临时表在用户退出或同数据库的连接断开后就自动消…

DIY技巧:微星B760主板13600K降压教程 CPU温度暴降25℃

前段时间微星B600/700系主板更新了最新的BIOS,最新的BIOS更新;额105微码,让用户能直接在BIOS中对13代带K处理器进行降压,十分方便,今就带大家体验一下微星B760迫击炮主板的降压流程,其他微星B600/700系主板…

43岁,年薪200万的高管,被裁了!这4条职场潜规则,你越早知道越好

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 我的一位老朋友S总,是某世界500强外企中国区运营总监,光年薪就200万,还不包括福利、股票的部分,他比我略长一两岁,我们人生经历相似&#xf…

一文搞懂Go错误链

0. Go错误处理简要回顾 Go是一种非常强调错误处理的编程语言。在Go中,错误被表示为实现了error接口的类型的值,error接口只有一个方法: type error interface {Error() string } 这个接口的引入使得Go程序可以以一致和符合惯用法的方式进行错…

Python实现哈里斯鹰优化算法(HHO)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO),该算法有较强的全…

有主题的图文内容创作 | AIGC实践

话说,昨天我发布了第一篇,内容由ChatGPT和Midjourney协助完成的文章:胡同与侏罗纪公园的时空交错 | 胡同幻想 在这篇文章中,大约70%图文内容由ChatGPT和Midjourney输出。我个人参与的部分,主要是提出指令(P…

Monaco Editor编辑器教程(三一):在编辑器中实现模拟调试的交互

前言 最近有小伙伴咨询如何在编辑中实现 像vscode调试代码那样,可以打断点,可以高亮当前运行的一行。这样的需求并不多见,如果要做,那肯定是对编辑器做一个深层次的定制。一般很少很少会实现这种在浏览器中调试。 目前我还没见过,如果有遇到过的朋友可以指点一下。我去学…

Cesium AI GPT 文档 源码 ChatGPT问答

我用Cesium104.0的 源码 | 文档 | 3DTiles标准 作为上下文语料定制了一个智能Cesium专家问答助手 语料: 3D Tiles Specificationhttps://cesium.com/downloads/cesiumjs/releases/1.104/Build/CesiumUnminified/Cesium.jshttps://github1s.com/CesiumGS/cesium/blob/HEAD/Doc…

redis中的管道

Redis 管道 文章目录 1. 前言2. Redis 管道3. 小总结 1. 前言 通过一个问题引出 我们接下来要学习的 Redis 管道 : 提问 : 如何优化频繁命令往返造成的性能瓶颈 ? 另外 : 关于上面这个问题的由来 也可以简单的说一说 上面所说的思路 其实就是管道的概念 &#xff0…

读俞敏洪的书

没有认真写过一篇关于书籍的读后感文章,但在读完俞敏洪老师这本书后,想推荐给大家,也想分享下我的想法。 几周前,我在微信读书首页看到了俞敏洪老师的读书推荐 《在绝望中寻找希望》——俞敏洪写给迷茫不安的年轻人 有好几个晚上&…

电池只能充电500次?别太荒谬!收下这份真正的充电秘籍

我们的生活已经离不开电子设备了,而电子设备嘛,又离不开给它们提供能源的电池。在网上有许许多多的“延长电池寿命小技巧”,比如“新买的电子设备,第一次充电之前要把电都放完”“笔记本电脑一直插着电源可以保护电池”“长期不用…

区分COCO数据集的coco minival和coco test-dev、conda常用命令和python -m 的作用

1、COCO数据集的测试集coco minival和coco test-dev: 两个数据集在官方网站对应的内容如下所示: COCO数据集官网:https://cocodataset.org/#download 两个数据集的区分参考网址:https://zhuanlan.zhihu.com/p/533676547 2、conda常用命令…

linux中epoll+socket实战

目录 参考前言案例 一、epoll的基本使用首先是epoll_create函数:然后是epoll_ctl函数:最后是epoll_wait函数:关于ET(边沿触发)、LT(水平触发)两种工作模式可以得出这样的结论: 二、使用代码简易…

基于html+css的图展示71

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

某音X-Bogus算法研究 2023-05-15

本文以教学为基准,研究JavaScript算法及反爬策略、本文提供的可操作性不得用于任何商业用途和违法违规场景。 如有侵权,请联系我进行删除。 今天我们分析一下douyin个人主页数据获取。 大多数小伙伴应该都知道想要拿到douyin的数据也不是那么容易的&a…

近世代数 笔记与题型连载 第十三章(环与域)

文章目录 基本概念1.环1.1.环的定义1.2.环的性质1.3.几种特殊的环1.4.子环 2.域2.1.域的定义2.2.环与域的同态 相关题型1.验证一个代数系统是否是一个环2.判断一个代数系统是否是整环3.判断一个代数系统是否是另一个代数系统的子环4.判断一个代数系统是否是域 基本概念 1.环 …

sed编辑器命令

sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed 的工作流程主要包括读取…

Nat. Commun | 中国海洋大学张伟鹏组揭示海洋生物被膜群落硫氧化主要菌群及其作用机制...

海洋生物被膜玫瑰杆菌的厌氧硫氧化机制 Anaerobic thiosulfate oxidation by the Roseobacter group is prevalent in marine biofilms Article,2022-04-11,Nature Communications,[IF 17.7] DOI:10.1038/s41467-023-37759-4 原文…

Apache Hive函数高阶应用、性能调优

Hive的函数高阶应用 explode函数 explode属于UDTF函数,表生成函数,输入一行数据输出多行数据。 功能: explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows.--explode接收…

「 操作系统 」CPU缓存一致性协议MESI详解

「 操作系统 」CPU缓存一致性协议MESI详解 参考&鸣谢 缓存一致性协议MESI 小天 CPU缓存一致性协议MESI 枫飘雪落 CPU缓存一致性协议(MESI) 广秀 2.4 CPU 缓存一致性 xiaoLinCoding 文章目录 「 操作系统 」CPU缓存一致性协议MESI详解一、计算机的缓存一致性二、CPU高速缓存…