代码原理
基于CNN-BiGRU-Attention的数据回归预测模型结合了卷积神经网络(Convolutional Neural Network, CNN)、双向门控循环单元(Bidirectional Gated Recurrent Unit, BiGRU)和注意力机制(Attention),用于处理时序数据并进行回归预测。以下是该模型的简单原理及流程:
原理
(1)卷积神经网络(CNN):
CNN主要用于提取时序数据中的空间特征,能够捕获局部信息并实现特征的空间层次化组合。
在时序数据处理中,CNN可以用于捕获一维数据序列中不同位置的特征。
(2)双向门控循环单元(BiGRU):
BiGRU结合了前向和后向的信息流,利用门控机制控制信息的传递,适合捕捉序列数据中的长期依赖关系。
BiGRU能够更好地理解序列中的语境和顺序信息。
(3)注意力机制(Attention):
注意力机制能够赋予模型对不同部分输入的关注程度,并根据输入的重要性调整输出的权重。
在处理序列数据时,注意力机制可以帮助模型集中精力关注于对当前任务更加重要的部分。
流程
(1)数据预处理:
对时序数据进行预处理,包括清洗、标准化和序列化等处理。
将处理后的数据集划分为训练集和测试集。
(2)特征提取(CNN部分):
使用CNN模型对训练集的时序数据进行特征提取。
CNN通过卷积层和池化层提取时序序列的空间特征,生成高阶特征表示。
(3)序列建模与编码(BiGRU部分):
将CNN提取的特征序列作为输入,通过BiGRU模型进行序列的双向建模。
BiGRU模型在前向和后向两个方向上处理输入序列,并融合前后向的信息来构建更全面的序列表示。
(4)注意力机制(Attention):
引入注意力机制,根据BiGRU的输出计算每个时间步的注意力权重。
将BiGRU输出与注意力权重进行加权求和,以获得最终的序列表示。
(5)回归预测:
将经过注意力加权的序列表示送入全连接层进行回归预测。
输出最终的预测结果,可以是单个时间步的预测值或整个序列的预测结果。
(6)模型评估与优化:
使用测试集评估模型的性能,调整超参数或模型结构,优化回归预测性能。
(7)模型部署与应用:
将训练好的模型应用于实际的数据回归预测任务中,能够提供准确的预测结果。
持续监控模型的性能,并根据需求进行模型的更新和优化。
总结
基于CNN-BiGRU-Attention的数据回归预测模型结合了CNN提取空间特征、BiGRU建模序列信息以及注意力机制关注重点部分的优势,适合处理复杂的时序数据并进行准确的回归预测。该模型在许多时序数据分析任务中表现出良好的性能和泛化能力。
部分代码
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc
%% 导入数据
data = readmatrix('回归数据集.xlsx');
data = data(:,1:14);
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
numFeatures = size(p_train,1);
%% 网络搭建CNN-BiGRU-ATTENTION
lgraph = layerGraph();
% 添加层分支
% 将网络分支添加到层次图中。每个分支均为一个线性层组。
tempLayers = sequenceInputLayer([numFeatures,1,1],"Name","sequence");
lgraph = addLayers(lgraph,tempLayers);
tempLayers = [
convolution2dLayer([3,1],16,"Name","conv","Padding","same")
batchNormalizationLayer("Name","batchnorm")
reluLayer("Name","relu")
maxPooling2dLayer([3 3],"Name","maxpool","Padding","same")
flattenLayer("Name","flatten_1")
fullyConnectedLayer(25,"Name","fc_1")];
lgraph = addLayers(lgraph,tempLayers);
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,3,"Name","concat")
selfAttentionLayer(1,50,"Name","selfattention") %Attention机制
fullyConnectedLayer(outdim,"Name","fc")
regressionLayer("Name","regressionoutput")];
lgraph = addLayers(lgraph,tempLayers);