使用LSTM网络实现单列时间序列预测

时间序列预测在许多领域都非常重要,如天气预测、股票价格预测等。本篇博客将介绍如何使用MATLAB中的长短期记忆(LSTM)网络,针对单列时间序列数据进行预测。

完整代码:

clc; clear; close all;

% Load and preprocess data from Excel
[file, path] = uigetfile('*.xlsx', 'Select the Excel file');
filename = fullfile(path, file);
time_series = xlsread(filename);

% Normalize data
min_val = min(time_series);
max_val = max(time_series);
normalized_data = (time_series - min_val) / (max_val - min_val);

% Training/Test split
train_ratio = 0.8;
n = length(normalized_data);
M = floor(n * train_ratio);
train_data = normalized_data(1:M);
test_data = normalized_data(M+1:end);

% Prepare data for LSTM
P_train = train_data(1:end-1)';
T_train = train_data(2:end)';
P_test = test_data(1:end-1)';
T_test = test_data(2:end)';

% Convert data to cell arrays for LSTM input
XTrain = num2cell(P_train);
YTrain = num2cell(T_train);
XTest = num2cell(P_test);
YTest = num2cell(T_test);

% Define LSTM network architecture
inputSize = 1; % Single-column input
numHiddenUnits = 50; % Number of LSTM hidden units
outputSize = 1; % Single output
layers = [
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits, 'OutputMode', 'sequence')
    fullyConnectedLayer(outputSize)
    regressionLayer
];

% Training options
options = trainingOptions('adam', ...
    'MaxEpochs', 100, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 0.01, ...
    'GradientThreshold', 1, ...
    'Plots', 'training-progress', ...
    'Verbose', false);

% Train LSTM network
net = trainNetwork(XTrain, YTrain, layers, options);

% Prediction
YPredTrain = predict(net, XTrain);
YPredTest = predict(net, XTest);

% Denormalize predictions
YPredTrain = cell2mat(YPredTrain) * (max_val - min_val) + min_val;
YPredTest = cell2mat(YPredTest) * (max_val - min_val) + min_val;
T_train = T_train * (max_val - min_val) + min_val;
T_test = T_test * (max_val - min_val) + min_val;

% Compute metrics
R1 = 1 - norm(T_train - YPredTrain')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - YPredTest')^2 / norm(T_test - mean(T_test))^2;
disp(['Training Set R2: ', num2str(R1)]);
disp(['Test Set R2: ', num2str(R2)]);

MAE_train = mean(abs(YPredTrain' - T_train));
MAE_test = mean(abs(YPredTest' - T_test));
disp(['Training Set MAE: ', num2str(MAE_train)]);
disp(['Test Set MAE: ', num2str(MAE_test)]);

% Visualize results
% Ensure the dimensions match
T_train = T_train(:);        % Convert to column vector
YPredTrain = YPredTrain(:);  % Convert to column vector
T_test = T_test(:);          % Convert to column vector
YPredTest = YPredTest(:);    % Convert to column vector

% Training Set Prediction Plot
figure;
plot(1:length(T_train), T_train, '-', 'LineWidth', 2, 'Color', [0 0 1]); % True values (blue line)
hold on;
plot(1:length(T_train), YPredTrain, '--', 'LineWidth', 2, 'Color', [1 0 0]); % Predicted values (red dashed line)
legend('True', 'Predicted', 'Location', 'best');
xlabel('Samples');
ylabel('Values');
title('Training Set Prediction');
grid on;

% Test Set Prediction Plot
figure;
plot(1:length(T_test), T_test, '-', 'LineWidth', 2, 'Color', [0 0 1]); % True values (blue line)
hold on;
plot(1:length(T_test), YPredTest, '--', 'LineWidth', 2, 'Color', [1 0 0]); % Predicted values (red dashed line)
legend('True', 'Predicted', 'Location', 'best');
xlabel('Samples');
ylabel('Values');
title('Test Set Prediction');
grid on;


disp('LSTM Model training and evaluation completed!');
代码功能概述

本代码旨在实现以下功能:

  1. 数据加载和预处理:从Excel文件读取时间序列数据,并进行归一化。
  2. 训练/测试集划分:将时间序列分为训练集和测试集,用于模型的训练和验证。
  3. LSTM网络搭建与训练:使用LSTM网络捕获时间序列中的长期依赖关系,并进行预测。
  4. 模型评估与可视化:通过R²、MAE等指标评估模型表现,并绘制预测结果图。
代码实现步骤
1. 数据加载与归一化

首先从Excel文件中加载时间序列数据,为了提升模型性能,数据被归一化到[0,1]范围:

[file, path] = uigetfile('*.xlsx', 'Select the Excel file');
filename = fullfile(path, file);
time_series = xlsread(filename);

% Normalize data
min_val = min(time_series);
max_val = max(time_series);
normalized_data = (time_series - min_val) / (max_val - min_val);
2. 训练/测试集划分

通过设定比例,将数据分为训练集和测试集,同时生成特征-目标对:

train_ratio = 0.8;
n = length(normalized_data);
M = floor(n * train_ratio);
train_data = normalized_data(1:M);
test_data = normalized_data(M+1:end);

% Prepare data for LSTM
P_train = train_data(1:end-1)';
T_train = train_data(2:end)';
P_test = test_data(1:end-1)';
T_test = test_data(2:end)';
3. 搭建LSTM网络

LSTM网络的架构包括输入层、LSTM层、全连接层和回归层:

inputSize = 1;
numHiddenUnits = 50;
outputSize = 1;
layers = [
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits, 'OutputMode', 'sequence')
    fullyConnectedLayer(outputSize)
    regressionLayer
];

 训练时采用 adam 优化算法,并设置学习率和最大迭代次数:

options = trainingOptions('adam', ...
    'MaxEpochs', 200, ...
    'MiniBatchSize', 1, ...
    'InitialLearnRate', 0.01, ...
    'GradientThreshold', 1, ...
    'Plots', 'training-progress', ...
    'Verbose', false);

net = trainNetwork(XTrain, YTrain, layers, options);
4. 模型预测与评估

通过训练好的模型进行预测,并计算模型性能指标,如R²、MAE等:

YPredTrain = predict(net, XTrain);
YPredTest = predict(net, XTest);

% Denormalize predictions
YPredTrain = cell2mat(YPredTrain) * (max_val - min_val) + min_val;
YPredTest = cell2mat(YPredTest) * (max_val - min_val) + min_val;

% Compute R²
R1 = 1 - norm(T_train - YPredTrain')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - YPredTest')^2 / norm(T_test - mean(T_test))^2;

5. 可视化预测结果

训练集和测试集的预测结果通过图表清晰呈现:

% Training Set Prediction Plot
figure;
plot(1:length(T_train), T_train, '-', 'LineWidth', 2, 'Color', [0 0 1]);
hold on;
plot(1:length(T_train), YPredTrain, '--', 'LineWidth', 2, 'Color', [1 0 0]);
legend('True', 'Predicted', 'Location', 'best');
xlabel('Samples');
ylabel('Values');
title('Training Set Prediction');
grid on;

结论

本代码使用LSTM网络成功实现了时间序列预测任务,相比传统的BP神经网络,LSTM能够更好地捕获时间序列中的长期依赖关系,从而提升预测精度。

改进建议

  • 使用滑动窗口方法构造多步输入,进一步提高模型表现。
  • 尝试调整LSTM层数或隐藏单元数,优化网络结构。

希望这篇博客能为您的时间序列预测任务提供有效参考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值