Die Frage oben sagt alles. Grundsätzlich ist meine Frage nach einer generischen Anpassungsfunktion (die beliebig kompliziert sein kann), die in den Parametern, die ich abzuschätzen versuche, nichtlinear ist. Wie wählt man die Anfangswerte aus, um die Anpassung zu initialisieren? Ich versuche, nichtlineare kleinste Quadrate zu erstellen. Gibt es eine Strategie oder Methode? Wurde das untersucht? Referenzen? Sonst noch etwas, außer Ad-hoc-Vermutungen? Insbesondere ist eine der Anpassungsformen, mit denen ich gerade arbeite, eine Gaußsche plus lineare Form mit fünf Parametern, die ich zu schätzen versuche, wie
Dabei ist (Abszissendaten) und (Ordinatendaten), was bedeutet, dass meine Daten im log-log-Raum wie eine gerade Linie plus eine Erhebung aussehen, die ich mit einem Gaußschen approximiere. Ich habe keine Theorie, nichts, was mich anleiten könnte, wie die nichtlineare Anpassung zu initialisieren ist, außer vielleicht grafische Darstellungen und Augapfelungen wie die Neigung der Linie und die Mitte / Breite der Erhebung. Aber ich habe mehr als hundert dieser Anpassungen, anstatt zu zeichnen und zu raten, würde ich einen Ansatz bevorzugen, der automatisiert werden kann.
Ich kann keine Referenzen in der Bibliothek oder online finden. Das einzige, was mir einfällt, ist, die Anfangswerte zufällig auszuwählen. MATLAB bietet an, Werte zufällig aus [0,1] gleichmäßig verteilt auszuwählen. Also führe ich mit jedem Datensatz die zufällig initialisierte Anpassung tausendmal aus und wähle dann die mit der höchsten ? Irgendwelche anderen (besseren) Ideen?
Anhang Nr. 1
Hier sind zunächst einige visuelle Darstellungen der Datensätze, um Ihnen zu zeigen, über welche Art von Daten ich spreche. Ich poste beide Daten in ihrer ursprünglichen Form ohne irgendeine Umwandlung und dann ihre visuelle Darstellung im Log-Log-Raum, da sie einige der Merkmale der Daten verdeutlichen und andere verzerren. Ich poste eine Stichprobe von sowohl guten als auch schlechten Daten.
Jedes der sechs Felder in jeder Abbildung zeigt vier Datensätze, die zusammen rot, grün, blau und cyan dargestellt sind, und jeder Datensatz hat genau 20 Datenpunkte. Ich versuche, jeden von ihnen mit einer geraden Linie und einem Gaußschen zu versehen, da die Daten Unebenheiten aufweisen.
Die erste Abbildung zeigt einige der guten Daten. Die zweite Abbildung ist das Log-Log-Diagramm der gleichen guten Daten aus Abbildung 1. Die dritte Zahl sind einige der schlechten Daten. Die vierte Abbildung ist das Log-Log-Diagramm von Abbildung drei. Es gibt viel mehr Daten, das sind nur zwei Teilmengen. Die meisten Daten (ungefähr 3/4) sind gut, ähnlich den guten Daten, die ich hier gezeigt habe.
Nun einige Kommentare, bitte nehmen Sie Kontakt mit mir auf, da dies lange dauern könnte, aber ich denke, all diese Details sind notwendig. Ich werde versuchen, so kurz wie möglich zu sein.
Ich hatte ursprünglich ein einfaches Potenzgesetz erwartet (dh eine gerade Linie im Log-Log-Raum). Als ich alles im Log-Log-Raum plottete, sah ich die unerwartete Beule bei etwa 4,8 MHz. Die Beule wurde gründlich untersucht und auch in anderen Arbeiten entdeckt, so dass wir es nicht vermasselt haben. Es ist physisch dort und andere veröffentlichte Werke erwähnen dies auch. Also habe ich meiner linearen Form einfach einen Gaußschen Term hinzugefügt. Beachten Sie, dass diese Anpassung im Protokoll-Protokoll-Bereich erfolgen sollte (daher meine beiden Fragen, einschließlich dieser).
Nachdem ich nun die Antwort von Stumpy Joe Pete auf eine andere Frage von mir gelesen habe (die überhaupt nicht mit diesen Daten zusammenhängt) und dies und das und die darin enthaltenen Verweise gelesen habe (Zeug von Clauset), wurde mir klar, dass ich nicht in Log-Log passen sollte Raum. Jetzt möchte ich alles im vortransformierten Raum tun.
Frage 1: Wenn ich mir die guten Daten anschaue, denke ich immer noch, dass ein linearer plus ein Gaußscher Wert im vortransformierten Raum immer noch eine gute Form ist. Ich würde gerne von anderen hören, die mehr Erfahrung mit Daten haben, was sie denken. Ist Gauß + linear sinnvoll? Soll ich nur einen Gauß machen? Oder eine ganz andere Form?
Frage 2: Was auch immer die Antwort auf Frage 1 sein mag, ich benötige (höchstwahrscheinlich) nichtlineare Fehlerquadrate und benötige daher weiterhin Hilfe bei der Initialisierung.
Bei den Daten, bei denen wir zwei Sätze sehen, ziehen wir es sehr stark vor, die erste Erhebung bei etwa 4-5 MHz zu erfassen. Ich möchte also keine weiteren Gauß-Terme hinzufügen, und unser Gauß-Term sollte sich auf die erste Erhebung konzentrieren, bei der es sich fast immer um die größere Erhebung handelt. Wir wollen "mehr Genauigkeit" zwischen 0,8 MHz und etwa 5 MHz. Wir interessieren uns nicht zu sehr für die höheren Frequenzen, wollen sie aber auch nicht völlig ignorieren. Also vielleicht eine Art Wiegen? Oder kann B immer um 4.8mHz initialisiert werden?
Die Abszissendaten sind die Frequenz in Einheiten von Millihertz, bezeichnen sie mit . Die Ordinate Daten ist ein Koeffizient , wir sind Rechen, bezeichnen sie mit L . Also keine Protokolltransformation, und das Formular ist
- ist Frequenz, ist immer positiv.
- ist ein positiver Koeffizient. Wir arbeiten also im ersten Quadranten.
Frage 3: Was denken Sie, wie Sie dies in diesem Fall extrapolieren können? Irgendwelche Vor- / Nachteile? Irgendwelche anderen Extrapolationsideen? Auch hier kümmern wir uns nur um die niedrigeren Frequenzen, die zwischen 0 und 1 MHz extrapoliert werden ... manchmal sehr, sehr kleine Frequenzen, die nahe bei Null liegen. Ich weiß, dass dieser Beitrag bereits gepackt ist. Ich habe diese Frage hier gestellt, weil die Antworten möglicherweise in Beziehung stehen, aber wenn ihr es vorzieht, kann ich diese Frage trennen und später eine andere stellen.
Abschließend noch zwei Beispieldatensätze auf Anfrage.
0.813010000000000 0.091178000000000 0.012728000000000
1.626000000000000 0.103120000000000 0.019204000000000
2.439000000000000 0.114060000000000 0.063494000000000
3.252000000000000 0.123130000000000 0.071107000000000
4.065000000000000 0.128540000000000 0.073293000000000
4.878000000000000 0.137040000000000 0.074329000000000
5.691100000000000 0.124660000000000 0.071992000000000
6.504099999999999 0.104480000000000 0.071463000000000
7.317100000000000 0.088040000000000 0.070336000000000
8.130099999999999 0.080532000000000 0.036453000000000
8.943100000000001 0.070902000000000 0.024649000000000
9.756100000000000 0.061444000000000 0.024397000000000
10.569000000000001 0.056583000000000 0.025222000000000
11.382000000000000 0.052836000000000 0.024576000000000
12.194999999999999 0.048727000000000 0.026598000000000
13.008000000000001 0.045870000000000 0.029321000000000
13.821000000000000 0.041454000000000 0.067300000000000
14.633999999999999 0.039596000000000 0.081800000000000
15.447000000000001 0.038365000000000 0.076443000000000
16.260000000000002 0.036425000000000 0.075912000000000
Die erste Spalte enthält die Frequenzen in mHz, die in jedem einzelnen Datensatz identisch sind. Die zweite Spalte ist ein guter Datensatz (gute Daten, Ziffer eins und zwei, Feld 5, rote Markierung) und die dritte Spalte ist ein schlechter Datensatz (schlechte Daten, Ziffer drei und vier, Feld 5, rote Markierung).
Hoffe, dies ist genug, um eine aufschlussreichere Diskussion anzuregen. Danke euch allen.
Antworten:
Wenn es eine Strategie gäbe, die sowohl gut als auch allgemein ist - eine, die immer funktioniert -, würde sie bereits in jedem nichtlinearen Least-Squares-Programm implementiert, und Startwerte wären kein Problem.
Für viele spezifische Probleme oder Problemfamilien gibt es einige ziemlich gute Ansätze für Startwerte. Einige Pakete enthalten gute Startwertberechnungen für bestimmte nichtlineare Modelle oder allgemeinere Ansätze, die häufig funktionieren, denen jedoch möglicherweise mit spezifischeren Funktionen oder direkter Eingabe von Startwerten geholfen werden muss.
In manchen Situationen ist es notwendig, den Raum zu erkunden, aber ich denke, Ihre Situation ist wahrscheinlich so, dass sich spezifischere Strategien lohnen werden - aber um eine gute Strategie zu entwickeln, ist ziemlich viel Fachwissen erforderlich, über das wir wahrscheinlich nicht verfügen.
Einige Beispieldaten würden helfen - typische und schwierige Fälle, wenn Sie dazu in der Lage sind.
Bearbeiten: Hier ist ein Beispiel, wie Sie ziemlich gut vorgehen können, wenn das Problem nicht zu laut ist:
Hier sind einige Daten, die aus Ihrem Modell generiert wurden (Bevölkerungswerte sind A = 1,9947, B = 10, C = 2,828, D = 0,09, E = 5):
Die Startwerte, die ich schätzen konnte, sind
(As = 1,658, Bs = 10,001, Cs = 3,053, Ds = 0,0881, Es = 5,026)
Die Passform dieses Startmodells sieht folgendermaßen aus:
Die Schritte waren:
In diesem Fall eignen sich die Werte sehr gut zum Starten einer nichtlinearen Anpassung.
Ich habe das als
R
Code geschrieben, aber das gleiche könnte in MATLAB gemacht werden.Ich denke, bessere Dinge sind möglich.
Wenn die Daten sehr verrauscht sind, funktioniert dies überhaupt nicht.
Edit2: Dies ist der Code, den ich in R verwendet habe, wenn jemand interessiert ist:
.
quelle
Es gibt einen allgemeinen Ansatz zur Anpassung dieser Art von nichtlinearen Modellen. Dabei werden die linearen Parameter mit Werten der abhängigen Variablen umparametriert, beispielsweise dem ersten, letzten Frequenzwert und einem guten Punkt in der Mitte, beispielsweise dem sechsten Punkt. Dann können Sie diese Parameter festhalten und in der ersten Phase der Minimierung nach dem nichtlinearen Parameter auflösen und dann insgesamt 5 Parameter minimieren.
Schnute und ich haben das um 1982 herausgefunden, als wir Wachstumsmodelle für Fische anlegten.
http://www.nrcresearchpress.com/doi/abs/10.1139/f80-172
Es ist jedoch nicht erforderlich, dieses Dokument zu lesen. Aufgrund der Tatsache, dass die Parameter linear sind, ist es einfach erforderlich, ein lineares 3x3-Gleichungssystem aufzustellen und zu lösen, um die stabile Parametrisierung des Modells zu nutzen.
Für Ihren Fall mit den schlechten Daten passt es ziemlich leicht und die (üblichen) Parameterschätzungen sind:
quelle
Wenn Sie dies oft tun müssen, würde ich vorschlagen, dass Sie einen evolutionären Algorithmus für die SSE-Funktion als Front-End verwenden, um die Startwerte bereitzustellen.
Andererseits könnten Sie GEOGEBRA verwenden, um die Funktion mit Schiebereglern für die Parameter zu erstellen und mit diesen zu spielen, um Startwerte zu erhalten.
ODER-Startwerte aus den Daten können durch Beobachtung geschätzt werden.
quelle
Für Startwerte können Sie eine gewöhnliche Anpassung der kleinsten Quadrate durchführen. Seine Steigung und sein Schnittpunkt wären die Startwerte für D und E. Das größte Residuum wäre der Startwert für A. Die Position des größten Residuums wäre der Startwert für B. Vielleicht kann jemand anderes einen Startwert für Sigma vorschlagen.
Nichtlineare kleinste Fehlerquadrate, ohne irgendeine Art von mechanistischer Gleichung aus dem Fachwissen abzuleiten, sind jedoch ein riskantes Geschäft, und viele separate Anpassungen machen die Dinge noch fragwürdiger. Gibt es Fachkenntnisse hinter Ihrer vorgeschlagenen Gleichung? Gibt es andere unabhängige Variablen, die sich auf die Unterschiede zwischen den 100 oder so getrennten Anpassungen beziehen? Es kann hilfreich sein, wenn Sie diese Unterschiede in eine einzige Gleichung integrieren können, die für alle Daten gleichzeitig geeignet ist.
quelle