基于TCN-BiGRU-Attention的数据时序预测

文摘   2024-08-01 08:30   湖南  

代码原理

TCN-BiGRU-Attention 是一种结合了时序卷积网络(Temporal Convolutional Network, TCN)、双向门控循环单元(Bidirectional Gated Recurrent Unit, BiGRU)和注意力机制(Attention Mechanism)的数据时序预测模型。以下是这种模型的简单原理及流程:

1. TCN(时序卷积网络)

TCN 是一种改进的卷积神经网络,用于处理序列数据。其主要特点包括:

  • 因果卷积:确保输出的时刻 t 只依赖于当前及之前的输入,不依赖未来的输入。

  • 扩展卷积(Dilated Convolution):通过在卷积核之间引入间隔来扩大感受野,使网络能够捕捉更长的依赖关系。

  • 残差连接:通过残差连接来防止深层网络的梯度消失问题,提升训练效果。

2. BiGRU(双向门控循环单元)

BiGRU 是一种改进的 RNN 单元,结合了前向和后向两个 GRU 单元,能够更好地捕捉序列中的前后文信息。其主要特点包括:

  • 双向结构:通过同时考虑正向和反向的时间序列,获取更丰富的上下文信息。

  • 门控机制:通过重置门和更新门来控制信息流,缓解梯度消失问题,提高捕捉长时依赖的能力。

3. 注意力机制(Attention Mechanism)

注意力机制能够动态地为输入序列中的每个位置分配不同的权重,从而突出对预测结果最重要的部分。其主要特点包括:

  • 权重分配:通过计算输入序列与当前状态的相关性,为每个时间步分配不同的权重。

  • 上下文向量:根据分配的权重,对输入序列进行加权求和,生成一个上下文向量用于预测。

流程

  1. 输入预处理:将原始时间序列数据进行标准化或归一化处理,并划分训练集、验证集和测试集。

  2. TCN 层处理:通过 TCN 层对输入序列进行卷积操作,提取序列中的特征和模式。

  3. BiGRU 层处理:将 TCN 的输出序列输入到 BiGRU 层,捕捉序列中的双向上下文信息。

  4. 注意力机制:应用注意力机制对 BiGRU 的输出进行加权求和,生成上下文向量。

  5. 预测输出:将上下文向量输入到全连接层或其他预测层,生成最终的预测结果。

  6. 模型训练与评估:使用训练集对模型进行训练,通过验证集调参,并使用测试集评估模型性能。

总结

  • TCN-BiGRU-Attention 模型通过结合 TCN 提取特征、BiGRU 捕捉双向依赖和注意力机制强调重要信息的优势,有效地提升了时间序列预测的精度和鲁棒性。

部分代码

%%  清空环境变量warning off             % 关闭报警信息close all               % 关闭开启的图窗clear                   % 清空变量clc  %% 导入数据data =  readmatrix('风电场预测.xlsx');data = data(5665:8640,12);  %选取3月份数据[h1,l1]=data_process(data,24);   %步长为24,采用前24个时刻的温度预测第25个时刻的温度res = [h1,l1];num_samples = size(res,1);   %样本个数% 训练集和测试集划分outdim = 1;                                  % 最后一列为输出num_size = 0.7;                              % 训练集占数据集比例num_train_s = round(num_size * num_samples); % 训练集样本个数f_ = size(res, 2) - outdim;                  % 输入特征维度P_train = res(1: num_train_s, 1: f_)';T_train = res(1: num_train_s, f_ + 1: end)';M = size(P_train, 2);P_test = res(num_train_s + 1: end, 1: f_)';T_test = res(num_train_s + 1: end, f_ + 1: end)';N = size(P_test, 2);%  数据归一化[p_train, ps_input] = mapminmax(P_train, 0, 1);p_test = mapminmax('apply', P_test, ps_input);[t_train, ps_output] = mapminmax(T_train, 0, 1);t_test = mapminmax('apply', T_test, ps_output);%  格式转换for i = 1 : M     vp_train{i, 1} = p_train(:, i);    vt_train{i, 1} = t_train(:, i);endfor i = 1 : N     vp_test{i, 1} = p_test(:, i);    vt_test{i, 1} = t_test(:, i);end%% 优化算法优化前,构建优化前的TCN_BiGRU_Attention模型outputSize = 1;  %数据输出y的维度  numFilters = 64;filterSize = 5;dropoutFactor = 0.005;numBlocks = 2;layer = sequenceInputLayer(f_,Normalization="rescale-symmetric",Name="input");lgraph = layerGraph(layer);outputName = layer.Name;for i = 1:numBlocks    dilationFactor = 2^(i-1);        layers = [        convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal",Name="conv1_"+i)        layerNormalizationLayer        dropoutLayer(dropoutFactor)         % spatialDropoutLayer(dropoutFactor)        convolution1dLayer(filterSize,numFilters,DilationFactor=dilationFactor,Padding="causal")        layerNormalizationLayer        reluLayer        dropoutLayer(dropoutFactor)         additionLayer(2,Name="add_"+i)];    % Add and connect layers.    lgraph = addLayers(lgraph,layers);    lgraph = connectLayers(lgraph,outputName,"conv1_"+i);    % Skip connection.    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;endtempLayers = flattenLayer("Name","flatten");lgraph = addLayers(lgraph,tempLayers);tempLayers = gruLayer(35,"Name","gru1");lgraph = addLayers(lgraph,tempLayers);tempLayers = [    FlipLayer("flip3")    gruLayer(35,"Name","gru2")];lgraph = addLayers(lgraph,tempLayers);tempLayers = [    concatenationLayer(1,2,"Name","concat")    selfAttentionLayer(1,50,"Name","selfattention")   %单头注意力Attention机制,把1改为2,3,4……即为多头,后面的50是键值    fullyConnectedLayer(outdim,"Name","fc")    regressionLayer("Name","regressionoutput")];lgraph = addLayers(lgraph,tempLayers);lgraph = connectLayers(lgraph,outputName,"flatten");lgraph = connectLayers(lgraph,"flatten","gru1");lgraph = connectLayers(lgraph,"flatten","flip3");lgraph = connectLayers(lgraph,"gru1","concat/in1");lgraph = connectLayers(lgraph,"gru2","concat/in2");%  参数设置options0 = trainingOptions('adam', ...                 % 优化算法Adam    'MaxEpochs', 150, ...                            % 最大训练次数    'GradientThreshold', 1, ...                       % 梯度阈值    'InitialLearnRate', 0.01, ...         % 初始学习率    'LearnRateSchedule', 'piecewise', ...             % 学习率调整    'LearnRateDropPeriod',100, ...                   % 训练100次后开始调整学习率    'LearnRateDropFactor',0.001, ...                    % 学习率调整因子    'L2Regularization', 0.001, ...         % 正则化参数    'ExecutionEnvironment', 'cpu',...                 % 训练环境    'Verbose', 1, ...                                 % 关闭优化过程    'Plots', 'none');                    % 画出曲线% 网络训练ticnet0 = trainNetwork(vp_train,vt_train,lgraph,options0);tocanalyzeNetwork(net0);% 查看网络结构%  预测t_sim1 = predict(net0, vp_train); t_sim2 = predict(net0, vp_test); %  数据反归一化T_sim1 = mapminmax('reverse', t_sim1, ps_output);T_sim2 = mapminmax('reverse', t_sim2, ps_output);T_train1 = T_train;T_test2 = T_test;

代码效果图







下载链接:https://mbd.pub/o/bread/ZpiZlZxy
或点击阅读原文

MATLAB科研小白
信号处理方向在校博士研究生,目前专研于MATLAB算法及科学绘图等,熟知各种信号分解算法、神经网络时序预测算法、数据拟合算法以及滤波算法。提供一个可以相互学习相互进步的平台
 最新文章