利用NARX神经网络进行时间序列预测

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 中国

如有不妥之处,请慷慨指出,促进大家互相学习。

作者邮箱:phwang_xtu@163.com

出处:利用NARX神经网络进行时间序列预测_五千年的反射弧的博客-CSDN博客

本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 12
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值