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

Warning: Gradient must be provided for trust-region method

 

robert_12
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 14.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2008, 15:44     Titel: Warning: Gradient must be provided for trust-region method
  Antworten mit Zitat      
Hallo!

beim Versuch, mit dem Befehl "fminunc" eine negative Log-Likelihood-Funktion zu minimieren, kommt folgende Fehlermeldung:

Code:
>> fminunc(nLogLik,[1 1])
Warning: Gradient must be provided for trust-region method;
using line-search method instead.[...]


mit "fminsearch" klappt die Minimierung hingegen einwandfrei:
Code:
>>fminsearch(nLogLik,[1 1])
ans =  0.0049    0.0084


die nLogLik lautet übrigens:
Code:
nLogLik = @(p) -sum(log(normpdf(X,mu(p),sigma(p))))


Was geht bei "fminunc" schief? Ich nehme an, dass der Gradient der Funktion noch mit angegeben werden muss... wie programmiert man das?

Vielen Dank für eure Hilfe!

MfG Robert.

P.S.: Der eigentliche Grund, warum ich "fminunc" statt "fminsearch" verwenden will ist, dass ich die Hesse-Matrix der Funktion benötige, welche matlab meines Wissens nach bei "fminsearch" nicht mit ausgibt. Gibt es sonst noch andere Möglichkeiten, die Hesse-Matrix der Funktion zu erhalten?
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 24.04.2008, 16:41     Titel:
  Antworten mit Zitat      
Hallo Robert,

Du hast recht, die Warnung bedeutet, dass für ein Trust-Region-Verfahren der Gradient angegeben werden muss. Allerdings sind die TRV für große Optimierungsverfahren gedacht (>1000 Variablen, oder viele Nebenbedingungen), während es für die kleinen die Line-Search-Methoden gibt. Das heißt, die Warnung kann ignoriert werden! Ausschalten kann man sie so:

Code:
OptimierungsOptionen = optimset('LargeScale','Off');
fminunc(nLogLik,[1 1],Optimierungsoptionen)


Deine nächste Frage war die, wie der Gradient angegeben wird. Ich nehme mal an, dass Du weißt, wie er berechnet wird. Dann geht es so: Man schreibt statt einer anonymen Funktion

Code:
nLogLik = @(p) -sum(log(normpdf(X,mu(p),sigma(p))))


eine normale
Code:
function [fun,grad] = nLogLik(p)

fun = -sum(log(normpdf(X,mu(p),sigma(p))));
if nargin > 1
    grad = ...
end


Speichern unter nLogLik.m . Bei grad dann eben den Gradienten reinschreiben. fminunc wertet ihn dann an den entsprechenden Stellen aus. Übrigens: Auch beim Line-Search-Verfahren kann es vorteilhaft sein, den Gradienten selbst zu berechnen.

Zu Deinem PS: Du meinst die Hessematrix allgemein, oder die bei der Lösung? fminunc gibt die Hessematrix bei der Lösung aus, im Allgemeinen berechnet durch finite Differenzen. Wenn Du allerdings den Gradienten analytisch berechnen kannst, ist es eventuell nur ein kleiner Schritt, auch die Hessematrix, also die Matrix der zweiten Ableitungen auszurechnen: Jeder Eintrag des Gradienten muss nach jeder Variablen abgeleitet werden.


Herzliche Grüße
Bijick

PS: Findet fminunc denn eine Minimallösung? Dieselbe wie fminsearch? Nur so aus Neugierde.
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
robert_12
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 14.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2008, 18:29     Titel:
  Antworten mit Zitat      
Danke für die Tipps, Bijick.

Den Gradienten und Hesse-Matrix könnte ich zwar prinzipiell manuell eingeben, möchte dies aber eigentlich vermeiden. Ich brauche nur die Hesse-Matrix der Lösung, also die Werte nach der Minimierung. Die beiden minimalen Parameter-Werte liefert mir ja fminsearch. An die Hesse-Matrix komme ich aber nur durch fminunc, oder?

Wenn ich, wie du geschrieben hast 'LargeScale' auf 'off' setze, kommt nun folgende Fehlermeldung:

Code:
>> fminunc(nLogLik, [1 1])
??? Error using ==> roots at 28
Input to ROOTS must not contain NaN or Inf.
[...]

(Die Meldung kommt auch bei anderen Startwerten...)

Wo liegt hier der Fehler?? Was muss ich noch eingeben, um an die minimalen Parameterwerte (inkl. Hesse-Matrix) zu kommen?

Habe die Funktionen 'nLogLik (p)', 'mu (p)' und 'sigma (p)' und zugehörige Datenvektoren bisher als anonyme Funktionen im Workspace abgespeichert. ist es sinnvoller einen kompletten m-file zu schreiben? habe es bisher nicht versucht, da ich gerade erst mit matlab angefangen habe...

Gruß Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 25.04.2008, 10:19     Titel:
  Antworten mit Zitat      
Hallo Robert,

an die Minimalwerte und die Hessematrix kommst Du so:

Code:

[x,fval,exitflag,output,grad,hessian] = fminunc(...)
 


x enthält die zwei Parameter (eigentlich Variablen, Parameter der Optimierung sind etwas anderes) und hessian die Hessematrix bei x. Gleichzeitig bekommt man noch die anderen Informationen fval, grad etc., die Dich aber ertstmal nicht stören müssen.

Über die Sinnhaftigkeit von m-files kann man diskutieren, aber ich sehe als großen Vorteil, dass man sie nicht jeden Tag neu definieren muss, sondern gleich richtig loslegen kann. Ich kann verstehen, dass man sich als Anfänger auf das Command Window verlässt, habe ich auch gemacht, aber inzwischen finde ich m-files auch übersichtlicher. Ist in Deinem Fall noch Geschmackssache. Je größer das Programm wird, desto interessanter werden die m-files und Funktionen.

Jetzt zur Fehlermeldung: Da fehlt mir noch die Angabe, in welcher Funktion der Fehler auftritt. In fminunc kommt kein roots vor, daher ist es wahrscheinlich, dass es in Deiner Zielfunktion steckt. Die Fehlermeldung besagt: roots soll auf etwas Unendliches (Inf) oder nicht Definiertes (NaN) angewendet werden. Das geht natürlich nicht. Der Fehler steckt also in dem Vektor, der an roots übergeben wird, bzw. in dessen Berechnung. Wenn Du den Fehler nicht selbst findest, poste doch mal den Code hier.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
robert_12
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 14.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2008, 10:46     Titel:
  Antworten mit Zitat      
Danke Bijick,

also die Funktion, die ich minimieren will ist eine negative Log-Likelihood:
Code:
nLogLik = @ (p) -sum(log(normpdf(R,Ewert(p),sqrt(Varianz(p)))))


mit Erwarungswert und Varianz:
Code:
Ewert = @ (p) Xt.*exp(-p(1).*t)
Varianz = @ (p) (p(2)^2/(2*p(1))).*(1-exp(-2*p(1).*t))


R, Xt und t sind jeweils (821x1)-Datenvektoren.

Ich benötige also die minimalen Parameterwerte p(1) und p(2).
Wenn ich nun nLogLik mit fminsearch minimiere, kommt das Ergebnis:
Code:
>> fminsearch(nLogLik, [1 1])
ans = 0.0049    0.0084


wenn ich allerdings fminunc verwende (nachdem LargeScale ausgeschaltet wurde):
Code:
options=optimset('LargeScale', 'off')

>> fminunc(nLogLik, [1 1], options)
??? Error using ==> roots at 28
Input to ROOTS must not contain NaN or Inf.

Error in ==> lineSearch>globalMinimizerOfPolyInInterval at 315
stationaryPoint = roots([3*coeff(1) 2*coeff(2) coeff(3)]);

Error in ==> lineSearch>pickAlphaWithinInterval at 290
z = globalMinimizerOfPolyInInterval(zlb,zub,coeff);

Error in ==> lineSearch>sectioningPhase at 203
    alpha = pickAlphaWithinInterval(brcktEndpntA,brcktEndpntB,a,b,f_a,fPrime_a,f_b,fPrime_b);

Error in ==> lineSearch at 62
    [alpha,f_alpha,fPrime_alpha,grad,exitflag,funcCount] = sectioningPhase(funfcn, ...

Error in ==> fminusub at 219
    [alpha,f,gPlusTimesDir,grad,exitflagLnSrch,funcCountLnSrch] = ...

Error in ==> fminunc at 285
   [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x,verbosity, ...


das gleiche kommt natürlich auch wenn ich
Code:
[x,fval,exitflag,output,grad,hessian] = fminunc(nLogLik, [1 1],options)
eingebe.

auch andere startwerte helfen nicht weiter, denn:
Code:
>> [x,fval,exitflag,output,grad,hessian] = fminunc(nLogLik, [0.001 0.001],options);
Maximum number of function evaluations exceeded;
 increase options.MaxFunEvals
Computing finite-difference Hessian using user-supplied objective function.


siehst du den fehler??

Gruß, Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.04.2008, 16:01     Titel:
  Antworten mit Zitat      
Hallo Robert,

vielen Dank für die erweiterte Fehlermeldung. Da ist also doch fminunc der Bösewicht und verwendet die roots-Funktion. Der Abbruch dürfte eigentlich gar nicht passieren, wenn der Startwert halbwegs sinnvoll ist (was ich nicht beurteilen kann). Hier hilft tatsächlich erstmal nur Startwerte variieren.

Die zweite Fehlermeldung ist dagegen unproblematisch. "Maximum number of function evaluations exceeded; increase options.MaxFunEvals " -> Machen wir das doch einfach:

Code:
OptimierungsOptionen = optimset('LargeScale','Off','MaxFunEvals',1000);


Der Default-Wert ist 100* Anzahl der Variablen, also hier 200, was offensichtlich nicht reicht. Man könnte auch die Toleranzen gröber einstellen, dann reichen die 200 vielleicht:

Code:
OptimierungsOptionen = optimset('LargeScale','Off','TolFun',1e-2,'TolX',1e-4);


Das kommt darauf an, wie genau das Ergebnis sein muss.

Jedenfalls sollten trotz dieser Meldung x und fval und hessian als Variablen im Workspace sein und die Werte enthalten, bei denen die Optimierung abgebrochen wurde. Vielleicht sind sie ja auch, so wie sie sind, gut genug?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.