Ich habe einen Datensatz, der aus einer Sammlung von Punkten besteht. Die Punkte sind in der Ebene so verteilt, dass sie durch eine Parabel grob begrenzt werden können. Ich versuche einen Weg zu finden, eine Parabel an die Grenze der Punkte anzupassen.
das habe ich zur Zeit:
%Vor%Dies erstellt einen Beispieldatensatz und passt dann eine Kurve an die Grenze an. Die Zielfunktion besteht aus einem "normalen" quadratischen Fehlerterm, der eine Parabel zu den Daten passt, sowie einem zweiten logistischen Term, der Punkte bestraft, die unter der Parabel leben. Die Parameter (100 und 0,00001) dieses zweiten Terms wurden durch Versuch und Irrtum bestimmt.
Der Code zeichnet die Punkte sowie die angepasste Parabel.
Jetzt funktioniert dieses System ... aber nur zeitweise. manchmal erzeugt es eine völlig falsche fehleranpassung, und ich schätze, dass in diesen fällen die Parameter für den logistischen begriff einfach unpassend sind. Führe den Code einige Male aus, um zu sehen, was ich meine.
Ich bin mir sicher, dass es einen robusteren Weg geben muss, dieses Problem zu lösen. Ideen und Vorschläge?
.
Ich kann keine vollständige Antwort geben. Die einzige Ad-hoc-Idee, die ich hatte, war, bessere Startpunkte für den Optimierungsalgorithmus zu bieten - in der Hoffnung, dass Sie näher am lokalen Minimum der Funktion sind, die Sie zu optimieren versuchen.
Die Schätzung einer groben ersten Version ist ziemlich einfach. Wenn Sie Ihre Parabel als b*(x-a)^2+c
schreiben
Sie können schätzen
Ich hatte eine weitere intensive Testsitzung mit meinem Vorschlag und der Methode "BFGS". Ich konnte kein Gegenbeispiel mit dem folgenden Ansatz finden:
%Vor%Korrekte Konvergenz ist jedoch nicht garantiert. Ich habe etwa 50 Fälle ausprobiert und alles ging gut. Wird Ihr Ergebnis überprüft oder muss es auf einer automatisierten Basis korrekt funktionieren?
Ich hatte ein paar Gedanken darüber, wie Sie Ihre Zielfunktion aktualisieren können, um zuverlässiger zu sein. Momentan habe ich keine Zeit, eine vollständige Lösung auszuarbeiten, aber vielleicht können Ihnen diese Gedanken helfen:
Wir haben ein Datum in range(data$x)
. Jetzt wollen wir eine Parabel finden, die so gut wie möglich an die untere Grenze dieser Daten passt - oder, mit anderen Worten, die Werte a, b, c finden, die
(Bitte entschuldigen Sie die unbeholfenen LaTeX - Formeln schreiben ist manchmal einfach besser).
Nun können Punkte unterhalb der Parabel mit einer Straffunktion wie
bestraft werden %Vor%Wenn Sie diese Funktion vom Intervall abziehen, erhalten Sie eine geeignete, reibungslose Zielfunktion. Es scheint ein besseres Modell zu sein, die Funktion so gut wie möglich zu vereinfachen, als den Ansatz der kleinsten Quadrate zu verwenden, der versucht, eine Linie durch die Mitte der Datenpunkte zu ziehen.
Sie müssen jedoch immer noch ein passendes Lambda auswählen. Aber das ist typisch: Sie brauchen einen Kompromiss zwischen zwei verschiedenen Zielen (Anpassung der Daten, Maximierung der Parabel). Welches Gewicht wichtiger ist, muss von Ihnen eingereicht werden.
weiter danke an Thilo für seine sehr hilfreichen Vorschläge und Korrektur meiner naiven Ideen. Basierend auf dem Vorschlag von Thilo, die Fläche unter der Parabel und eine geeignete Penalty-Funktion zu verwenden, scheint die folgende Lösung zu funktionieren. Ich habe auch zu L-BFGS-B-Optimierung gewechselt, weil es mit kleinen N besser funktioniert.
%Vor%Tags und Links optimization r