代码原理
基于TCN-RVM的数据回归预测简单原理及流程如下:
原理
TCN-RVM模型结合了时间卷积神经网络(Temporal Convolutional Network, TCN)和相关向量机(Relevance Vector Machine, RVM)的优点,用于进行高效、准确的数据回归预测。
(1)时间卷积神经网络(TCN):
TCN是一种深度学习模型,专门用于时序数据的建模。
它利用多个卷积层来捕获时序数据中的局部特征,并通过残差连接来解决梯度消失问题,从而学习长程依赖关系。
(2)相关向量机(RVM):
RVM是一种基于贝叶斯框架的稀疏核方法,它通过选择一小部分相关向量来近似原始数据。
RVM具有稀疏性和高效性,能够快速进行回归预测,并具有良好的泛化能力。
流程
(1)数据预处理:
对原始时序数据进行清洗和标准化处理。
将处理后的数据划分为训练集和测试集。
(2)特征提取(TCN部分):
利用TCN模型对训练集进行特征提取。
TCN通过卷积层提取时序数据中的局部特征,并通过残差连接保持信息的流通。
(3)回归预测(RVM部分):
将TCN提取的特征作为输入,训练RVM回归预测器。
RVM通过选择相关向量和对应的权重,以最小的误差拟合训练数据。
(4)模型训练与优化:
通过端到端的训练方式,结合TCN和RVM,使得模型能够从多输入时序数据中学习相关特征并进行准确的回归预测。
根据预测误差进行模型优化,如调整TCN的卷积层数和核大小,以及RVM的相关向量选择等。
(5)预测与评估:
使用训练好的TCN-RVM模型对测试集进行回归预测。
评估模型的预测性能,常用的评价指标包括均方误差(MSE)、平均绝对误差(MAE)等。
(6)模型应用与部署:
将训练好的模型应用于实际场景中,进行时序数据的回归预测。
根据实际需求,定期对模型进行更新和优化,以适应数据的变化。
总结
TCN-RVM模型结合了TCN强大的时序建模能力和RVM的稀疏性、高效性优点,通过端到端的训练方式实现多输入时序数据的回归预测。该模型在处理复杂非线性时序数据时具有显著的优势,能够提供准确、高效的预测结果。
部分代码
clc;
clear
close all
addpath(genpath(pwd))
%% TCN回归
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
%% 优化算法优化前,构建优化前的TCN模型
outputSize = 1; %数据输出y的维度
numFilters = 16;
filterSize = 3;
dropoutFactor = 0.1;
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
layers = [
fullyConnectedLayer(outputSize,Name="fc")
tanhLayer('name','softmax')
regressionLayer('name','output')];
lgraph = addLayers(lgraph,layers);
lgraph = connectLayers(lgraph,outputName,"fc");
% 参数设置
options0 = trainingOptions('adam', ... % 优化算法Adam
'MaxEpochs', 30, ... % 最大训练次数
'GradientThreshold', 1, ... % 梯度阈值
'InitialLearnRate', 0.01, ... % 初始学习率
'LearnRateSchedule', 'piecewise', ... % 学习率调整
'LearnRateDropPeriod',100, ... % 训练100次后开始调整学习率
'LearnRateDropFactor',0.001, ... % 学习率调整因子
'L2Regularization', 0.001, ... % 正则化参数
'ExecutionEnvironment', 'cpu',... % 训练环境
'Verbose', 1, ... % 关闭优化过程
'Plots', 'none'); % 画出曲线