WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Plot fminunc, lsqnonlin

 

Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2016, 10:57     Titel: Plot fminunc, lsqnonlin
  Antworten mit Zitat      
Hallo zusammen,

ich möchte gerne während der Optimierung einen Plot generieren, der die Konvergenzkurve abbildet. Ich verwende fminunc, lsqnonlin als Optimierer. Ich habe hierzu schon versucht eine output function zu generieren (siehe http://de.mathworks.com/help/optim/ug/output-functions.html ) aber da mein matlab nicht die history function beinhaltet, lief das leider ins Leere.
Kann ich irgendwie anders auf die Werte der Optimierung parallel zugreifen?

Vielen Dank Romanov


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2016, 12:35     Titel:
  Antworten mit Zitat      
Hallo,

du brauchst keine history-Funktion dafür.
history ist eine Variable, die geeignet initialisiert werden muss, siehe der Abschnitt
"Writing the Example Function File" auf der von dir verlinkten Seite.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2016, 13:29     Titel:
  Antworten mit Zitat      
Hallo,
danke, du hattest recht.

Leider ist es aber nun so, dass der plot sich nicht aktualisiert, während er iteriert.
Er plottet lediglich sichtbar das letzte plot.

Hier ist mein code:

Code:
function [opt_hyp] = runfmincon(x0,hyp_optfun,iteration)
 
% Set up shared variables with OUTFUN
historie.fval = [];
 
% call optimization
options = optimoptions(@fminunc,'OutputFcn',@outfun,'Display','iter','Algorithm','quasi-newton','MaxIterations',iteration);
opt_hyp = fmincon(hyp_optfun,x0,[],[],[],[],[],[],[],options);

function stop = outfun(~,optimValues,state)
 stop = false;

 switch state
     case 'init'
         hold on
     case 'iter'
       historie.fval = [historie.fval; optimValues.fval];
       plot(1:size(historie.fval),historie.fval,'--');
       title('Convergence Minimization Negative Marginal Likelihood');
     case 'done'
         hold off
     otherwise
 end
end
 
end
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2016, 13:55     Titel:
  Antworten mit Zitat      
Hallo,

drawnow nach dem plot-Befehl einfügen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2016, 13:56     Titel:
  Antworten mit Zitat      
Außerdem funktioniert dies nicht für lsqnonlin.
Hier hat optimValues keinen fval-Wert.

Hier mein Code:

Code:
function [opt_hyp] = runfmincon(x0,hyp_optfun,iteration,minimizer)
 
historie_fval = [];
 
% call optimization
if strcmp(minimizer,'marquardt')
    options = optimoptions('lsqnonlin','Display','iter','Algorithm','levenberg-marquardt','MaxIterations',iteration,'OutputFcn',@outfun);
    opt_hyp = lsqnonlin(hyp_optfun,x0,[],[],options);
elseif strcmp(minimizer,'quasi')
    options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton','MaxIterations',iteration,'OutputFcn',@outfun);
    opt_hyp = fminunc(hyp_optfun,x0,options);
end%if

function stop = outfun(~,optimValues,state)
 stop = false;

 switch state
     case 'init'
         hold on
     case 'iter'
       historie_fval = [historie_fval; optimValues.fval];
       plot(1:size(historie_fval),historie_fval,'--');
       title('Convergence Minimization Negative Marginal Likelihood');
     case 'done'
         hold off
     otherwise
 end
end
 
end
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2016, 14:28     Titel:
  Antworten mit Zitat      
Hallo,

... und wie rufst du diese Funktion auf?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2016, 15:26     Titel:
  Antworten mit Zitat      
Hmm, hier bin ich mir nicht sicher, wie ich was verbessern kann, dass es funktioniert. Ich habe den Aufruf seither so verwendet und es hat funktioniert, also das optimieren.
Kannst du mir das näher erklären?
Danke

Romanov
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2016, 17:30     Titel:
  Antworten mit Zitat      
Hallo,

du könntest zunächst die Rückfrage beantworten. Du hast eine Funktion mit Eingabeargumenten x0, hyp_optfun etc. Damit man das Problem reproduzieren kann, müsstest du sagen, was diese Argumente sind - also, wie du die Funktion aufrufst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2016, 17:42     Titel:
  Antworten mit Zitat      
Hallo,

aufrufen tue ich sie mit:

Code:
opt_hyp = runfmincon(x0,hyp_optfun,iteration,minimizer);


dabei ist x0 der Startwert der Optimierung und hyp_optfun die Funktion die es zu optimieren gilt.

Ich kann dir nicht die exakten Vorgaben geben, da dies ein Problem ist, das zu komplex ist (Maximierung des Marginal Likelihood eines beliebigen Gaussprozesses mit nichtlinearem Kern). Aber man könnte eine konvexe Funktion wie hyp_optfun = @(x) x^2 nehmen mit dem Startwert x0 = -5, denke ich.

Vielleicht hilft dir auch der Matlab Eintrag von lsqnonlin:

http://de.mathworks.com/help/optim/ug/lsqnonlin.html

Dort ist die Ausgabe beispielhaft abgebildet und es taucht auch kein fval darin auf:

Code:

Examine the output structure to obtain more information about the solution process.

output

output =

    firstorderopt: 0.0114
       iterations: 28
        funcCount: 87
     cgiterations: 0
        algorithm: 'trust-region-reflective'
         stepsize: 4.6226e-04
          message: 'Local minimum possible....'




Grüße Romanov
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2016, 20:16     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
dabei ist x0 der Startwert der Optimierung und hyp_optfun die Funktion die es zu optimieren gilt.

Ach nee... ich will nicht die Bedeutung von x0 etc. wissen, sondern welche Werte diese bei dir annehmen.

Zitat:
Aber man könnte eine konvexe Funktion wie hyp_optfun = @(x) x^2 nehmen mit dem Startwert x0 = -5, denke ich.

Dann fehlen ja nur noch iteration und minimizer, aber ich kann natürlich auch raten.

Zitat:
und es taucht auch kein fval darin auf

Und was sollen wir hier nun tun? Das fval herbeizaubern?

Gibt es eigentlich einen Grund, warum du für den iterativen Output nicht die Plot Functions verwendest?
http://de.mathworks.com/help/optim/ug/plot-functions_br5474z.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2016, 22:53     Titel:
  Antworten mit Zitat      
Erst einmal Danke bis hierher für deine Hilfe.

Tut mir Leid wenn der Ton jetzt auch bei mir etwas rauer wird, aber du wirst das sicher verstehen..:

Nunja, ein bisschen Code lesen und verstehen kann ich doch erwarten...

Wie ich schon gepostet habe, als ich mich auf das Nichtfunktionieren von lsqnonlin bezog, und nun noch einmal:

Code:
function [opt_hyp] = runfmincon(x0,hyp_optfun,iteration,minimizer)
 
historie_fval = [];
 
% call optimization
if strcmp(minimizer,'marquardt')
    options = optimoptions('lsqnonlin','Display','iter','Algorithm','levenberg-marquardt','MaxIterations',iteration,'OutputFcn',@outfun);
    opt_hyp = lsqnonlin(hyp_optfun,x0,[],[],options);
elseif strcmp(minimizer,'quasi')
    options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton','MaxIterations',iteration,'OutputFcn',@outfun);
    opt_hyp = fminunc(hyp_optfun,x0,options);
end%if

function stop = outfun(~,optimValues,state)
 stop = false;

 switch state
     case 'init'
         hold on
     case 'iter'
       historie_fval = [historie_fval; optimValues.fval];
       plot(1:size(historie_fval),historie_fval,'--');
       title('Convergence Minimization Negative Marginal Likelihood');
     case 'done'
         hold off
     otherwise
 end
end
 
end


Dort ist zu erkennen, dass iteration die maximale Anzahl der Iterationen ist, ablesbar an der option in optimoptions und dort ist auch der minimizer mehr als deutlich zu sehen, aber auch schon durch die if bedingung zu erkennen (wie gesagt bezog ich mich auf die funktion lsqnonlin)...

Zitat:
ich will nicht die Bedeutung von x0 etc. wissen, sondern welche Werte diese bei dir annehmen.


Was willst du hier von mir? Soll ich dir die konkreten Zahlen nennen? Das geht leider nicht, da es sich um je nach Art der Daten die ich bei einer Gauß Prozess Modellierung verwende diese sich stark voneinander unterscheiden. Es handelt sich hierbei wie gesagt um den Startwert. Dieser reicht von einer skalaren Größe bis hin zu einem Vektor der Größe 100 oder 1000. Es sind reelle Einträge.

Zitat:
Gibt es eigentlich einen Grund, warum du für den iterativen Output nicht die Plot Functions verwendest?


Nein gibt es nicht, höchstens den, dass ich das noch nicht kannte und ich deswegen hier in diesem Forum danach frage, ich glaube das kommt vor in diesem Forum..
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.452
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.08.2016, 09:21     Titel:
  Antworten mit Zitat      
Hallo,

selbstverständlich ist es der Sinn des Forums, Fragen zu stellen.
Wenn in der Frage alle benötigten Informationen zur Verfügung gestellt werden (wie in deinen ersten beiden Fragen), dann kann man meist schnell und effizient antworten.
Falls nicht, gibt es entsprechende Rückfragen, die leider manchmal nicht oder unzureichend beantwortet werden. Alles kein Problem. Wenn ich aber das Gefühl habe, dass man mich verarschen möchte, reagiere ich auch entsprechend. Sollte der Beitrag von 17:42 tatsächlich ernsthaft und konstruktiv gemeint gewesen sein, bitte ich die Reaktion zu entschuldigen.

Zitat:
Nunja, ein bisschen Code lesen und verstehen kann ich doch erwarten...

Das ja, hellsehen nein - und ich weiß nun genau genommen immer noch nicht, mit welchen Eingabeargumenten (und gemeint sind deren Werte) du die Funktion runfmincon aufrufst.
Natürlich kann ich versuchen, ein Beispiel zu finden, das das Problem reproduziert. Allerdings kann letztlich nur der Fragesteller beurteilen, ob ein Beispiel seine Probleme reproduziert. Daher ist es üblich, dass der Fragesteller ein entsprechendes Beispiel bereitstellt.

Der output am Ende der Optimierung enthält nicht dieselben Informationen wie der in der OutputFcn. Um die verfügbaren Informationen in der OutputFcn zu sehen, kann man einen Haltepunkt setzen.

Vorschläge also nun:
- Plot Functions versuchen.
- Falls diese nicht weiterhelfen, bei lsqnonlin die Felder residual oder resNorm von optimValues verwenden. Einen Funktionswert in dem Sinn gibt es bei Least Squares-Solvern nun einmal nicht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Romanov

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2016, 10:24     Titel:
  Antworten mit Zitat      
Hallo,

Danke für deine Antwort.
Ich werde das residual als Konvergenz-Wert nehmen.

Grüße Romanov
 
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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.