%% Train NAR Network and Predict on New Data

%%
% Train a nonlinear autoregressive (NAR) neural network and predict on new
% time series data. Predicting a sequence of values in a time series is
% also known as _multistep prediction_. Closed-loop networks can perform
% multistep predictions. When external feedback is missing, closed-loop
% networks can continue to predict by using internal feedback. In NAR
% prediction, the future values of a time series are predicted only from
% past values of that series.
%
% Load the simple time series prediction data.
T = simplenar_dataset;

%%
% Create a NAR network. Define the feedback delays and size of the hidden
% layers.
net = narnet(1:2,10);

%%
% Prepare the time series data using |preparets|. This function
% automatically shifts input and target time series by the number of steps
% needed to fill the initial input and layer delay states.
[Xs,Xi,Ai,Ts] = preparets(net,{},{},T);
%%
% A recommended practice is to fully create the network in an open loop,
% and then transform the network to a closed loop for multistep-ahead
% prediction. Then, the closed-loop network can predict as many future
% values as you want. If you simulate the neural network in closed-loop
% mode only, the network can perform as many predictions as the number of
% time steps in the input series.
%
% Train the NAR network. The |train| function trains the network in an open
% loop (series-parallel architecture), including the validation and testing
% steps.
%
net = train(net,Xs,Ts,Xi,Ai);
%%
% Display the trained network.
view(net)

%%
% Calculate the network output |Y|, final input states |Xf|, and final layer
% states |Af| of the open-loop network from the network input |Xs|, initial
% input states |Xi|, and initial layer states |Ai|.
[Y,Xf,Af] = net(Xs,Xi,Ai);
%%
% Calculate the network performance.
perf = perform(net,Ts,Y) 

%% 
% To predict the output for the next 20 time steps, first simulate the
% network in closed-loop mode. The final input states |Xf| and layer states
% |Af| of the open-loop network |net| become the initial input states |Xic|
% and layer states |Aic| of the closed-loop network |netc|.
[netc,Xic,Aic] = closeloop(net,Xf,Af);
%%
% Display the closed-loop network. The network has only one input. In
% closed-loop mode, this input connects to the output. A direct delayed
% output connection replaces the delayed target input.
view(netc)

%%
% To simulate the network 20 time steps ahead, input an empty cell array of 
% length 20. The network requires only the initial conditions given in |Xic| and 
% |Aic|.
Yc = netc(cell(0,20),Xic,Aic)

%% 
% Copyright 2012 The MathWorks, Inc.