Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Softwareentwickler (m/w) für automatische Codegenerierung
Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink im Bereich Fahrwerkregelsysteme
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Entwicklungsingenieur (m/w) für modellbasierte Softwareentwicklung
Modellbasierte Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Softwareentwickler (w/m) Bypassing- und Steuergeräte-Schnittstellen
Entwicklung von Echtzeit-Software für verschiedene automotive Microcontroller
dSPACE GmbH - Paderborn

Test- und Erprobungsingenieur (m/w)
Erstellung von Testspezifikationen (z. B. in Doors) für Kundenfunktionen
Automotive Safety Technologies GmbH - Ingolstadt

Elektromobilität: E-Drive Entwicklungsingenieur HV-Energiemanagement und Betriebsstrategie (m/w)
Entwicklung von Teilfunktionen für Energiebordnetze
MBtech Group GmbH & Co. KGaA - Sindelfingen

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, 14: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:  74 mal
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 176
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 15.03.2017, 01: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, 08: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: 176
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 15.03.2017, 09: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, 14: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
 
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 - 2017 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.