代码原理
基于CNN-BiLSTM-Attention的数据回归预测模型结合了卷积神经网络(Convolutional Neural Network, CNN)、双向长短时记忆网络(Bidirectional Long Short-Term Memory, BiLSTM)和注意力机制(Attention),用于处理时序数据并进行回归预测。以下是该模型的简单原理及流程:
原理
(1)卷积神经网络(CNN):
CNN用于从时序数据中提取局部特征,例如时间序列中不同时间窗口内的特征。
通过卷积层和池化层,CNN能够捕获数据中的空间局部性,有助于提高特征的层次化表示。
(2)双向长短时记忆网络(BiLSTM):
BiLSTM结合了前向和后向两个方向的信息流,有效地捕捉了时序数据中长期依赖关系。
每个方向的LSTM单元通过门控机制(遗忘门、输入门、输出门)控制信息的流动,适合处理和建模时间序列数据。
(3)注意力机制(Attention):
注意力机制能够根据输入的重要性动态地调整输出的权重,集中注意力于当前任务关键的部分。
在序列预测中,注意力机制可以帮助模型更好地理解和利用序列中各个时间步的信息。
流程
(1)数据预处理:
对时序数据进行预处理,包括清洗、标准化和序列化等步骤。
将预处理后的数据集划分为训练集和测试集。
(2)特征提取(CNN部分):
使用CNN模型对训练集的时序数据进行特征提取。
CNN通过卷积操作和池化操作提取时序数据的空间特征,生成高级抽象的特征表示。
(3)序列建模(BiLSTM部分):
将CNN提取的特征序列作为输入,通过BiLSTM模型进行序列的建模和编码。
BiLSTM模型分别在前向和后向两个方向上处理输入序列,融合两个方向的信息以捕捉时间序列中的长期依赖关系。
(4)注意力机制(Attention):
引入注意力机制,根据BiLSTM的输出计算每个时间步的注意力权重。
将BiLSTM输出与注意力权重进行加权求和,得到序列的注意力加权表示。
(5)回归预测:
将经过注意力加权的序列表示送入全连接层进行回归预测。
输出最终的预测结果,可以是单个时间步的预测值或整个序列的预测结果。
(6)模型评估与优化:
使用测试集评估模型的性能,通常采用均方误差(MSE)、平均绝对误差(MAE)等指标进行评估。
根据评估结果调整模型的超参数或结构,优化模型的预测能力和泛化能力。
(7)模型部署与应用:
将训练好的模型应用于实际的数据回归预测任务中,提供准确的预测结果。
持续监控模型的性能,并根据实际需求进行模型的更新和优化。
基于CNN-BiLSTM-Attention的数据回归预测模型结合了CNN提取空间特征、BiLSTM处理时序依赖关系和Attention机制关注重要部分的优势。该模型能够有效处理复杂的时序数据,并提供精确的回归预测结果,在许多应用场景中具有良好的性能和泛化能力。
部分代码
%% 清空环境变量
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:size(P_train,2)
trainD{i,:} = (reshape(p_train(:,i),size(p_train,1),1,1));
end
for i = 1:size(p_test,2)
testD{i,:} = (reshape(p_test(:,i),size(p_test,1),1,1));
end
targetD = t_train;
targetD_test = t_test;
numFeatures = size(p_train,1);
layers0 = [ ...
% 输入特征
sequenceInputLayer([numFeatures,1,1],'name','input') %输入层设置
sequenceFoldingLayer('name','fold') %使用序列折叠层对图像序列的时间步长进行独立的卷积运算。
% CNN特征提取
convolution2dLayer([3,1],16,'Stride',[1,1],'name','conv1') %添加卷积层,64,1表示过滤器大小,10过滤器个数,Stride是垂直和水平过滤的步长
batchNormalizationLayer('name','batchnorm1') % BN层,用于加速训练过程,防止梯度消失或梯度爆炸
reluLayer('name','relu1') % ReLU激活层,用于保持输出的非线性性及修正梯度的问题
% 池化层
maxPooling2dLayer([2,1],'Stride',2,'Padding','same','name','maxpool') % 第一层池化层,包括3x3大小的池化窗口,步长为1,same填充方式
% 展开层
sequenceUnfoldingLayer('name','unfold') %独立的卷积运行结束后,要将序列恢复
%平滑层
flattenLayer('name','flatten')
bilstmLayer(25,'Outputmode','last','name','hidden1')
selfAttentionLayer(1,2) %创建一个单头,2个键和查询通道的自注意力层
dropoutLayer(0.1,'name','dropout_1') % Dropout层,以概率为0.2丢弃输入
fullyConnectedLayer(1,'name','fullconnect') % 全连接层设置(影响输出维度)(cell层出来的输出层) %
regressionLayer('Name','output') ];
lgraph0 = layerGraph(layers0);
lgraph0 = connectLayers(lgraph0,'fold/miniBatchSize','unfold/miniBatchSize');