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?
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:
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
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.
_________________
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:
(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...
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.
>> [x,fval,exitflag,output,grad,hessian] = fminunc(nLogLik, [0.0010.001],options);
Maximum number of function evaluations exceeded;
increase options.MaxFunEvals
Computing finite-difference Hessian using user-supplied objective function.
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:
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:
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
Einstellungen und Berechtigungen
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
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.