Verfasst am: 28.07.2009, 21:58
Titel: Fitparameter in fminsearch einschränken
Hallo,
Ich sitze schon den ganzen Tag an diesem Problem, kriege es aber einfach nicht hin..wäre sehr dankbar, wenn mir jemand hier helfen könnte!
Also ich habe Messdaten T_mess, die ich an eine Funktion T_anpass1 fitten möchte. Die Funktion T_anpass1 habe ich im Anhang hochgeladen, ich habe unten als Beispiel n=3 gewählt. Nun weiß ich nicht, wie ich die Fitparameter einschränken soll, d.h., dass alpha_i und gamma_i > 0 sind. (beta ist gegeben) Weiterhin brauche ich als Abbruchkriterium 1-sum(gammas)<10^(-4). Kann ich das mit der optimset-Funktion machen? Steige da nämlich auch nciht durch wie das geht...
alpha1_start=15; %Startwerte für die Kurvenanpassung
alpha2_start=10;
gamma2_start=0.1;
alpha3_start=5;
gamma3_start=0.01;
gamma=0.08; %vorgegebenes Gamma in 1. Teilfunktion
fminsearch erlaubt keine Nebenbedingungen. Diese könnten bestenfalls als Strafterme (Zielfunktion entsprechend erhöhen) eingebaut werden; das ist allerdings eher eine Notlösung.
Besser wäre es, eine geeignete Funktion aus der Optimization Toolbox zu verwenden, z.B. lsqcurvefit.
Vielen Dank für den Tipp, ich habe lsqcurvefit jetzt wie folgt benutzt, bekomme aber folgende Fehlermeldungen:
Zitat:
??? Error using ==> optim\private\lsqncommon at 98
LSQCURVEFIT cannot continue because user supplied objective function failed with the following error:
Error using ==> times
Matrix dimensions must agree.
Error in ==> lsqcurvefit at 182
[x,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
Error in ==> Anpassungsfunktionn3 at 33
[param1, resnorm, residual, exitflag] = lsqcurvefit('min_func', param1_start, x, T_mess, lb, ub);
Die Matrixdimensionen in min_func stimmen aber überein, zumindest hat das mit fminsearch geklappt.
alpha1_start=15; %Startwerte für die Kurvenanpassung
alpha2_start=10;
gamma2_start=0.1;
alpha3_start=5;
gamma3_start=0.01;
gamma=0.08; %vorgegebenes Gamma in 1. Teilfunktion
), wie es in den Beispielen in der Hilfe gemacht wird, bekomme dann aber folgende Fehlermeldungen:
Zitat:
??? Error using ==> optim\private\lsqncommon at 98
LSQCURVEFIT cannot continue because user supplied objective function failed with the following error:
Undefined function or variable 'T_mess'.
Error in ==> lsqcurvefit at 182
[x,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
Error in ==> Anpassungsfunktionn3 at 33
[param1, resnorm, residual, exitflag] = lsqcurvefit('min_func', param1_start, x, T_mess, lb, ub);
Das ist jetzt gerade etwas unübersichtlich. Was ich versuchen würde ist, einen Haltepunkt in die Zielfunktion zu setzen und zu sehen, was da passiert.
Ein Problem scheint aber zu sein, dass lsqcurvefit Zielfunktionen mit zwei Eingabeargumenten (Parameter und x-Werte) erwartet. Dazu vielleicht nochmal die Beispiele in der Hilfe zu lsqcurvefit schauen.
Ich könnte mir vorstellen, dass die Zielfunktion so aussehen sollte:
Die Umsetzung des Abbruchkriteriums halte ich so nicht für sinnvoll, da das ja nicht bedeutet, dass die entsprechenden Parameter gut sind. Ich würde das auch nicht in der Zielfunktion, sondern in der OutputFcn (eine der Optionen von optimset) machen.
Selbst, wenn Du die hinteren Werte nicht nutzt, werden sie an die Output-Funktion übergeben - und wenn sie nicht vorgesehen sind, gibt es eben den Fehler "Too many input arguments."
PS: Gut, dass Du die Fehlermeldung angegeben hast, so konnte ich die Ursache schnell finden. Wenn das mal jeder machen würde...
Danke, mit der richten Syntax funktioniert das jetzt...nur habe ich jetzt das Problem, dass meine Fitsuche früher abbricht bevor mein eigenes definiertes Abbruchkriterium (siehe Code unten) erreicht ist. Somit bekomme ich als die Summe
(param1(3)+param1(6)+param1(9)+param1(12)+param1(15) jetzt 1.011 raus mit der Meldung
Zitat:
Optimization terminated: relative function value
changing by less than OPTIONS.TolFun.
anstatt irgendwas zwischen 0.999 und 0.9999, was ich haben möchte...
Code:
function stop = outfun(param1, optimValues, state)
vielleicht hätte ich erst mal den ganzen Thread lesen sollen... Dann hätte ich wahrscheinlich gleich zu fmincon statt lsqcurvefit geraten. Leider ist es nicht so recht möglich, Deine Bedingung über die output-Funktion einzubringen.
Die output-Funktion funktioniert nur in eine Richtung: FALLS die Bedingung erfüllt ist, bricht die Optimierung ab. Ganz egal, wie gut oder schlecht bis dahin das Fitten funktioniert hat. Das benutzt man eigentlich eher für Fehlermeldungen oder so. Du möchtest aber: NUR WENN die Bedingung erfüllt ist, soll die Optimierung Erfolg vermelden, ansonsten weiter suchen.
Deine lineare Nebenbedingung kann man also nicht so direkt in lsqcurvefit einbringen. (Im Gegensatz zu den Grenzen, das klappt ja wohl auch ganz gut.)
Nebenbedingungen und Matlab - das heißt eigentlich, fmincon ist die Funktion der Wahl. Leider müsstest Du dann Deine Zielfunktion nochmal umschreiben, weil fmincon minimiert und nicht fittet. Die lineare Nebenbedingung ist aber dann kein Problem. Wenn Du vorher fminsearch verwendet hast, kannst Du die Zielfunktion von dort wiederverwenden.
Eventuell kann man aber lsqcurvefit auch austricksen und die Parameter 3, 6, ... zusätzlich an die Nebenbedingung fitten. Sowas habe ich aber noch nie gemacht. Ist nur so eine Idee.
Ich hoffe, jetzt habe ich alles richtig verstanden. Herzliche Grüße
Bijick
_________________
danke für die Antwort, gucke mir gleich mal fmincon genauer an...
Neben dem Abbruchkriterium habe ich auch noch folgendes Problem, dass ich als Einschränkung für meine Fitparameter Gammas habe, dass jedes einzelne Gamma größer 0 sein muss (das geht ja auch mit der lower bound option) und die Summe aller Gammas muss 1 betragen. Die letzte Einschränkung bedeutet im Umkehrschluss, dass ein Gamma bereits vordefiniert ist, nämlich beispielsweise bei 5 Gammas insgesamt wäre das 5. Gamma über Gamma_5=1-(Gamma_1+Gamma_2+Gamma_3+Gamma_4) vordefiniert. So gibt es aber ein Problem mit der Bedingung Gamma>0 für Gamma_5, da (Gamma_1+Gamma_2+Gamma_3+Gamma_4)>1 sein kann (da für diese Gammas nur die Bedinung gilt, dass sie größer null sein sollen)...Weißt du wie ich es machen kann, dass mein 5. Gamma auch größer null ist? kann das fmincon? Das kann ich nämlich nicht in den lower bounds definieren, da es ja über die anderen Gammas 1-4 definiert ist. Anbei auch nochmal die Datei, die ich schon mal angehängt habe, damit das mit dem Einschränken der Parameter vielleicht noch etwas klarer wird, also ich es hier geschrieben habe...
Die Bedingung "Summe der gammas = 1" lässt sich am leichtesten als lineare Nebenbedingung umsetzen:
[1 1 1 1 1] * gammas = 1 ( "*" = Matrix-Vektor-Multiplikation)
In der Notation von fmincon ist dann
Aeq = [1 1 1 1 1] (ggf. mit zusätzlichen 0 bei anderen Parametern)
und beq = 1
Danke für deine Message, habe das jetzt so gemacht wie du es gesagt hast (bei mir sind die Parameter, die eingeschränkt werden sollen immer der 2.,4.,6., etc. also param(2), param(4), etc., daher sieht Aeq so aus). habe auch über lb definiert, dass alle Parameter größer null sein sollen, aber als Ergebnis haut das mit dem Code unten nicht hin, da z.B. param1(6) kleiner 0 ist:
Als Warnung erhalte ich weiterhin folgende Mitteilung, was bedeutet die?
Zitat:
Warning: Large-scale (trust region) method does not currently solve this type of problem,
using medium-scale (line search) instead.
> In fmincon at 317
In Anpassungsfunktion_betasfest_n5 at 45
Optimization terminated: first-order optimality measure less than options.TolFun
and maximum constraint violation is less than options.TolCon.
Active inequalities (to within options.TolCon = 1e-006):
lower upper ineqlin ineqnonlin
2
4
6
10
Die Warnung bedeutet, dass fmincon einen anderen Algorithmus als den Standard-Algorithmus verwendet (siehe Doc von fmincon).
Ansonsten sieht es so aus, als ob alles in Ordnung wäre.
Wenn als Lösung ein param1 rauskommt, bei dem einzelne Komponenten minimal < 0 sind (z.B -1e-6), dann ist das in Ordnung und als 0 zu interpretieren. Wie stark Nebenbedingungen verletzt werden dürfen, ist über die Toleranzen geregelt.
Probiers übrigens mal mit optimtool, das ist am Anfang vielleicht einfacher zu bedienen.
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.