Implementing initial weights and significant feedback delays in a NARNET
Show older comments
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
Accepted Answer
More Answers (1)
Greg Heath
on 29 Apr 2015
%GEH1: a. NN series are rows b. Use UC for cells and LC for doubles
UC/LC: Upper and Lower Case x = cell2mat(X), t = cell2mat(T)
Don't use X for noise. n = rand(1,N);
PROBLEM: NNTOOLBOX based on ROW variables. XCORR appears to operate on columns.
[ Rnnp, nlags] = xcorr(n','coeff') % p for "prime'
[ Rttp, tlags ] = xcorr( t','coeff')
Rnn = Rnnp'; Rtt=Rttp';
absRnn is a ROW which is sorted using sort, NOT sortrow to obtain CL95
absRtt is a ROW which is thresholded to obtain the significant lags
The function FIND can be used to obtain the significant lags.
t Autocorrelation feedback lags are positive ( narnet, narxnet)
x/t Crosscorrelation input lags are nonnegative (timedelaynet, narxnet)
1. The best of multiple designs is chosen by tr.best_vperf !
2. The UNBIASED estimate of net performance on unseen data is obtained from the value of tr.best_tperf obtained from the net chosen in 1.
% I don’t understand the reasoning here: if the unbiased estimate of net performance is acquired from tr.best_tperf, why not chose the best of multiple designs directly from that parameter instead of tr.best_vperf?
If the best net is chosen based on tperf, then the estimate for unseen data is biased.
To choose nets for deployment. I typically
1. Choose all nets with nontraining val and test performance exceeding a threshold.
2. Choose the ones with the smallest number of hidden nodes.
3. If the val and test performances are significantly worse than the training performance,
continue training with ALL of the data using dividetrain.
Hope this helps.
Greg
4 Comments
Peta
on 29 Apr 2015
Greg Heath
on 30 Apr 2015
>I think I got the significant lags to work now, I looped though all of them .. you say you try a “subset” of the lags, ... you don’t loop though them all? And in that case is there any sophisticated way of knowing which to try or do you simply skip say 2 out of 3 in the loop?
N = ? number of sig lags = ? Explain "loop through".
I just take the first m siglags and try to minimize m. Notice that even if the siglags are not consecutive, (e.g, [ 2 4 6] ) the length of the lag buffer only depends on the maximum lag.
> I’m now trying to inplement a code that can try a variation of Different number of hidden nodes and random weights. ... this is ...my understanding so far: hMax=5; %Number of different hidden nodes that will be tested Ntrials=10 %Number of different loops with random weights that will be tested
I try to minimize H subject to the constraints
H is in Hmin:dH:Hmax <= Hub (Ntrneq >= Nw)
MSEgoal = 0.01*Ndof*MSE00a/Ntrneq % R2trna >= 0.99
MinGrad = MSEgoal/100
If Hmax is large, Hmin and dH are not necessarily 1
rng('default')% Initialize the rng to your favorite state before the outer loop
s(i,j) = rng % Store the states of the rng inside the inner loop. Then the 100-200 candidate nets and/or their thousands of weights don't have to be stored
The reverse of getwb is setwb ... but you could have found that out from the help or doc documentation (;>})
Hope this helps.
Greg
Peta
on 30 Apr 2015
Greg Heath
on 1 May 2015
Edited: Greg Heath
on 1 May 2015
1. Incorrect. use
Siglags(1:m).
1:Siglags(m) can include intermediate lags that are not significant.
2. I choose m by nonsystematic trial and error.
3. Again, to avoid overfitting, I try to minimize m.
4. Did it ever occur to you to search in NEWSGROUP or ANSWERS using
greg Hub
Greg
Categories
Find more on Parallel and Cloud 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!