代码原理
基于TCN-BiGRU-Attention的数据回归预测模型结合了时间卷积神经网络(Temporal Convolutional Network, TCN)、双向门控循环单元(Bidirectional Gated Recurrent Unit, BiGRU)和注意力机制(Attention),用于处理时序数据并进行回归预测。以下是该模型的简单原理及流程:
原理
(1)时间卷积神经网络(TCN):
TCN是专门用于处理时序数据的深度学习模型,通过堆叠的卷积层捕获不同时间尺度的特征。
TCN利用残差连接来减轻梯度消失问题,有助于模型学习长期依赖关系。
(2)双向门控循环单元(BiGRU):
BiGRU结合了前向和后向两个方向的信息流,通过门控机制调控信息的流动。
在序列数据中,BiGRU能有效地捕捉上下文信息和序列中的长期依赖关系。
(3)注意力机制(Attention):
注意力机制允许模型动态地关注序列中不同部分的重要性,根据输入的重要性调整输出的权重。
在时序数据的处理中,注意力机制有助于集中模型的注意力于对预测任务更加关键的时间步或特征。
流程
(1)数据预处理:
对时序数据进行预处理,包括清洗、标准化和序列化等步骤。
将预处理后的数据集划分为训练集和测试集。
(2)特征提取(TCN部分):
使用TCN模型对训练集中的时序数据进行特征提取。
TCN通过卷积操作捕获不同时间尺度的特征,并利用残差连接传递重要信息,生成高级抽象的特征表示。
(3)序列建模(BiGRU部分):
将TCN提取的特征序列作为BiGRU模型的输入,进行序列建模和编码。
BiGRU模型在前向和后向两个方向上处理输入序列,有效地捕捉序列中的上下文信息和长期依赖关系。
(4)注意力机制(Attention):
引入注意力机制,根据BiGRU的输出计算每个时间步的注意力权重。
将BiGRU的输出与注意力权重加权求和,得到加权后的序列表示。
(5)回归预测:
将经过注意力加权的序列表示送入全连接层进行回归预测。
输出最终的预测结果,可以是单个时间步的预测值或整个序列的预测结果。
(6)模型评估与优化:
使用测试集评估模型的性能,通常采用均方误差(MSE)、平均绝对误差(MAE)等指标进行评估。
根据评估结果调整模型的超参数或结构,优化模型的预测能力和泛化能力。
(7)模型部署与应用:
将训练好的TCN-BiGRU-Attention模型应用于实际的数据回归预测任务中。
持续监控模型的性能,并根据实际需求进行模型的更新和优化。
总结
基于TCN-BiGRU-Attention的数据回归预测模型结合了TCN在时序特征提取、BiGRU在序列建模和注意力机制在特征加权方面的优势。该模型能够有效处理复杂的时序数据,并提供准确的回归预测结果,在多种时序数据分析任务中展现出良好的性能和泛化能力。
部分代码
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc
%% 导入数据
data = readmatrix('../day.csv');
data = data(:,3:16);
res=data(randperm(size(data,1)),:); %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
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);
end
for 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;
end
tempLayers = 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");