How to predict future responses y(t + 1) from the training of a narxnet network with past data of x (t) and y (t)? (NARXNET)

Asked by Cesar Diaz

Cesar Diaz (view profile)

on 12 Feb 2019
Latest activity Commented on by Cesar Diaz

Cesar Diaz (view profile)

on 13 Feb 2019
Accepted Answer by Greg Heath

Greg Heath (view profile)

Greetings,
I hope someone could help me with the next question:
As input variables for the NARXNET (time series) type neural network I have the following data (cells arrays):
INPUTS: x(t): 1 x 55, each column with 18 x 1. The 18 variables are entries.
OUTPUTS: y(t): 1 x 55, each column with 6 x 1. The 6 variables are outputs.
The 18 input variables are different from 6 output variables. There have high correlations between them. I have a model using a step-by-step regression (multiple) to compare this results with the final results of the NARXNET net. I'm using MSE as statistical error measurement between methods.
I wish to predict Y(1) only by using a input matrix x(t): 1 x 55 (each column 18 x 1 variables).
How could I evaluate the network (net) created using a matrix x(t):1 x 55 (each column 18 x 1 variables) different from the one used during training? I'm using the following code from the Matlab examples in ntstool.
This is the code (any correction and suggestion will be welcome):
%---------------------------------------------ANN FORECASTING--------------------------------------------
inputSeries = INPUTS; %x(t): 1 x 55, each column with 18 x 1. The 18 variables are entries.
targetSeries = OUTPUTS; %y(t): 1 x 55, each column with 6 x 1. The 6 variables are outputs.
%Bayesian model
trainFcn = 'trainbr';
% Create a Nonlinear Autoregressive Network with External Input
inputDelays = 1:0;
feedbackDelays = 1:1;
hiddenLayerSize = 30;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn);
%view(net)
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% Set up Division of Data for Training, Validation, Testing
net.divideFcn = 'divideblock';
net.divideMode = 'value';
net.trainParam.epochs = 10000;
net.trainParam.goal = 0;
net.trainParam.lr = 0.001;
net.divideParam.trainRatio = 85/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
%MSE
net.performFcn = 'mse';
% Train the Network
[net,tr] = train(net,inputs,targets,inputStates,layerStates);
% Test the Network
outputs = net(inputs,inputStates,layerStates);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)
% View the Network
view(net)
% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotregression(targets,outputs)
% figure, plotresponse(targets,outputs)
% figure, ploterrcorr(errors)
% figure, plotinerrcorr(inputs,errors)
% Closed Loop Network
% Use this network to do multi-step prediction.
% The function CLOSELOOP replaces the feedback input with a direct
% connection from the output layer.
netc = closeloop(net);
netc.name = [net.name ' - Closed Loop'];
view(netc)
[xc,xic,aic,tc] = preparets(netc,inputSeries,{},targetSeries);
yc = netc(xc,xic,aic);
closedLoopPerformance = perform(netc,tc,yc)
% Early Prediction Network
% For some applications it helps to get the prediction a
% timestep early.
% The original network returns predicted y(t+1) at the same
% time it is given y(t+1).
% For some applications such as decision making, it would
% help to have predicted y(t+1) once y(t) is available, but
% before the actual y(t+1) occurs.
% The network can be made to return its output a timestep early
% by removing one delay so that its minimal tap delay is now
% 0 instead of 1. The new network returns the same outputs as
% the original network, but outputs are shifted left one timestep.
%nets = removedelay(net,1);
nets=net;
nets.name = [net.name ' - Predict One Step Ahead'];
view(nets)
[xs,xis,ais,ts] = preparets(nets,inputSeries,{},targetSeries);
ys = nets(xs,xis,ais);
earlyPredictPerformance = perform(nets,ts,ys)

Release

R2017a

Answer by Greg Heath

Greg Heath (view profile)

on 13 Feb 2019

YOU DO NOT HAVE X and Y !!!
YOU HAVE X and T where
T = Ydesired
Hope this helps
Thank you for formally accepting my answer
Greg

Cesar Diaz

Cesar Diaz (view profile)

on 13 Feb 2019
Hi Greg, thanks for the answer.
But, how I could send a input matrix x(t), different from the training matrix?. Over the last code, do you could help me with that?.
So, the forecasted responses are:
yc = netc(xc,xic,aic); %CLOSED LOOP
ys = nets(xs,xis,ais); %ONE STEP AHEAD
How I could make a new forecast from:
outputs = net(inputs,inputStates,layerStates); %OPENED LOOP
I need to load a new x(t) matrix for make a forecast T(t).
Thanks Greg.