时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测
目录
预测效果
基本介绍
1.Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测(完整源码和数据),单变量时间序列预测,运行环境matlab2023及以上,excel数据,方便替换;
2.评价指标RMSE、MAPE、MAE、MSE、R2等;
3.程序语言为matlab,程序可出预测效果图,误差分析图。
4.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。
BiTCN-GRU是一种结合了双向时间卷积神经网络(BiTCN)和门控循环单元(GRU)的模型,用于时间序列预测。
双向时间卷积神经网络(BiTCN)是一种基于卷积神经网络(CNN)的模型,具有双向信息传递的能力。它通过使用一维卷积层来捕捉时间序列中的局部和全局特征,并在模型中引入双向连接,以同时考虑过去和未来的上下文信息。
门控循环单元(GRU)是一种循环神经网络(RNN)的变种,具有门控机制来控制信息的流动。GRU通过使用更新门和重置门来决定如何更新和传递隐藏状态,从而有效地捕捉时间序列中的长期依赖关系。
结合BiTCN和GRU,可以构建一个双向的时间序列模型。首先,BiTCN用于提取时间序列数据的局部和全局特征,捕捉序列中的空间相关性。然后,GRU作为时间维度的处理单元,利用其门控机制来捕捉序列中的时间相关性。
整个模型的工作流程如下:
输入时间序列数据经过一维卷积层,使用BiTCN提取局部和全局特征。
BiTCN的输出作为GRU的输入,用于建立时间维度上的循环依赖关系。
GRU模型通过门控机制来更新和传递隐藏状态,从而在时间维度上捕捉长期依赖关系。
最后,可以根据具体的预测任务选择适当的输出层,例如全连接层进行回归或分类。
BiTCN-GRU模型的优势在于它能够同时考虑时间序列数据的空间和时间相关性,从而更好地捕捉序列中的动态模式和长期依赖关系。这种结合的方式可以提高时间序列预测的准确性和泛化能力,适用于各种时间序列预测任务。
程序设计
- 完整源码和数据获取方式资源出下载Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 。
clike
% 添加残差块到网络
lgraph = addLayers(lgraph, layers);
% 连接卷积层到残差块
lgraph = connectLayers(lgraph, outputName, "conv1_" + i);
% 创建 TCN反向支路flip网络结构
Fliplayers = [
FlipLayer("flip_" + i) % 反向翻转
convolution1dLayer(1, numFilters, Name = "convSkip_"+i); % 反向残差连接
convolution1dLayer(filterSize, numFilters, DilationFactor = dilationFactor, Padding = "causal", Name="conv2_" + i) % 一维卷积层
layerNormalizationLayer % 层归一化
spatialDropoutLayer(dropoutFactor) % 空间丢弃层
convolution1dLayer(filterSize, numFilters, DilationFactor = dilationFactor, Padding = "causal") % 一维卷积层
layerNormalizationLayer % 层归一化
reluLayer % 激活层
spatialDropoutLayer(dropoutFactor, Name="drop" + i) % 空间丢弃层
];
% 添加 flip 网络结构到网络
lgraph = addLayers(lgraph, Fliplayers);
% 连接 flip 卷积层到残差块
lgraph = connectLayers(lgraph, outputName, "flip_" + i);
lgraph = connectLayers(lgraph, "drop" + i, "add_" + i + "/in3");
lgraph = connectLayers(lgraph, "convSkip_"+i, "add_" + i + "/in4");
% 残差连接 -- 首层
if i == 1
% 建立残差卷积层
% Include convolution in first skip connection.
layer = convolution1dLayer(1,numFilters,Name="convSkip");
lgraph = addLayers(lgraph,layer);
lgraph = connectLayers(lgraph,outputName,"convSkip");
lgraph = connectLayers(lgraph,"convSkip","add_" + i + "/in2");
else
lgraph = connectLayers(lgraph,outputName,"add_" + i + "/in2");
end
% Update layer output name.
outputName = "add_" + i;
end
% CSDN 机器学习之心
参考资料
[1] https://blog.csdn.net/kjm13182345320/article/details/128577926?spm=1001.2014.3001.5501
[2] https://blog.csdn.net/kjm13182345320/article/details/128573597?spm=1001.2014.3001.5501