基于卷积神经网络-长短期记忆网络的多变量时间序列预测 MATLAB2019A及以上 直接替换数据就可以 多对一

在时间序列预测领域,卷积神经网络(CNN)和长短期记忆网络(LSTM)的结合展现出了强大的性能。今天,咱们就来聊聊如何基于MATLAB 2019A及以上版本,实现基于CNN - LSTM的多变量时间序列预测,而且还是“多对一”的模式哦,操作简单,直接替换数据就行。

数据准备

首先,咱们得有数据。假设我们的数据存放在一个.csv文件里,里面有多列数据,每一列代表一个变量。在MATLAB里读取数据很方便:

data = readtable('your_data.csv');

这里readtable函数用于读取表格数据,'your_data.csv'就是你存放数据的文件名,根据实际情况替换就行。

划分数据集

接下来要把数据划分成训练集、验证集和测试集。这一步很关键,它能让模型更好地学习和评估。

numObservations = height(data);
numTrain = floor(0.7 * numObservations);
numValidation = floor(0.15 * numObservations);
numTest = numObservations - numTrain - numValidation;

idx = (1:numObservations)';
cv = cvpartition(idx, 'Holdout', numTest + numValidation);
idxTrain = training(cv, 1);
idxTestAndValidation = test(cv, 1);

cv2 = cvpartition(idxTestAndValidation, 'Holdout', numTest);
idxValidation = training(cv2, 1);
idxTest = test(cv2, 1);

trainData = data(idxTrain, :);
validationData = data(idxValidation, :);
testData = data(idxTest, :);

上面这段代码先计算了总的观测数,然后按照70% 、15% 、15% 的比例划分训练集、验证集和测试集。cvpartition函数是MATLAB里用于划分数据集的利器,通过不同的参数设置实现不同的划分方式。

构建CNN - LSTM模型

CNN部分

CNN擅长捕捉数据中的局部特征。在MATLAB里构建CNN层可以像下面这样:

layers = [
    sequenceInputLayer(inputSize)
    convolution1dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer
    maxPooling1dLayer(2)
];

这里sequenceInputLayer是序列输入层,inputSize是输入数据的维度,要根据实际数据调整。convolution1dLayer是1维卷积层,3是卷积核大小,16是输出通道数,'Padding','same'保证卷积后数据尺寸不变。batchNormalizationLayer用于归一化,加速模型收敛,reluLayer是激活函数层,maxPooling1dLayer进行池化操作,减少数据维度。

LSTM部分

LSTM则对处理时间序列中的长期依赖关系很在行。接着上面的CNN层继续构建:

layers = [
    layers
    lstmLayer(32)
    fullyConnectedLayer(outputSize)
    regressionLayer
];

lstmLayer(32)表示LSTM层有32个隐藏单元,fullyConnectedLayer(outputSize)是全连接层,outputSize是输出维度,在“多对一”预测里通常是1 ,regressionLayer是回归层,因为我们做的是预测数值的回归任务。

模型训练与预测

训练

options = trainingOptions('adam',...
    'MaxEpochs',100,...
    'InitialLearnRate',0.001,...
    'ValidationData',{valFeatures,valLabels},...
    'ValidationFrequency',10,...
    'Verbose',false,...
    'Plots','training-progress');

net = trainNetwork(trainFeatures,trainLabels,layers,options);

这里使用adam优化器,设置了最大训练轮数MaxEpochs为100 ,初始学习率InitialLearnRate为0.001 ,并指定了验证数据和验证频率。trainNetwork函数用于训练模型。

预测

predictedLabels = predict(net,testFeatures);

训练好模型后,就可以用predict函数对测试数据进行预测啦。

基于MATLAB实现基于CNN - LSTM的多变量时间序列预测,只要按照上面的数据处理、模型构建、训练和预测步骤,再结合自己的数据,就能轻松搞定。是不是感觉还挺有趣的呢,赶紧动手试试吧!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐