NARX (Nonlinear Auto-Regressive model with Exogenous Inputs) 的全称是带有外部输入的非线性自回归神经网络,是一种有效的时间序列预测技术。
但是目前很多教程中所展示的NARX预测过程都不完整,为此小编将一个完整的预测过程整理如下(自我感觉) :
整体思路:
首先将一个时间序列分为:训练集、验证集和测试集,分割方式是按照时间前后顺序,而非随机分配。随后利用训练集来训练开环NARX,训练完成之后将开环NARX转化为闭环,接着查看该闭环NARX在验证集上的预测性能,并根据该预测结果决定是否采用该NARX网络。如果预测结果达到满意程度,则进一步查看其在测试集上的精度,以防过拟合。否则重新训练NARX或者优化其拓扑结构,直到其在验证集合测试集达到要求为止。
举例说明:
%% 采用NARX神经网络进行预测
close all
clear
clc
%% 数据准备
[Input,Target] = maglev_dataset; % 载入数据
N_train = 2000; % 训练数据个数
N_val = 3000; % 验证数据个数
N_test = length(Target); % 测试数据个数
Input_train = Input(1:N_train); % 训练数据——输入
Input_val = Input(N_train+1:N_val); % 验证数据——输入
Input_test = Input(N_val+1:N_test); % 测试数据——输入
Target_train = Target(1:N_train); % 训练数据——输出
Target_val = Target(N_train+1:N_val); % 验证数据——输出
Target_test = Target(N_val+1:N_test); % 测试数据——输出
%% NARX网络的建立
inputDelays = 1:2; % 输入延时
feedbackDelays = 1:2; % 反馈延时
hiddenSize = 10; % 隐含层结构
% 创建一个开环的NARX神经网络,其中的'open'可以省略,默认自动生成开环结构
narx = narxnet(inputDelays,feedbackDelays,hiddenSize,'open');
% % 训练NRAX神经网络
% 在训练NARX之前需要对数据进行处理,这里采用MATLAB自带的preparets函数
[input_train,input_trainStatei,layer_trainStatei,target_train] = ...
preparets(narx,Input_train,{},Target_train);
narx = train(narx,input_train,target_train,input_trainStatei,layer_trainStatei);
[output_train,input_trainStatef,layer_trainStatef] = ...
narx(input_train,input_trainStatei,layer_trainStatei);
Error_train = mse(target_train,output_train); % 训练误差
% % 将开环的NARX转化为闭环
[narx_c,input_valStatei,layer_valStatei] = ...
closeloop(narx,input_trainStatef,layer_trainStatef);
% % 验证NARX神经网络
[output_val,input_valStatef,layer_valStatef] = ...
narx_c(Input_val,input_valStatei,layer_valStatei);
Error_val = mse(Target_val,output_val); % 验证误差
% % 测试NARX神经网络
output_test = narx_c(Input_test,input_valStatef,layer_valStatef);
Error_test = mse(Target_test,output_test); % 测试误差
%% 结果展示
fprintf('The training error is: %f\n',Error_train)
fprintf('The validation error is: %f\n',Error_val)
fprintf('The testing error is: %f\n',Error_test)
figure; hold on; box on
plot(cell2mat([target_train Target_val Target_test]))
plot(cell2mat(output_train))
plot(N_train+1:N_val,cell2mat(output_val))
plot(N_val+1:N_test,cell2mat(output_test))
legend('Measurement','Train','Validation','Test','location','best')
结果如下:
如图所示,橙黄和紫线分别为验证和测试结果,可以发现整体预测误差还能接受。否则,重新训练或者优化NARX的拓扑结构。
参考资料:
多步神经网络预测- MATLAB & Simulink- MathWorks 中国
如有不妥之处,请慷慨指出,促进大家互相学习。
作者邮箱:[email protected]
出处:利用NARX神经网络进行时间序列预测_五千年的反射弧的博客-CSDN博客
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。