MATLAB 实现BP神经网络进行时间序列预测 的完整步骤,包含数据预处理、模型构建、训练与预测的代码示例,并附详细注释。
步骤1:数据准备与预处理
1.1 加载时间序列数据
假设时间序列数据存储为单列向量,例如 data = [x1; x2; ...; xn]。
1.2 数据归一化(提升训练效率)
1.3 构造时间窗口(时序特征)
1.4 划分训练集与测试集
步骤2:构建BP神经网络
2.1 定义网络结构
2.2 配置输入输出维度
步骤3:训练网络
步骤4:模型预测与反归一化
4.1 预测测试集
4.2 预测未来时间点(滚动预测)
步骤5:结果可视化与分析
5.1 绘制预测效果图
5.2 计算性能指标

完整代码示例
将上述步骤整合为一个完整代码:
%% 清空环境变量
warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 %% 1. 数据生成与预处理 t = 0:0.1:10; % 时间序列(0到10,步长0.1) data = sin(t) + 0.1*randn(size(t)); % 正弦波叠加噪声 data = data'; % 转为列向量 % 数据归一化(提升训练稳定性) [data_norm, ps] = mapminmax(data', 0, 1); % 归一化到[0,1] data_norm = data_norm'; % 转为列向量 % 构造时间窗口(监督学习格式) lookback = 5; % 用前5个时间点预测下一个时间点 X = []; Y = []; for i = 1:length(data_norm)-lookback X = [X; data_norm(i:i+lookback-1)']; % 输入:历史窗口(n_samples×lookback) Y = [Y; data_norm(i+lookback)]; % 输出:下一时间点(n_samples×1) end % 划分训练集和测试集(80%训练,20%测试) train_ratio = 0.8; n_total = size(X, 1); n_train = floor(n_total * train_ratio); % 按顺序划分(保持时序性) X_train = X(1:n_train, :); Y_train = Y(1:n_train, :); X_test = X(n_train+1:end, :); Y_test = Y(n_train+1:end, :); %% 2. 构建BP神经网络(无需手动设置输入输出层大小!) hiddenLayerSize = 10; % 隐层神经元数量 net = fitnet(hiddenLayerSize); % 输入输出维度自动适配数据! % 配置训练参数 net.trainParam.epochs = 1000; % 最大训练次数 net.trainParam.goal = 1e-5; % 目标误差 net.trainParam.lr = 0.01; % 学习率 net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt算法 %% 3. 训练网络 [net, tr] = train(net, X_train', Y_train'); % 输入数据需要转置为列样本格式 %% 4. 测试集预测与评估 Y_pred_norm = net(X_test'); % 输入测试集数据(列样本) Y_pred = mapminmax('reverse', Y_pred_norm', ps)'; Y_test_actual = mapminmax('reverse', Y_test', ps)'; % 计算性能指标 mse = mean((Y_test_actual - Y_pred).^2); rmse = sqrt(mse); mae = mean(abs(Y_test_actual - Y_pred)); fprintf('测试集性能指标:\nMSE: %.4f\nRMSE: %.4f\nMAE: %.4f\n', mse, rmse, mae); % 绘制测试集预测对比图 figure; plot(Y_test_actual, 'b', 'LineWidth', 1.5); hold on; plot(Y_pred, 'r--', 'LineWidth', 1.5); legend('真实值', '预测值'); xlabel('时间点'); ylabel('数值'); title('测试集预测效果对比'); %% 5. 滚动预测未来时间点 future_steps = 10; current_input = X_test(end, :)'; % 列向量(维度=lookback×1) future_predictions_norm = zeros(future_steps, 1); for i = 1:future_steps next_pred_norm = net(current_input); future_predictions_norm(i) = next_pred_norm; current_input = [current_input(2:end); next_pred_norm]; % 滑动窗口 end % 反归一化未来预测值 future_predictions = mapminmax('reverse', future_predictions_norm', ps)'; % 绘制完整数据及未来预测 figure; plot(data, 'b', 'LineWidth', 1.5); hold on; future_time = length(data)+1 : length(data)+future_steps; plot(future_time, future_predictions, 'ro-', 'LineWidth', 1.5); title('时间序列及未来预测'); xlabel('时间点'); ylabel('数值'); legend('历史数据', '未来预测');
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删