NN-Toolbox: NARX multi-step prediction - Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Fachkräfte:
Informatiker (m/w) für den Bereich Toolkette Embedded Software
Weiterentwicklung einer MATLAB-/Simulink-Toolkette, Automatisierung der Code-Generierung mit TargetLink und Embedded Coder
cbb-Software GmbH - Stuttgart

Softwareentwickler (m/w) automatische Codegenerierung
Umsetzung, Neuprogrammierung und Weiterentwicklung in Simulink, TargetLink und C
EFS - Ingolstadt, Wolfsburg

Ingenieur (w/m) Qualitätssicherung im Use Case Test
Erstellung und Erweiterung von Kundenszenarien aus dem Bereich des Tests und der Entwicklung von Steuergeräten
dSPACE GmbH - Paderborn

Entwicklungsingenieur (m/w) HiL Modellierung Automotive mit Expertenfunktion
Konzipierung und Entwicklung von komplexen Simulationsmodellen
Bertrandt Technikum GmbH - Ehningen bei Stuttgart

Entwickler Fahrerassistenzsysteme / Fahrzeugnahe Funktionsentwicklung (m/w)
Entwicklung von Funktionen für assistiertes und pilotiertes Fahren
Knorr-Bremse Systeme für Nutzfahrzeuge GmbH - Schwieberdingen bei Stuttgart

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

NN-Toolbox: NARX multi-step prediction

 

uagka
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.12.16
Wohnort: Wo Carl ruhte
Version: ab R2016b
     Beitrag Verfasst am: 14.03.2017, 15:09     Titel: NN-Toolbox: NARX multi-step prediction
  Antworten mit Zitat      
Hallo zusammen,

ich möchte Vorhersagen für Zeitreihen mit NARX Netzen durchführen (2 Inputs, 1 Output). Konkret handelt es sich beim Output um Grundwasserstände.

Mein Workflow sieht folgendermaßen aus:

Start: Datenimport/Preprocessing etc. ...dann folgt folgender Code (einige Teile habe ich jetzt mal gekürzt)

Code:

%% openloop NARX

x1 = tonndata(X_scaled,false,false); %open loop input
t1 = tonndata(Y_scaled,false,false); %open loop target

x2 = tonndata(DWDinput_scaled,false,false); %closed loop input


% Training Function
trainFcn = 'trainlm';  % default: LM


% Create a Nonlinear Autoregressive Network with External Input

%for loop to find best hidden layer size:

for j =  HL_size_min:Hidden_nodes
   
   
hiddenLayerSize = j;

net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize,'open',trainFcn);
net.trainParam.max_fail=25; % max validation failures

% Prepare the Data for Training and Simulation (data is shifted to fill up
% tapped delay line)
[x,xi,ai,t] = preparets(net,x1,{},t1);
 

% Setup Division of Data for Training, Validation, Testing
net.divideFcn = 'divideblock';  % Divide data blockwise
net.divideMode = 'time';  % for dynamic networks
net.divideParam.trainRatio = 80/100;
net.divideParam.valRatio = 10/100;
net.divideParam.testRatio = 10/100;

% Choose a Performance Function
net.performFcn = 'mse';  % Mean Squared Error (default)

% Choose Plot Functions
% For a list of all plot functions type: help nnplot
net.plotFcns = {'plotperform','plottrainstate', 'ploterrhist', ...
    'plotregression', 'plotresponse', 'ploterrcorr', 'plotinerrcorr'};

% Train the Network
[net,tr] = train(net,x,t,xi,ai);

% Test the Network
y = net(x,xi,ai);

%performance = perform(net,t,y)



% post processing

%[...]

% Plot training: target vs output

%[...]

%Performance measures

%[...]

%% Multi-step prediction, closed-loop NARX

[netc,xic,aic] = closeloop(net,xi,ai); %chang open to closed loop
[y2,~,~] = netc(x2,xic,aic); %simulate prediction input

% post processing

%[...]

%plot prediction

%[...]

% Performance measures (prediction)

%[...]


end

 


Mein Problem ist nun, dass die ersten Vorhersagewerte (closed loop) weit weg vom Zielwert liegen (siehe Grafik im Anhang). Für eine zunehmende Anzahl an Zeitschritten wird das meist besser.


Habe ich einen Fehler im Code? Ist das ein häufiges Problem? Oder muss das an meinen Daten und/oder sonstigen Parametern (Delays, Anzahl hidden nodes etc.) liegen?

Ich habe nun die Erfahrung gemacht, dass es manchmal hilft, wenn sich der Datensatz für die Vorhersage im closed loop um ein paar Zeitschritte mit den letzten Werten im open-loop "überlappt". Ich habe so versucht dem Netz "bekannte" Daten zu präsentieren um so den initialen Fehler bei der Vorhersage zu minimieren.
Dafür hatte ich aber noch "dividerand" statt "divideblock" verwendet, da bei letzterem der Testdatensatz ja nicht mehr für das Training verwendet wird und der gewünschte "Wiedererkennungseffekt" ausbleiben würde.

Ist sowas legitim oder war das keine besonders gute Idee?
Habt ihr ähnliche Erfahrungen gemacht und vielleicht sogar schon Lösungen gefunden?


Vielen Dank für Ideen und Anregungen.

Viele Grüße

uagka


PS: Falls mir jemand noch die Plots: "Error-Autocorrelation" und "Input-Error Cross-Correlation" (aufzufinden im nntraintool wenn ein narxnet trainiert wird) und was man wie genau daraus ablesen kann erklären könnte wäre das super. Ich bin mir nicht sicher ob ich das schon richtig verstanden habe. 

Narx prediction.jpg
 Beschreibung:

Download
 Dateiname:  Narx prediction.jpg
 Dateigröße:  56.61 KB
 Heruntergeladen:  152 mal
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 214
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 15.03.2017, 02:57     Titel:
  Antworten mit Zitat      
Hallo uagka,

ich hatte vor Ewigkeiten das gleiche Problem; ich wollte damals die Bewegung eines mechanischen Systems vorhersagen. Letztlich habe ich das Problem gelöst, indem ich die closeloop-Funktion über Bord geworfen und selber realisiert hab. Du bruachst dazu eigentlich nur eine Schleife, in der du den Ausgang deines Netzes als neuen Eingang definierst. Als ersten Eingang wählst du den letzten Punkt in deinen Trainingsdaten. Gruß 
Private Nachricht senden Benutzer-Profile anzeigen
 
uagka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.12.16
Wohnort: Wo Carl ruhte
Version: ab R2016b
     Beitrag Verfasst am: 15.03.2017, 09:02     Titel:
  Antworten mit Zitat      
Hallo Friidayy,

auf jeden Fall ein interessanter Vorschlag!
Verstehe ich das richtig, dass quasi immer nur "one step ahead" vorhergesagt wird und der entsprechende output dann über eine manuell eingefügte for-schleife für die vorhersage des nächsten Schrittes genutzt wird? Für beispielsweise 10 Vorhersageschritte würde auch 10 mal das Netz simuliert werden?

Wie geht man in dem Fall mit den Delays um? Das reicht bei einem Delay > 1 ja nicht um die tapped delay line zu durchlaufen?

Viele Grüße

uagka 
Private Nachricht senden Benutzer-Profile anzeigen
 
Friidayy
Forum-Century

Forum-Century


Beiträge: 214
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 15.03.2017, 10:41     Titel:
  Antworten mit Zitat      
uagka hat Folgendes geschrieben:

Verstehe ich das richtig, dass quasi immer nur "one step ahead" vorhergesagt wird und der entsprechende output dann über eine manuell eingefügte for-schleife für die vorhersage des nächsten Schrittes genutzt wird? Für beispielsweise 10 Vorhersageschritte würde auch 10 mal das Netz simuliert werden?

Richtig

uagka hat Folgendes geschrieben:

Wie geht man in dem Fall mit den Delays um? Das reicht bei einem Delay > 1 ja nicht um die tapped delay line zu durchlaufen?

Da kann ich leider nichts zu sagen, ich hatte damals ein einfaches FeedForward Netz ohne Rückkopplungen; würde einfach mal ein paar KonfigurationenSzenarien ausprobieren. Falls du eine Lösung gefunden hast, lass es mich wissen, würde mich sehr interessieren Wink Gruß 
Private Nachricht senden Benutzer-Profile anzeigen
 
uagka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.12.16
Wohnort: Wo Carl ruhte
Version: ab R2016b
     Beitrag Verfasst am: 21.03.2017, 15:49     Titel:
  Antworten mit Zitat      
So jetzt hat sich doch noch eine Lösung gefunden.

Im obigen Code muss stehen:

Code:

% Test the Network
[y,xf,af] = net(x,xi,ai);
 


und weiter unten dann:
Code:

%% Multi-step prediction, closed-loop NARX

[netc,xic,aic] = closeloop(net,xf,af);
 


Dann funktionierts. Hinweis darauf findet sich auf der Seite:
http://de.mathworks.com/help/nnet/u.....l-network-prediction.html

Die hatte ich zwar gefühlt schon hundert Mal gelesen, aber jetzt hab ich den Fehler dann doch endlich mal gefunden.

Ich hoffe das hilft auch anderen weiter. 
Private Nachricht senden Benutzer-Profile anzeigen
 
RüdigerHunsrück
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.12.17
Wohnort: Köln
Version: ---
     Beitrag Verfasst am: 08.12.2017, 14:45     Titel:
  Antworten mit Zitat      
Hallo uagka,

ich werde demnächst meine Masterarbeit beginnen. Die Aufgabe hierbei ist, mit Hilfe von künstlichen Neuronalen Netzen eine Hochwasservorhersage für ein Gewässer zu erstellen.
Ich glaube für meinen Anwendungsfall benötige ich einen ähnlichen Aufbau wie bei deinem Neuronalen Netz für die Grundwsserstände.
Ist es möglich, dass du mir ein bisschen genauer erklärst was du genau gemacht hast?
Zum Training des Netzes habe ich verschiedene Daten von Niederschlagsmessungen im Einzugsgebiet aus den letzten 15 Jahren zur Verfügung. Diese sollen als Netzinput dienen. Des Weiteren habe ich gemessene Wasserstände an einem Pegel für den die Vorhersage erstellt werden soll.

Ich habe bisher noch nicht mit MATLAB gearbeitet, habe aber in den letzten drei Wochen den Grundlagenkurs von Mathworks sowie den Kurs für Neuronale Netze bearbeitet. Leider ist mir immer noch nicht so richtig klar, wie ich das beschriebene Problem angehen soll.

Meine Fragen bisher:

1.) Welcher Netzwerktyp ist für diesen Fall am besten geeignet? Nach meinen bisherigen Recherchen würde ich zu einem Multylayer-Feedforward Netzwerk tendieren.

2.) Ist es möglich, mehrere verschiedene Niederschlagsmessungen als Input einzugeben, die dann aber nur in einem Output als Wasserstand resultieren?

3.) Wie kann der unterschiedliche zeitliche Versatz zwischen den verschiedenen Niederschlagsstationen und dem Pegel realisiert werden? Oder wird das automatisch durch das Neuronale Netz realisiert?

Ich hoffe du kannst mir ein paar hilfreiche Tipps geben. Gerne auch zu Tutorials oder ähnlichem, die über die von MATLAB zur Verfügung gestellten Lernmaterialien hinausgehen.

Viele Grüße
Georg 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.