MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply TodayTo resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Asked by Daan on 10 Sep 2013

Hi everyone,

I have a question about forecasting using neural network timeseries tool(ntstool).

I am working with a timeserie dataset. I have an input dataset of 217 rows and 24 columns (217x24 matrix) and a target dataset of 217 rows and 1 column (217x1 matrix).All values are numbers

So I go to ntstool and using narx for creating the network. After running the network adjusted dividerand into divideblock and run the script again. The network gave good validation and testing results. This is the code that came with it:

**% input - input time series.
output - feedback time series.**

inputSeries = tonndata(input,false,false);

targetSeries = tonndata(output,false,false);

**% Create a Nonlinear Autoregressive Network with External Input**

inputDelays = 1:3;

feedbackDelays = 1:3;

hiddenLayerSize = 15;

net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize);

**% Choose Input and Feedback Pre/Post-Processing Functions**

net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};

net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'};

**% Prepare the Data for Training and Simulation**

[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries);

**% Setup Division of Data for Training, Validation, Testing**

net.divideFcn = 'divideblock';

net.divideMode = 'value';

net.divideParam.trainRatio = 70/100;

net.divideParam.valRatio = 15/100;

net.divideParam.testRatio = 15/100;

**% Choose a Training Function**

net.trainFcn = 'trainlm';

**% Choose a Performance Function**

net.performFcn = 'mse';

**% Choose Plot Functions**

net.plotFcns = {'plotperform','plottrainstate','plotresponse', ... 'ploterrcorr', 'plotinerrcorr'};

**% 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)

**% Recalculate Training, Validation and Test Performance**

trainTargets = gmultiply(targets,tr.trainMask);

valTargets = gmultiply(targets,tr.valMask);

testTargets = gmultiply(targets,tr.testMask);

trainPerformance = perform(net,trainTargets,outputs)

valPerformance = perform(net,valTargets,outputs)

testPerformance = perform(net,testTargets,outputs)

**% View the Network**

view(net)

**% Closed Loop Network**

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**

nets = removedelay(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)

Now with this code I was ready for simulation. I took a sample row of the input dataset (24x1) and use the sim function to simulate the target:

adjusted_rowsample = mapminmax(rowsample);

simulate = tonndata(adjusted_rowsample,false,false);

samplerow_result = **sim(netc,simulate)**.

The result wasnt even close to the target output as it was used in the network. Also when simulate new target value with new input values (24x1) from the next day ( this has not been used for training,validation or testing) the result is no where near the target.

What did I do wrong? How can I get the right target result using sim function?

And why does using **sim(net,simulate)** give me the error 'Number of inputs does not match net.numInputs.'? Which one to use: net or netc?

Can someone answer these questions?(On forum or private). I would very much appreciate it.

*No products are associated with this question.*

Answer by Greg Heath on 19 Sep 2013

Accepted answer

1. Remove all unnecessary specification of defaults. If you don't know which are defaults, type your net = narxnet command without the semicolon and investigate the results

2. Add a RNG initialization statement

3. Apply your code to the MATLAB time-series data set that best represents your problem.

help nndatasets

4. If results are poor, run it a few more times to make sure it is not because of the random weight initialization.

5. Still bad? Post relevant code and error messages.

Hope this helps.

**Thank you for formally accepting my answers**

Greg

## 0 Comments