Should modify the number of layers to make multi-step closed loop NarX
1 view (last 30 days)
Show older comments
Should modify the number of layers to make multi-step closed loop NarX. How can i have multi-step with closeloop narx?
0 Comments
Accepted Answer
Shashank Prasanna
on 1 Feb 2013
Maybe this example should help you FRANCISCO. This example predicts 30 time steps ahead for a SINE wave.
time = 1:10:7200;
timeh = time(1:end/2);
timenh = time(end/2 +1 : end);
input = sind(time(1:end/2));
toPredict = sind(time(end/2 +1 : end));
% plot(time(1:end/2),input,'o-g',time(end/2+1:end), toPredict,'+-r')
% legend('input to neural network','expected output');
inputSeries = tonndata(timeh,true,false);
targetSeries = tonndata(input,true,false);
% Create a Nonlinear Autoregressive Network with External Input
inputDelays = 1:10;
feedbackDelays = 1:10;
hiddenLayerSize = 50;
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);
% Prepare the Data for Training and Simulation
% The function PREPARETS prepares timeseries data for a particular network,
% shifting time by the minimum amount to fill input states and layer states.
% Using PREPARETS allows you to keep your original time series data unchanged, while
% easily customizing it for networks with differing numbers of delays, with
% open loop or closed loop feedback modes.
[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);
% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% 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 outout layer.
netc = closeloop(net);
netc.name = [net.name ' - Closed Loop'];
% Only a certain number of predictions can be made
%accurately modulate this parameter to check it.
NumberOfPredictions = 30
% Creating a new input series which has the time
% inputs for the second half of the time but also
% includes last 10 time steps from the previous
% timeSeries
newInputSeries = timenh(1:NumberOfPredictions);
newInputSeries = [cell2mat(inputSeries(end-10:end) ) (newInputSeries)]
newInputSeries = num2cell(newInputSeries);
%Creating a new target with first 10 values which
%are the expected outputs network and the
%remaining targets are set to NAN, These values
%which are set to NAN will be predicted.
newTargetSet = nan(size(newInputSeries))
newTargetSet = num2cell(newTargetSet )
newTargetSet (1:10) = targetSeries(end-9:end)
[xc,xic,aic,tc] = preparets(netc,newInputSeries,{},newTargetSet);
yPredicted = sim(netc,xc,xic,aic)
% timenh = [ timenh timenh(end)+10];
figure,plot(timeh,cell2mat(targetSeries),'.-',timenh(1:NumberOfPredictions +1),cell2mat(yPredicted),'+-')
title(['PREDICTION PLOT - NumberOfPredictions =' num2str(NumberOfPredictions)])
legend('INPUT DATA','PREDICTED DATA')
7 Comments
More Answers (1)
Greg Heath
on 4 Feb 2013
A single hidden layer is sufficient.
Use the autocorrelation function of the target and the crosscorrelation function of the target and input to determine which input and feedback lags are significant.
Do not use the default division function 'dividerand' because the randomness destroys the correlations needed for prediction. I find 'divideblock' to be more appropriate. However, you may prefer 'divideind' or 'divideint'.
Hope this helps.
Greg
See Also
Categories
Find more on Sequence and Numeric Feature Data Workflows in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!