Hi. I’m trying to understand the concepts behind finding training strategies for NARNETs that can make as good predictions as possible. What I want to create is a script that I can feed any time series to, regardless of how it looks, and then find the best training design for it. This is the code I have at the moment:
T = simplenar_dataset; %example time series
N = length(T); % length of time series
MaxHidden=10; %number of hidden nodes that will be tested
%Attempt to determine Significant feedback delays with Autocorrelation
autocorrT = nncorr(zscore(cell2mat(T),1),zscore(cell2mat(T),1),N-1);[ sigacorr inda ] = find(abs(autocorrT(N+1:end) > 0.21))for hidden=1:MaxHidden parfor feedbackdelays=1:length(inda)FD=inda(feedbackdelays);net = narnet( 1:FD, hidden );[ Xs, Xsi, Asi, Ts ] = preparets( net, {}, {}, T );ts = cell2mat( Ts );net.divideFcn ='divideblock'; %Divides the data using divide block
net.trainParam.min_grad=1e-15;net.trainParam.epochs=10000;rng( 'default' )[ net tr Ys Es Af Xf ] = train( net, Xs, Ts, Xsi, Asi);NMSEs = mse( Es ) /var( ts,1 )% Mean squared error performance function
performanceDivideBlockNMSEs(hidden,feedbackdelays)=NMSEs; end end
First off: Is this the correct way of implementing the statistically significant feedback delays?
And if the “net.divideFcn ='divideblock'” line is left uncommented as in the code now I get an error message in the loop saying “Attempted to access valInd(0); index must be a positive integer or logical.” which I’m not sure what is causing.
And I’ve heard people say that you should “try different initial weights”, how do I do that, is it the rng command I need to change?
The idea here is then that I find the address of the best performing net in the performanceDivideBlockNMSEs matrix so I can retrain a closed net with those settings and make predictions, but for now I’m just focusing on the open net.
Thanks
Best Answer