2013-02-02 3 views
1

J'ai créé un réseau de neurones pour modéliser une certaine relation d'entrée-sortie (simple). Quand je regarde le graphique des réponses de séries temporelles en utilisant le gui de nntrain les prédictions semblent tout à fait adéquates, cependant, quand j'essaie de faire une prédiction hors de l'échantillon, les résultats sont loin d'être modélisés. Je ai googlé ce problème largement et dérangé avec mon code en vain, j'apprécierais vraiment un petit aperçu de ce que je fais mal.Matlab: prévision à l'aide d'un réseau de neurones

J'ai inclus un exemple de travail minimal ci-dessous.

A = 1:1000; B = 10000*sin(A); C = A.^2 +B; 
Set = [A' B' C']; 
input = Set(:,1:end-1); 
target = Set(:,end); 
inputSeries = tonndata(input(1:700,:),false,false); 
targetSeries = tonndata(target(1:700,:),false,false); 

inputSeriesVal = tonndata(input(701:end,:),false,false); 
targetSeriesVal = tonndata(target(701:end,:),false,false); 

inputDelays = 1:2; 
feedbackDelays = 1:2; 
hiddenLayerSize = 5; 
net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize); 

[inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries); 
net.divideFcn = 'divideblock'; % Divide data in blocks 
net.divideMode = 'time'; % Divide up every value 

% Train the Network 
[net,tr] = train(net,inputs,targets,inputStates,layerStates); 
Y = net(inputs,inputStates,layerStates); 

% Prediction Attempt 
delay=length(inputDelays); N=300; 
inputSeriesPred = [inputSeries(end-delay+1:end),inputSeriesVal]; 
targetSeriesPred = [targetSeries(end-delay+1:end), con2seq(nan(1,N))]; 
netc = closeloop(net); 
[Xs,Xi,Ai,Ts] = preparets(netc,inputSeriesPred,{},targetSeriesPred); 
yPred = netc(Xs,Xi,Ai); 
perf = perform(net,yPred,targetSeriesVal); 

figure; 
plot([cell2mat(targetSeries),nan(1,N); 
     nan(1,length(targetSeries)),cell2mat(yPred); 
     nan(1,length(targetSeries)),cell2mat(targetSeriesVal)]') 
legend('Original Targets','Network Predictions','Expected Outputs') 
    end 

je réalise net NARX avec un retard de temps est probablement excessif pour ce type de problème, mais je l'intention d'utiliser cet exemple comme base pour un problème de séries chronologiques plus compliqué à l'avenir.

Sincères salutations, James

+0

Si vous avez des problèmes pour faire des prévisions hors échantillon, vous avez probablement été surimposé. C'est là que la validation croisée entre en jeu. –

Répondre

0

Les causes les plus probables de généralisation pauvres à partir des données de formation aux nouvelles données est que (1) il n'y avait pas de données de formation suffisante pour caractériser le problème, ou (2) le réseau de neurones a plus de neurones et de retards que nécessaire pour le problème, donc il est en train de surcharger les données (c'est-à-dire qu'il est facile de mémoriser les exemples au lieu d'avoir à comprendre comment ils sont liés)

Le correctif pour (1) est Le correctif de (2) consiste à réduire le nombre de retards de prise et/ou de neurones.Espérons que cela aide!

0

Je ne sais pas si vous avez déjà résolu le problème. Mais il y a au moins une solution de plus à votre problème.

Étant donné que vous traitez une série temporelle, il est préférable (au moins dans ce cas) de définir net.divideFcn = 'dividerand'. Le 'divideblock' n'utilisera la première partie de la série chronologique que pour la formation, ce qui peut entraîner une perte d'information sur les tendances à long terme.

Questions connexes