Verfasst am: 04.08.2017, 09:23
Titel: Gewisser Datenbereich sprengt den curvefit
Moin moin,
ich hatte vor einigen Wochen bereits eine sehr ähnliche Frage:
http://www.gomatlab.de/e-funktionen.....drigen-werten-t44277.html
Es ging darum, warum der Fit bei hohen Werten nicht funktioniert. Dies lag daran, dass die Startwerte zu hoch gewählt waren.
Nun habe ich hier ein Problem, das bei hohen Endwerten sehr ähnlich scheint.
Der Code:
Die Bilder für die "good data" und "bad data" Ausgabe habe ich hier angehangen.
Ist die lsqcurvefit() Funktion hier an seiner Grenze angelangt? Falls ja, welche andere Fitfunktion würdet ihr mir empfehlen? Oder liegt der Fehler in der Programmierung? Ich würde gern deutlich größere Daten auch noch fitten (10^10 etc). Gern auch Startwertunabhängig.
es ist unsinnig, drei Startwerte anzugeben, wenn du nur zwei Parameter verwendest.
Wenn du den banalen Startwert
x0 = [1, 1];
verwendest, konvergiert das z.B. schon, obwohl x0(1) alles andere als in der Nähe der Lösung ist.
Startwertunabhängig wird nicht möglich sein, da es sich um eine nichtlineare Optimierung handelt. Bei einem einfachen Modell lassen sich die Startwerte aber gut schätzen, z.B. indem man den nächstgelegenen Wert zu xdata = 0 als Startwert für die erste Komponente nimmt und dann aus einem anderen Datenpunkt den zweiten Parameter ermittelt.
Moin Harald,
verstehe ich es richtig, dass darauf verzichtet werden soll 3 Werte anzugeben?
Edit: Also mit verzichtet meine ich, 2 statt 3 Werte anzugeben.
Das wäre ungünstig, später soll der User in der Lage sein eine Datenwolke (~10-30 Wertepaare) anzugeben, aufgrund deren dann die Funktion ermittelt werden soll.
Wie breche ich das dann herunter auf 2 Wertepaare ohne die Genauigkeit zu beeinträchtigen?
Ok nun verstehe ich worauf du mit dem Startwerten hinaus möchtest, nur wird mir nicht ganz klar, wie die abgeschätzt werden sollen.
Zitat:
Bei einem einfachen Modell lassen sich die Startwerte aber gut schätzen, z.B. indem man den nächstgelegenen Wert zu xdata = 0 als Startwert für die erste Komponente nimmt und dann aus einem anderen Datenpunkt den zweiten Parameter ermittelt.
Bei einer E-Funktion von Typ a./e^(x*b) mit 2 Unbekannten brauche ich also 2 Startwerte. Der erste Startwert ist der naheliegenste Wert von xdata an 0, hier also 1 (es gibt keine negativen Werte, könnte also auch einfach das Minimum nehmen).
Ist die Wahl des 2. Startwertes beliebig? Sollte ich da ein Extremum wählen oder den Durchschnitt?
Ich habe leider keine Ahnung, wie solche FittingFunktionen arbeiten und wozu sie Startwerte brauchen.
Was mache ich bei einer Funktion mit mehr als 2 Unbekannten?
Würde ich bei 4 bspw. das Minimum&Maximum sowie die nächstgelegenen Werte bei 33% und 66& des Maximums nehmen?
Jein. Wenn du gute Ergebnisse bekommst, war der Startwert gut genug. Wenn du schlechte Ergebnisse bekommst, liegt es oft an einem schlechten Startwert.
Zitat:
Sollte ich da ein Extremum wählen oder den Durchschnitt?
Weder noch. Wenn du den ersten Startwert als gegeben annimmst, kannst du die Gleichung für einen weiteren Datenpunkt nach dem anderen Startwert auflösen:
y = a./e^(x*b) --> x = log(a/y) / b
Zitat:
Ich habe leider keine Ahnung, wie solche FittingFunktionen arbeiten und wozu sie Startwerte brauchen.
Ein grundlegendes Verständnis sollte man schon haben von den Funktionen, die man verwendet.
Kurz gesagt: ausgehend vom Startwert wird in Richtung des steilsten Abstiegs nach einem Minimum gesucht. Wenn der Startwert nicht gut genug ist, wird statt des globalen Minimums nur ein globales Minimum gefunden.
https://de.wikipedia.org/wiki/Extremwert
Einfaches Beispiel: versuche, den tiefsten Punkt auf der Erde zu finden. Wenn du bei dir zuhause anfängst und immer nach unten gehst, wirst du da wohl erfolglos sein, weil es sehr viele Mulden und Keller gibt. Erfolgreich kannst du quasi nur sein, wenn du dich schon im Marianengraben befindest oder die ganze Erde systematisch absuchst (= viele Startwerte verwendest).
Zitat:
Was mache ich bei einer Funktion mit mehr als 2 Unbekannten?
Für jede Unbekannte einen sinnvollen Startwert angeben.
Zitat:
Würde ich bei 4 bspw. das Minimum&Maximum sowie die nächstgelegenen Werte bei 33% und 66& des Maximums nehmen?
Das ist nicht sinnvoll, da die Werte der Parameter sich nicht direkt aus den Daten ergeben. Die Startwerte sollten immer auch abhängig vom Modell gewählt werden.
Oft ist es so, dass Leute sagen: da sehe ich ja auf den ersten Blick bessere Parameter - sehr gut, dann genau diese Parameter als Startwerte verwenden.
Vielen Dank für die ausführliche Erklärung Harald!
Also das Ziel der Startwerte ist es, die Funktion in die Nähe ihrer Extrema zu bringen, damit ich in deinem Beispiel nicht bei der Suche nach dem tiefsten Punkt der Erde zuhause Anfange, sondern schon in der Nähe das Marianengrabens anfange, richtig?
Zitat:
Bei einem einfachen Modell lassen sich die Startwerte aber gut schätzen, z.B. indem man den nächstgelegenen Wert zu xdata = 0 als Startwert für die erste Komponente nimmt und dann aus einem anderen Datenpunkt den zweiten Parameter ermittelt.
Das verwirrt mich jetzt ein wenig, denn wenn ich als ersten Startwert als max(ydata) angebe und den zweiten als min(ydata), geht der gefittete Graph noch bei 10^8 durch den ersten Datenpunkt, siehe Code:
Erst bei 10^9 "schafft" der Fit es nicht mehr, siehe Abbildung 1.
Zitat:
Wenn du den ersten Startwert als gegeben annimmst, kannst du die Gleichung für einen weiteren Datenpunkt nach dem anderen Startwert auflösen:
y = a./e^(x*b) --> x = log(a/y) / b
Die Parameter sind mir doch erst dann bekannt, wenn ich die Funktion angefittet habe, soll man die Parameter schätzen, dann die Funktion fitten und dann wieder schätzen?
Wird das in einer Art Rekursion aufgebaut?
Die Parameter sind mir doch erst dann bekannt, wenn ich die Funktion angefittet habe, soll man die Parameter schätzen, dann die Funktion fitten und dann wieder schätzen?
Die wirkliche Schätzung (Anpassung) der Parameter klappt nur, wenn man ausreichend gute Startwerte hat. Das ist mehr ein "über den Daumen peilen".
Es verwirrt mich, dass der mögliche Fitbereich größer wird, wenn ich den ersten Startwert auf das Maximum schätze und nicht, wie von dir vorgeschlagen, dass Minimum. Oder ist die Reihenfolge der Startwerte irrelevant? Der Zweite ist ja das Minimum.
Harald hat Folgendes geschrieben:
Zitat:
Die Parameter sind mir doch erst dann bekannt, wenn ich die Funktion angefittet habe, soll man die Parameter schätzen, dann die Funktion fitten und dann wieder schätzen?
Die wirkliche Schätzung (Anpassung) der Parameter klappt nur, wenn man ausreichend gute Startwerte hat. Das ist mehr ein "über den Daumen peilen".
Für das "über den Daumen peilen" fehlt mir leider die Erfahrung. Was wäre für das Beispiel von
Ich schätze ich hab n dickes Brett vorm Kopf..
Nun entspricht der Fit nicht mehr dem erwarteten Kurvenverlauf, siehe Abbildung.
Wenn ich den ersten ydata-Wert als gegeben annehme, bleibt ja nurnoch der zweite um aus der umgestellten Gleichung den zweiten Startwert zu ermitteln.
Ich komm beim besten Willen nicht dahinter wie diese Startwerte geschätzt werden
Wenn es mehr als 3 Datenpunkte gäbe, was wären die Kriterien für den "besten" ydata-Wert, den man in die umgestellte Formel einsetzt?
Nun würde es mich noch interessieren wo diese Formeln herkommen, oder wie man sie herleitet / sich erschließt für Fits deren Funktionen anders aussehen.
die Formeln:
(1) y_1 = a * exp(b*x_1)
(2) y_2 = a * exp(b*x_2)
Gleichung (1) / Gleichung (2) eliminiert Parameter a und ergibt nach b aufgelöst die Formel für x0_2. Damit kann dann (1) nach a aufgelöst werden, und man hat die Formel für x0_1.
Die Reihenfolge der Startwerte, also des x0 Vektors scheint nicht beliebig zu sein. Wie wird bestimmt, ob die nach a oder b umgestellte Formel an erster oder zweiter Stelle stehen muss?
Das erste Element von x0 ist der Startwert für x(1), das zweite Element der Startwert für x(2). Wenn du in der Funktion x(1) und x(2) vertauschst, musst du entsprechend auch die Elemente in x0 vertauschen.
Das erste Element von x0 ist der Startwert für x(1), das zweite Element der Startwert für x(2). Wenn du in der Funktion x(1) und x(2) vertauschst, musst du entsprechend auch die Elemente in x0 vertauschen.
Das leuchtet ein.
Nun habe ich versucht das Vorgehen für die Startwerte auf eine eFunktion des Typs
y=a(1-e^(bx))
anzuwenden.
bei
y2/y1 = (1 - e^(b*x2) ) / (1-e^(b*x1))
bin ich aber hängengeblieben. Auch einschlägige Websites (wolframalpha) konnten mir nicht helfen. Gibts da einen Weg das "b" zu isolieren oder muss man die Startwerte anders bestimmen?
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.