自学内容网 自学内容网

使用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!');
代码功能概述

本代码旨在通过以下步骤实现时间序列预测:

  1. 数据加载和预处理
    从Excel文件加载时间序列数据,进行归一化处理。
  2. 训练/测试集划分
    根据比例将数据划分为训练集和测试集。
  3. 神经网络构建与训练
    创建一个具有10个隐藏神经元的BP神经网络,并使用trainlm(Levenberg-Marquardt算法)优化。
  4. 模型评估与可视化
    使用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优化算法高效处理小型数据集。

模型评估指标

  • :评估拟合优度,越接近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)!