18-BP神经网络 时间序列模型

基于历史数据数量和设置时间点来进行下一步预测

时间序列预测模型/时序预测
matlab
内含R方、MAE、MBE、MSE、MAPE、RMSE
主页有分类模型、回归预测

在这里插入图片描述


下面提供了一个详细的MATLAB代码示例,用于实现基于BP神经网络的时间序列预测模型。该代码包括数据预处理、模型训练、预测及性能评估(R方、MAE、MBE、MSE、MAPE、RMSE)。注释详细,适合初学者理解与使用。

MATLAB代码示例

% 清除工作区和命令窗口
clear;
clc;

% 加载时间序列数据
data = load('your_timeseries_data.mat'); % 替换为您的数据集文件名
Y = data.Y; % 时间序列数据

% 设置参数
input_size = 5; % 输入层大小,即使用的过去点数量
hidden_layer_size = 10; % 隐藏层神经元数量
output_size = 1; % 输出层大小,即预测一个未来点
train_ratio = 0.8; % 训练集比例

% 数据预处理
n = length(Y);
train_len = floor(n * train_ratio);

% 创建输入输出对
X = [];
Y_target = [];
for i = 1:(n - input_size)
    X = [X; Y(i:i + input_size - 1)'];
    Y_target = [Y_target; Y(i + input_size)];
end

% 划分训练集和测试集
trainIdx = 1:train_len - input_size;
testIdx = train_len:n - input_size;

% 创建并配置BP神经网络
net = feedforwardnet([hidden_layer_size]);
net.divideParam.trainRatio = train_ratio;
net.divideParam.valRatio = 0.1; % 验证集比例
net.divideParam.testRatio = 0.1; % 测试集比例
net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt算法进行训练

% 显示网络结构
disp('BP神经网络结构:');
disp(net);

% 训练BP神经网络
[net, tr] = train(net, X(trainIdx, :)', Y_target(trainIdx)'.');

% 预测
YPredTrain = net(X(trainIdx, :)');
YPredTest = net(X(testIdx, :)');

% 性能评估指标
% R方 (R-squared)
R2_train = 1 - sum((YPredTrain' - Y_target(trainIdx)').^2) / sum((Y_target(trainIdx)' - mean(Y_target(trainIdx))).^2);
R2_test = 1 - sum((YPredTest' - Y_target(testIdx)').^2) / sum((Y_target(testIdx)' - mean(Y_target(testIdx))).^2);

% 平均绝对误差 (Mean Absolute Error, MAE)
MAE_train = mean(abs(YPredTrain' - Y_target(trainIdx)'));
MAE_test = mean(abs(YPredTest' - Y_target(testIdx)'));

% 平均偏差 (Mean Bias Error, MBE)
MBE_train = mean(YPredTrain' - Y_target(trainIdx)');
MBE_test = mean(YPredTest' - Y_target(testIdx)');

% 均方误差 (Mean Squared Error, MSE)
MSE_train = mean((YPredTrain' - Y_target(trainIdx)').^2);
MSE_test = mean((YPredTest' - Y_target(testIdx)').^2);

% 平均绝对百分比误差 (Mean Absolute Percentage Error, MAPE)
MAPE_train = mean(abs((YPredTrain' - Y_target(trainIdx)')./Y_target(trainIdx)')) * 100;
MAPE_test = mean(abs((YPredTest' - Y_target(testIdx)')./Y_target(testIdx)')) * 100;

% 均方根误差 (Root Mean Squared Error, RMSE)
RMSE_train = sqrt(MSE_train);
RMSE_test = sqrt(MSE_test);

% 打印结果
fprintf('训练集:\n');
fprintf('R2=%.4f\n', R2_train);
fprintf('MAE=%.4f\n', MAE_train);
fprintf('MBE=%.4f\n', MBE_train);
fprintf('MSE=%.4f\n', MSE_train);
fprintf('MAPE=%.4f%%\n', MAPE_train);
fprintf('RMSE=%.4f\n\n', RMSE_train);

fprintf('测试集:\n');
fprintf('R2=%.4f\n', R2_test);
fprintf('MAE=%.4f\n', MAE_test);
fprintf('MBE=%.4f\n', MBE_test);
fprintf('MSE=%.4f\n', MSE_test);
fprintf('MAPE=%.4f%%\n', MAPE_test);
fprintf('RMSE=%.4f\n', RMSE_test);

% 绘制真实值与预测值对比图
figure;
subplot(2,1,1);
plot(Y_target(trainIdx), 'r-', 'DisplayName', '真实值');
hold on;
plot(YPredTrain', 'b.', 'DisplayName', '预测值');
title('训练集预测值 vs 真实值');
xlabel('样本序号');
ylabel('值');
legend;

subplot(2,1,2);
plot(Y_target(testIdx), 'r-', 'DisplayName', '真实值');
hold on;
plot(YPredTest', 'b.', 'DisplayName', '预测值');
title('测试集预测值 vs 真实值');
xlabel('样本序号');
ylabel('值');
legend;

% 注意:请根据实际情况替换 'your_timeseries_data.mat' 为您自己的数据文件名或加载方式。

代码解释:

  1. 数据加载

    • load('your_timeseries_data.mat'):加载时间序列数据,其中Y是时间序列数据变量。请将your_timeseries_data.mat替换为您的实际数据文件名。
  2. 设置参数

    • input_size:决定使用多少个历史数据点作为输入特征。
    • hidden_layer_size:隐藏层中的神经元数量。
    • train_ratio:训练集占总数据的比例。
  3. 数据预处理

    • 构建输入矩阵X和目标向量Y_target,其中每个输入是一个包含input_size个连续时间点的数据,对应的输出是下一个时间点的值。
  4. 划分训练集和测试集

    • 根据设定的比例将数据划分为训练集和测试集。
  5. 创建并配置BP神经网络

    • 使用feedforwardnet函数创建前馈神经网络,并设置隐藏层神经元的数量和其他参数。
    • trainFcn指定训练算法,这里使用了Levenberg-Marquardt算法(trainlm),这是一种快速收敛的方法。
  6. 模型训练

    • 使用train函数训练神经网络。
  7. 性能评估

    • 计算多种性能指标(R方、MAE、MBE、MSE、MAPE、RMSE)来评估模型在训练集和测试集上的表现。
  8. 结果可视化

    • 绘制训练集和测试集的真实值与预测值对比图,便于直观比较模型的表现。

注意事项:

  • 在运行此代码之前,请确保您的MATLAB环境中已安装神经网络工具箱。
  • your_timeseries_data.mat替换为您自己的时间序列数据文件名或加载方式。
    希望这段代码能帮助您开始使用BP神经网络进行时间序列预测!
    在这里插入图片描述
    为了帮助你更好地理解如何使用MATLAB进行时间序列预测,并生成类似于你提供的图表,下面是一个详细的MATLAB代码示例。这个代码将包括数据预处理、模型训练、预测以及性能评估(R方、MAE、MBE、MSE、MAPE、RMSE)。

MATLAB代码示例

% 清除工作区和命令窗口
clear;
clc;

% 加载时间序列数据
data = load('your_timeseries_data.mat'); % 替换为您的数据集文件名
Y = data.Y; % 时间序列数据

% 设置参数
input_size = 5; % 输入层大小,即使用的过去点数量
hidden_layer_size = 10; % 隐藏层神经元数量
output_size = 1; % 输出层大小,即预测一个未来点
train_ratio = 0.8; % 训练集比例

% 数据预处理
n = length(Y);
train_len = floor(n * train_ratio);

% 创建输入输出对
X = [];
Y_target = [];
for i = 1:(n - input_size)
    X = [X; Y(i:i + input_size - 1)'];
    Y_target = [Y_target; Y(i + input_size)];
end

% 划分训练集和测试集
trainIdx = 1:train_len - input_size;
testIdx = train_len:n - input_size;

% 创建并配置BP神经网络
net = feedforwardnet([hidden_layer_size]);
net.divideParam.trainRatio = train_ratio;
net.divideParam.valRatio = 0.1; % 验证集比例
net.divideParam.testRatio = 0.1; % 测试集比例
net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt算法进行训练

% 显示网络结构
disp('BP神经网络结构:');
disp(net);

% 训练BP神经网络
[net, tr] = train(net, X(trainIdx, :)', Y_target(trainIdx)'.');

% 预测
YPredTrain = net(X(trainIdx, :)');
YPredTest = net(X(testIdx, :)');

% 性能评估指标
% R方 (R-squared)
R2_train = 1 - sum((YPredTrain' - Y_target(trainIdx)').^2) / sum((Y_target(trainIdx)' - mean(Y_target(trainIdx))).^2);
R2_test = 1 - sum((YPredTest' - Y_target(testIdx)').^2) / sum((Y_target(testIdx)' - mean(Y_target(testIdx))).^2);

% 平均绝对误差 (Mean Absolute Error, MAE)
MAE_train = mean(abs(YPredTrain' - Y_target(trainIdx)'));
MAE_test = mean(abs(YPredTest' - Y_target(testIdx)'));

% 平均偏差 (Mean Bias Error, MBE)
MBE_train = mean(YPredTrain' - Y_target(trainIdx)');
MBE_test = mean(YPredTest' - Y_target(testIdx)');

% 均方误差 (Mean Squared Error, MSE)
MSE_train = mean((YPredTrain' - Y_target(trainIdx)').^2);
MSE_test = mean((YPredTest' - Y_target(testIdx)').^2);

% 平均绝对百分比误差 (Mean Absolute Percentage Error, MAPE)
MAPE_train = mean(abs((YPredTrain' - Y_target(trainIdx)')./Y_target(trainIdx)')) * 100;
MAPE_test = mean(abs((YPredTest' - Y_target(testIdx)')./Y_target(testIdx)')) * 100;

% 均方根误差 (Root Mean Squared Error, RMSE)
RMSE_train = sqrt(MSE_train);
RMSE_test = sqrt(MSE_test);

% 打印结果
fprintf('训练集:\n');
fprintf('R2=%.4f\n', R2_train);
fprintf('MAE=%.4f\n', MAE_train);
fprintf('MBE=%.4f\n', MBE_train);
fprintf('MSE=%.4f\n', MSE_train);
fprintf('MAPE=%.4f%%\n', MAPE_train);
fprintf('RMSE=%.4f\n\n', RMSE_train);

fprintf('测试集:\n');
fprintf('R2=%.4f\n', R2_test);
fprintf('MAE=%.4f\n', MAE_test);
fprintf('MBE=%.4f\n', MBE_test);
fprintf('MSE=%.4f\n', MSE_test);
fprintf('MAPE=%.4f%%\n', MAPE_test);
fprintf('RMSE=%.4f\n', RMSE_test);

% 绘制真实值与预测值对比图
figure;
subplot(2,1,1);
plot(Y_target(trainIdx), 'r-', 'DisplayName', '真实值');
hold on;
plot(YPredTrain', 'b.', 'DisplayName', '预测值');
title('训练集预测值 vs 真实值');
xlabel('样本序号');
ylabel('值');
legend;

subplot(2,1,2);
plot(Y_target(testIdx), 'r-', 'DisplayName', '真实值');
hold on;
plot(YPredTest', 'b.', 'DisplayName', '预测值');
title('测试集预测值 vs 真实值');
xlabel('样本序号');
ylabel('值');
legend;

% 注意:请根据实际情况替换 'your_timeseries_data.mat' 为您自己的数据文件名或加载方式。

代码解释:

  1. 数据加载

    • load('your_timeseries_data.mat'):加载时间序列数据,其中Y是时间序列数据变量。请将your_timeseries_data.mat替换为您的实际数据文件名。
  2. 设置参数

    • input_size:决定使用多少个历史数据点作为输入特征。
    • hidden_layer_size:隐藏层中的神经元数量。
    • train_ratio:训练集占总数据的比例。
  3. 数据预处理

    • 构建输入矩阵X和目标向量Y_target,其中每个输入是一个包含input_size个连续时间点的数据,对应的输出是下一个时间点的值。
  4. 划分训练集和测试集

    • 根据设定的比例将数据划分为训练集和测试集。
  5. 创建并配置BP神经网络

    • 使用feedforwardnet函数创建前馈神经网络,并设置隐藏层神经元的数量和其他参数。
    • trainFcn指定训练算法,这里使用了Levenberg-Marquardt算法(trainlm),这是一种快速收敛的方法。
  6. 模型训练

    • 使用train函数训练神经网络。
  7. 性能评估

    • 计算多种性能指标(R方、MAE、MBE、MSE、MAPE、RMSE)来评估模型在训练集和测试集上的表现。
  8. 结果可视化

    • 绘制训练集和测试集的真实值与预测值对比图,便于直观比较模型的表现。

注意事项:

  • 在运行此代码之前,请确保您的MATLAB环境中已安装神经网络工具箱。
  • your_timeseries_data.mat替换为您自己的时间序列数据文件名或加载方式。
    希望这段代码能帮助你开始使用BP神经网络进行时间序列预测!
    在这里插入图片描述
    为了帮助你更好地理解如何使用MATLAB进行时间序列预测,并生成类似于你提供的图表,下面是一个详细的MATLAB代码示例。这个代码将包括数据预处理、模型训练、预测以及性能评估(R方、MAE、MBE、MSE、MAPE、RMSE),并绘制训练集和测试集的预测值与真实值对比图。

MATLAB代码示例

% 清除工作区和命令窗口
clear;
clc;

% 加载时间序列数据
data = load('your_timeseries_data.mat'); % 替换为您的数据集文件名
Y = data.Y; % 时间序列数据

% 设置参数
input_size = 5; % 输入层大小,即使用的过去点数量
hidden_layer_size = 10; % 隐藏层神经元数量
output_size = 1; % 输出层大小,即预测一个未来点
train_ratio = 0.8; % 训练集比例

% 数据预处理
n = length(Y);
train_len = floor(n * train_ratio);

% 创建输入输出对
X = [];
Y_target = [];
for i = 1:(n - input_size)
    X = [X; Y(i:i + input_size - 1)'];
    Y_target = [Y_target; Y(i + input_size)];
end

% 划分训练集和测试集
trainIdx = 1:train_len - input_size;
testIdx = train_len:n - input_size;

% 创建并配置BP神经网络
net = feedforwardnet([hidden_layer_size]);
net.divideParam.trainRatio = train_ratio;
net.divideParam.valRatio = 0.1; % 验证集比例
net.divideParam.testRatio = 0.1; % 测试集比例
net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt算法进行训练

% 显示网络结构
disp('BP神经网络结构:');
disp(net);

% 训练BP神经网络
[net, tr] = train(net, X(trainIdx, :)', Y_target(trainIdx)'.');

% 预测
YPredTrain = net(X(trainIdx, :)');
YPredTest = net(X(testIdx, :)');

% 性能评估指标
% R方 (R-squared)
R2_train = 1 - sum((YPredTrain' - Y_target(trainIdx)').^2) / sum((Y_target(trainIdx)' - mean(Y_target(trainIdx))).^2);
R2_test = 1 - sum((YPredTest' - Y_target(testIdx)').^2) / sum((Y_target(testIdx)' - mean(Y_target(testIdx))).^2);

% 平均绝对误差 (Mean Absolute Error, MAE)
MAE_train = mean(abs(YPredTrain' - Y_target(trainIdx)'));
MAE_test = mean(abs(YPredTest' - Y_target(testIdx)'));

% 平均偏差 (Mean Bias Error, MBE)
MBE_train = mean(YPredTrain' - Y_target(trainIdx)');
MBE_test = mean(YPredTest' - Y_target(testIdx)');

% 均方误差 (Mean Squared Error, MSE)
MSE_train = mean((YPredTrain' - Y_target(trainIdx)').^2);
MSE_test = mean((YPredTest' - Y_target(testIdx)').^2);

% 平均绝对百分比误差 (Mean Absolute Percentage Error, MAPE)
MAPE_train = mean(abs((YPredTrain' - Y_target(trainIdx)')./Y_target(trainIdx)')) * 100;
MAPE_test = mean(abs((YPredTest' - Y_target(testIdx)')./Y_target(testIdx)')) * 100;

% 均方根误差 (Root Mean Squared Error, RMSE)
RMSE_train = sqrt(MSE_train);
RMSE_test = sqrt(MSE_test);

% 打印结果
fprintf('训练集:\n');
fprintf('R2=%.4f\n', R2_train);
fprintf('MAE=%.4f\n', MAE_train);
fprintf('MBE=%.4f\n', MBE_train);
fprintf('MSE=%.4f\n', MSE_train);
fprintf('MAPE=%.4f%%\n', MAPE_train);
fprintf('RMSE=%.4f\n\n', RMSE_train);

fprintf('测试集:\n');
fprintf('R2=%.4f\n', R2_test);
fprintf('MAE=%.4f\n', MAE_test);
fprintf('MBE=%.4f\n', MBE_test);
fprintf('MSE=%.4f\n', MSE_test);
fprintf('MAPE=%.4f%%\n', MAPE_test);
fprintf('RMSE=%.4f\n', RMSE_test);

% 绘制真实值与预测值对比图
figure;
subplot(2,1,1);
plot(Y_target(trainIdx), 'r-', 'DisplayName', '真实值');
hold on;
plot(YPredTrain', 'b.', 'DisplayName', '预测值');
title('训练集预测值 vs 真实值');
xlabel('样本序号');
ylabel('值');
legend;

subplot(2,1,2);
plot(Y_target(testIdx), 'r-', 'DisplayName', '真实值');
hold on;
plot(YPredTest', 'b.', 'DisplayName', '预测值');
title('测试集预测值 vs 真实值');
xlabel('样本序号');
ylabel('值');
legend;

% 绘制预测值与真实值对比图
figure;
subplot(1,2,1);
scatter(Y_target(trainIdx), YPredTrain', 'b.');
hold on;
plot([min(Y_target(trainIdx)) max(Y_target(trainIdx))], [min(Y_target(trainIdx)) max(Y_target(trainIdx))], 'r-');
title('训练集预测值 vs. 训练集真实值');
xlabel('训练集真实值');
ylabel('训练集预测值');

subplot(1,2,2);
scatter(Y_target(testIdx), YPredTest', 'b.');
hold on;
plot([min(Y_target(testIdx)) max(Y_target(testIdx))], [min(Y_target(testIdx)) max(Y_target(testIdx))], 'r-');
title('测试集预测值 vs. 测试集真实值');
xlabel('测试集真实值');
ylabel('测试集预测值');

% 注意:请根据实际情况替换 'your_timeseries_data.mat' 为您自己的数据文件名或加载方式。

代码解释:

  1. 数据加载

    • load('your_timeseries_data.mat'):加载时间序列数据,其中Y是时间序列数据变量。请将your_timeseries_data.mat替换为您的实际数据文件名。
  2. 设置参数

    • input_size:决定使用多少个历史数据点作为输入特征。
    • hidden_layer_size:隐藏层中的神经元数量。
    • train_ratio:训练集占总数据的比例。
  3. 数据预处理

    • 构建输入矩阵X和目标向量Y_target,其中每个输入是一个包含input_size个连续时间点的数据,对应的输出是下一个时间点的值。
  4. 划分训练集和测试集

    • 根据设定的比例将数据划分为训练集和测试集。
  5. 创建并配置BP神经网络

    • 使用feedforwardnet函数创建前馈神经网络,并设置隐藏层神经元的数量和其他参数。
    • trainFcn指定训练算法,这里使用了Levenberg-Marquardt算法(trainlm),这是一种快速收敛的方法。
  6. 模型训练

    • 使用train函数训练神经网络。
  7. 性能评估

    • 计算多种性能指标(R方、MAE、MBE、MSE、MAPE、RMSE)来评估模型在训练集和测试集上的表现。
  8. 结果可视化

    • 绘制训练集和测试集的真实值与预测值对比图,便于直观比较模型的表现。
    • 绘制预测值与真实值的散点图,以更直观地展示预测效果。

注意事项:

  • 在运行此代码之前,请确保您的MATLAB环境中已安装神经网络工具箱。
  • your_timeseries_data.mat替换为您自己的时间序列数据文件名或加载方式。
    希望这段代码能帮助你开始使用BP神经网络进行时间序列预测!
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐