时间序列预测在许多领域都非常重要,如天气预测、股票价格预测等。本篇博客将介绍如何使用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!');
代码功能概述
本代码旨在实现以下功能:
- 数据加载和预处理:从Excel文件读取时间序列数据,并进行归一化。
- 训练/测试集划分:将时间序列分为训练集和测试集,用于模型的训练和验证。
- LSTM网络搭建与训练:使用LSTM网络捕获时间序列中的长期依赖关系,并进行预测。
- 模型评估与可视化:通过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层数或隐藏单元数,优化网络结构。
希望这篇博客能为您的时间序列预测任务提供有效参考!