基于matlab 18-BP神经网络 时间序列模型 (1)
18-BP神经网络 时间序列模型基于历史数据数量和设置时间点来进行下一步预测时间序列预测模型/时序预测matlab内含R方、MAE、MBE、MSE、MAPE、RMSE主页有分类模型、回归预测。
·
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' 为您自己的数据文件名或加载方式。
代码解释:
-
数据加载:
load('your_timeseries_data.mat'):加载时间序列数据,其中Y是时间序列数据变量。请将your_timeseries_data.mat替换为您的实际数据文件名。
-
设置参数:
input_size:决定使用多少个历史数据点作为输入特征。hidden_layer_size:隐藏层中的神经元数量。train_ratio:训练集占总数据的比例。
-
数据预处理:
- 构建输入矩阵
X和目标向量Y_target,其中每个输入是一个包含input_size个连续时间点的数据,对应的输出是下一个时间点的值。
- 构建输入矩阵
-
划分训练集和测试集:
- 根据设定的比例将数据划分为训练集和测试集。
-
创建并配置BP神经网络:
- 使用
feedforwardnet函数创建前馈神经网络,并设置隐藏层神经元的数量和其他参数。 trainFcn指定训练算法,这里使用了Levenberg-Marquardt算法(trainlm),这是一种快速收敛的方法。
- 使用
-
模型训练:
- 使用
train函数训练神经网络。
- 使用
-
性能评估:
- 计算多种性能指标(R方、MAE、MBE、MSE、MAPE、RMSE)来评估模型在训练集和测试集上的表现。
-
结果可视化:
- 绘制训练集和测试集的真实值与预测值对比图,便于直观比较模型的表现。
注意事项:
- 在运行此代码之前,请确保您的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' 为您自己的数据文件名或加载方式。
代码解释:
-
数据加载:
load('your_timeseries_data.mat'):加载时间序列数据,其中Y是时间序列数据变量。请将your_timeseries_data.mat替换为您的实际数据文件名。
-
设置参数:
input_size:决定使用多少个历史数据点作为输入特征。hidden_layer_size:隐藏层中的神经元数量。train_ratio:训练集占总数据的比例。
-
数据预处理:
- 构建输入矩阵
X和目标向量Y_target,其中每个输入是一个包含input_size个连续时间点的数据,对应的输出是下一个时间点的值。
- 构建输入矩阵
-
划分训练集和测试集:
- 根据设定的比例将数据划分为训练集和测试集。
-
创建并配置BP神经网络:
- 使用
feedforwardnet函数创建前馈神经网络,并设置隐藏层神经元的数量和其他参数。 trainFcn指定训练算法,这里使用了Levenberg-Marquardt算法(trainlm),这是一种快速收敛的方法。
- 使用
-
模型训练:
- 使用
train函数训练神经网络。
- 使用
-
性能评估:
- 计算多种性能指标(R方、MAE、MBE、MSE、MAPE、RMSE)来评估模型在训练集和测试集上的表现。
-
结果可视化:
- 绘制训练集和测试集的真实值与预测值对比图,便于直观比较模型的表现。
注意事项:
- 在运行此代码之前,请确保您的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' 为您自己的数据文件名或加载方式。
代码解释:
-
数据加载:
load('your_timeseries_data.mat'):加载时间序列数据,其中Y是时间序列数据变量。请将your_timeseries_data.mat替换为您的实际数据文件名。
-
设置参数:
input_size:决定使用多少个历史数据点作为输入特征。hidden_layer_size:隐藏层中的神经元数量。train_ratio:训练集占总数据的比例。
-
数据预处理:
- 构建输入矩阵
X和目标向量Y_target,其中每个输入是一个包含input_size个连续时间点的数据,对应的输出是下一个时间点的值。
- 构建输入矩阵
-
划分训练集和测试集:
- 根据设定的比例将数据划分为训练集和测试集。
-
创建并配置BP神经网络:
- 使用
feedforwardnet函数创建前馈神经网络,并设置隐藏层神经元的数量和其他参数。 trainFcn指定训练算法,这里使用了Levenberg-Marquardt算法(trainlm),这是一种快速收敛的方法。
- 使用
-
模型训练:
- 使用
train函数训练神经网络。
- 使用
-
性能评估:
- 计算多种性能指标(R方、MAE、MBE、MSE、MAPE、RMSE)来评估模型在训练集和测试集上的表现。
-
结果可视化:
- 绘制训练集和测试集的真实值与预测值对比图,便于直观比较模型的表现。
- 绘制预测值与真实值的散点图,以更直观地展示预测效果。
注意事项:
- 在运行此代码之前,请确保您的MATLAB环境中已安装神经网络工具箱。
- 将
your_timeseries_data.mat替换为您自己的时间序列数据文件名或加载方式。
希望这段代码能帮助你开始使用BP神经网络进行时间序列预测!
更多推荐


所有评论(0)