使用BP神经网络进行单列时间序列预测
在数据科学和人工智能领域,时间序列预测是一个关键问题。这篇博客将介绍如何使用MATLAB和BP(反向传播)神经网络预测单列时间序列。
完整代码
% BP Neural Network for Single-Column Time Series Prediction
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 BP network
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)';
% Create and train BP neural network
net = feedforwardnet(10, 'trainlm'); % 10 hidden neurons
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-5;
% Train the network
net = train(net, P_train, T_train);
% Prediction
T_sim1 = net(P_train); % Training set prediction
T_sim2 = net(P_test); % Test set prediction
% Denormalize predictions
T_sim1 = T_sim1 * (max_val - min_val) + min_val;
T_sim2 = T_sim2 * (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
% R-squared (R2)
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test))^2;
disp(['Training Set R2: ', num2str(R1)]);
disp(['Test Set R2: ', num2str(R2)]);
% Mean Absolute Error (MAE)
M = length(T_train);
N = length(T_test);
mae1 = sum(abs(T_sim1' - T_train)) / M;
mae2 = sum(abs(T_sim2' - T_test)) / N;
disp(['Training Set MAE: ', num2str(mae1)]);
disp(['Test Set MAE: ', num2str(mae2)]);
% Mean Absolute Percentage Error (MAPE)
MAPE1 = mean(abs((T_train - T_sim1') ./ T_train));
MAPE2 = mean(abs((T_test - T_sim2') ./ T_test));
disp(['Training Set MAPE: ', num2str(MAPE1)]);
disp(['Test Set MAPE: ', num2str(MAPE2)]);
% Mean Bias Error (MBE)
mbe1 = sum(T_sim1' - T_train) / M;
mbe2 = sum(T_sim2' - T_test) / N;
disp(['Training Set MBE: ', num2str(mbe1)]);
disp(['Test Set MBE: ', num2str(mbe2)]);
% Mean Squared Error (MSE)
mse1 = sum((T_sim1' - T_train).^2) / M;
mse2 = sum((T_sim2' - T_test).^2) / N;
disp(['Training Set MSE: ', num2str(mse1)]);
disp(['Test Set MSE: ', num2str(mse2)]);
% Root Mean Squared Error (RMSE)
error1 = sqrt(mse1);
error2 = sqrt(mse2);
%% Generate plots
% Training Set Prediction Plot
figure;
plot(1:M, T_train, '-', 'LineWidth', 2, 'Color', [0 0 1]); % True values (blue line)
hold on;
plot(1:M, T_sim1, '--', '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:N, T_test, '-', 'LineWidth', 2, 'Color', [0 0 1]); % True values (blue line)
hold on;
plot(1:N, T_sim2, '--', '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;
% Training Set Linear Fit Plot
figure;
plot(T_train, T_sim1, 'o', 'Markersize', 8, 'MarkerEdgeColor', [0 0 1], 'MarkerFaceColor', [0.5 0.5 1]); % Blue markers
hold on;
h = lsline;
set(h, 'LineWidth', 2, 'Color', [1 0 0]); % Red line
xlabel('True');
ylabel('Predicted');
title('Training Set Fit');
grid on;
% Test Set Linear Fit Plot
figure;
plot(T_test, T_sim2, 'o', 'Markersize', 8, 'MarkerEdgeColor', [0 0 1], 'MarkerFaceColor', [0.5 0.5 1]); % Blue markers
hold on;
h = lsline;
set(h, 'LineWidth', 2, 'Color', [1 0 0]); % Red line
xlabel('True');
ylabel('Predicted');
title('Test Set Fit');
grid on;
% Combined Plot for Training and Test Sets
figure;
plot(1:M, T_train, '-', 'LineWidth', 1, 'Color', [0 0 1]); % Training true values (blue line)
hold on;
plot(M+1:M+N, T_test, '-', 'LineWidth', 1, 'Color', [0 1 0]); % Test true values (green line)
hold on;
plot(1:M, T_sim1, '--', 'LineWidth', 1, 'Color', [1 0 0]); % Training predicted values (red dashed line)
plot(M+1:M+N, T_sim2, '--', 'LineWidth', 1, 'Color', [1 0 1]); % Test predicted values (purple dashed line)
xline(M, '--k', 'LineWidth', 2); % Separator line
legend('Training True', 'Test True', 'Training Predicted', 'Test Predicted', 'Location', 'best');
xlabel('Samples');
ylabel('Values');
title('Training and Test Sets');
grid on;
disp('Model training and evaluation completed!');
代码功能概述
本代码旨在通过以下步骤实现时间序列预测:
- 数据加载和预处理
从Excel文件加载时间序列数据,进行归一化处理。 - 训练/测试集划分
根据比例将数据划分为训练集和测试集。 - 神经网络构建与训练
创建一个具有10个隐藏神经元的BP神经网络,并使用trainlm
(Levenberg-Marquardt算法)优化。 - 模型评估与可视化
使用R²、MAE、MAPE等指标评估模型表现,绘制预测结果和拟合曲线。
核心代码解读
数据预处理
% 归一化数据
normalized_data = (time_series - min_val) / (max_val - min_val);
-
归一化将数据压缩到[0, 1]范围,提升训练效率并防止数值波动影响模型。
训练数据格式 时间序列预测需要构建特征-目标对:
P_train = train_data(1:end-1)';
T_train = train_data(2:end)';
使用10个隐藏层神经元,trainlm
优化算法高效处理小型数据集。
模型评估指标
- R²:评估拟合优度,越接近1越好。
- MAE/MAPE:量化预测误差。
- RMSE:评估误差的均方根值。
R2 = 1 - norm(T_test - T_sim2')^2 / norm(T_test - mean(T_test))^2;
......
可视化
- 训练集与测试集的预测对比图。
- 实际值与预测值的线性拟合图。
- 训练与测试集的结合图,展示模型分割点。
结论
本代码展示了使用BP神经网络预测单列时间序列的完整流程,适用于小型时间序列的建模和分析。结合丰富的性能评估与可视化,能帮助用户快速验证模型效果。
进一步改进建议:
- 使用交叉验证优化超参数。
- 尝试更复杂的网络结构(如LSTM)处理长时间依赖的序列数据。
希望这篇文章能为您的时间序列预测任务提供实用参考!
原文地址:https://blog.csdn.net/subject625Ruben/article/details/143987183
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!