Auswahl der Anfangswerte für die nichtlineare Anpassung der kleinsten Quadrate

12

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

y=Ae(xBC)2+Dx+E

Dabei ist x=log10 (Abszissendaten) und y=log10 (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?r2


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.

gute Daten log-log gute Daten schlechte Daten log-log fehlerhafte 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 istfL

L=Ae(fBC)2+Df+E.
  • ist Frequenz, ist immer positiv.f
  • ist ein positiver Koeffizient. Wir arbeiten also im ersten Quadranten.L
  • AA>0A
  • B
  • CCC
  • D
  • ELELf=0

Ae(B/C)2+E.

EEf=0

L

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.

Fixpunkt
quelle
+1 für zusätzliche Informationen, aber jetzt sieht das wie eine neue Frage aus. Im Übrigen, wenn Sie jetzt die vorherige löschen möchten, denke ich, dass das in Ordnung wäre, haben Sie anscheinend jetzt die zusätzlichen Informationen abgedeckt, die sie hatten.
Glen_b
@ Glen_b Warum ist das so? Warum sieht es nach einer neuen Frage aus? Was die alte Frage anbelangt, wir alle haben eine Hure für Punkte ;-D und die alte hat zwei positive Stimmen, wie kann ich das zusammenfassen, damit ich auch diese beiden Stimmen behalten kann?
Fixpunkt
Gut für den Anfang, sind Sie jetzt fragen , was Sie sollten passen, anstatt die festlegen , was zu passen, wie zuvor. Es gibt eine Reihe weiterer Unterschiede, von denen ich einige für ziemlich bedeutsam halte. Ich werde versuchen, meine Antwort zu ändern, aber ich denke, diese könnte als die ursprüngliche Frage und Antwort stehen, und Ihre neuen Teile, in denen Sie andere Dinge fragen, könnten eine neue sein. Das überlasse ich vorerst Ihrem Urteil.
Glen_b
@ Glen_b Fair genug, ich streifte die zusätzlichen Fragen. Die Frage ist also immer noch, ich habe einige Daten, die ich mithilfe der linearen + Gaußschen Form anpassen möchte. Kann ich das besser als eine zufällige Initialisierung?
Fixpunkt
Ich denke, meine gegenwärtige Antwort zeigt, dass Sie es - zumindest unter bestimmten Umständen - besser machen können, und @whuber schlägt etwas vor, das noch einfacher ist als mein Prozess. Ich könnte zurückgehen und sehen, wie ich mit Ihren Daten umgegangen bin, aber selbst in der jetzigen Situation gibt es eine Vorstellung davon, wie man solche Startpunkte einrichtet.
Glen_b

Antworten:

10

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.

x

yx

A

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):

nls Daten

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:

nlstart

Die Schritte waren:

  1. Passen Sie eine Theil-Regression an, um eine grobe Schätzung von D und E zu erhalten
  2. Subtrahieren Sie die Anpassung der Theil-Regression
  3. Verwenden Sie LOESS, um eine glatte Kurve anzupassen
  4. Finden Sie den Peak, um eine grobe Schätzung von A zu erhalten, und den x-Wert, der dem Peak entspricht, um eine grobe Schätzung von B zu erhalten
  5. Nehmen Sie die LOESS-Anpassungen, deren y-Werte> 60% der Schätzung von A sind, als Beobachtungen und passen Sie ein Quadrat an
  6. Verwenden Sie das Quadrat, um die Schätzung von B zu aktualisieren und C zu schätzen
  7. Subtrahieren Sie von den ursprünglichen Daten die Schätzung des Gaußschen
  8. Passen Sie eine andere Theil-Regression an diese angepassten Daten an, um die Schätzung von D und E zu aktualisieren

In diesem Fall eignen sich die Werte sehr gut zum Starten einer nichtlinearen Anpassung.

Ich habe das als RCode 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:

gausslin.start <- function(x,y) {

  theilreg <- function(x,y){
    yy <- outer(y, y, "-")
    xx <- outer(x, x, "-")
    z  <- yy / xx
    slope     <- median(z[lower.tri(z)])
    intercept <- median(y - slope * x)
    cbind(intercept=intercept,slope=slope)
  }

  tr <- theilreg(x,y1)
  abline(tr,col=4)
  Ds = tr[2]
  Es = tr[1]
  yf  <- y1-Ds*x-Es
  yfl <- loess(yf~x,span=.5)

  # assumes there are enough points that the maximum there is 'close enough' to 
  #  the true maximum

  yflf   <- yfl$fitted    
  locmax <- yflf==max(yflf)
  Bs     <- x[locmax]
  As     <- yflf[locmax]

  qs     <- yflf>.6*As
  ys     <- yfl$fitted[qs]
  xs     <- x[qs]-Bs
  lf     <- lm(ys~xs+I(xs^2))
  bets   <- lf$coefficients
  Bso    <- Bs
  Bs     <-  Bso-bets[2]/bets[3]/2
  Cs     <- sqrt(-1/bets[3])
  ystart <- As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es

  y1a <- y1-As*exp(-((x-Bs)/Cs)^2)
  tr  <- theilreg(x,y1a)
  Ds  <- tr[2]
  Es  <- tr[1]
  res <- data.frame(As=As, Bs=Bs, Cs=Cs, Ds=Ds, Es=Es)
  res
}

.

# population parameters: A = 1.9947 , B = 10, C = 2.828, D = 0.09, E = 5
# generate some data
set.seed(seed=3424921)
x  <- runif(50,1,30)
y  <- dnorm(x,10,2)*10+rnorm(50,0,.2)
y1 <- y+5+x*.09 # This is the data
xo <- order(x)

starts <- gausslin.start(x,y1)
ystart <- with(starts, As*exp(-((x-Bs)/Cs)^2)+Ds*x+Es)
plot(x,y1)
lines(x[xo],ystart[xo],col=2)
Glen_b - Setzen Sie Monica wieder ein
quelle
3
+1. Tausendmaliges Wiederholen der Anpassung und Auswählen der besten (wenn ich das richtig verstehe) klingt seltsam: Nichtlineare kleinste Quadrate sollten konvergieren, wenn das Modell für die Daten angemessen ist und es gute Anfangswerte gibt. Das zweite ist natürlich, wonach Sie fragen. Es erscheint jedoch pessimistisch zu implizieren, dass Sie möglicherweise für jede Anpassung andere Startwerte auswählen müssen.
Nick Cox
1
@NickCox Es kommt auf die Bandbreite der aufgetretenen Probleme an. Wenn ich mich an frühere Veröffentlichungen erinnere, erhält das OP eine große Anzahl dieser Probleme, aber ich erinnere mich nicht, dass ich zuvor genug Details gesehen habe, um gute Vorschläge zu machen, obwohl ich ein bisschen investiert habe Zeit, um mit potenziellen Ansätzen herumzuspielen (die nicht definitiv genug waren, um sie zu posten). Das OP verfügt wahrscheinlich über die Art von Domänenwissen, das gute Startwerte liefern kann, die seine oder ihre Probleme fast immer lösen.
Glen_b
1
Ganz so. Ich habe den früheren Beitrag unter stats.stackexchange.com/questions/61724/…
Nick Cox
3
|A|BA>0CA1/4A>0A<0
2
BB
6

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.

M

M=(exp(((x(1)B)/C)2)x(1)1exp(((x(6)B)/C)2)x(6)1exp(((x(n)B)/C)2)x(n)1)
n=20
DATA_SECTION
  init_int n
  int mid
 !! mid=6;
  init_matrix data(1,n,1,3)
  vector x(1,n)
  vector y(1,n)
 !! x=column(data,1);
 !! y=column(data,3);   //use column 3
PARAMETER_SECTION
  init_number L1(3)     //(3) means estimate in phase 3
  init_number Lmid(3)
  init_number Ln(3)

  vector L(1,3)
  init_number log_B       // estimate in phase 1
  init_number log_C(2)    // estimate in phase 2 
  matrix M(1,3,1,3);
  objective_function_value f
  sdreport_vector P(1,3)
  sdreport_number B
  sdreport_number C
  vector pred(1,n);
PROCEDURE_SECTION
  L(1)=L1;
  L(2)=Lmid;
  L(3)=Ln;
  B=exp(log_B);
  C=exp(log_C);
  M(1,1)=exp(-square((x(1)-B)/C));
  M(1,2)=x(1);
  M(1,3)=1;
  M(2,1)=exp(-square((x(mid)-B)/C));
  M(2,2)=x(mid);
  M(2,3)=1;
  M(3,1)=exp(-square((x(n)-B)/C));
  M(3,2)=x(n);
  M(3,3)=1;

  P=solve(M,L);  // solve for standard parameters 
                 // P is vector corresponding to A,D,E

  pred=P(1)*exp(-square((x-B)/C))+P(2)*x+P(3);
  if (current_phase()<4)
    f+=norm2(y-pred);
  else
    f+=0.5*n*log(norm2(y-pred))  //concentrated likelihood

BCBBC

Bildbeschreibung hier eingeben

Für Ihren Fall mit den schlechten Daten passt es ziemlich leicht und die (üblichen) Parameterschätzungen sind:

         estimate    std dev
A      2.0053e-01 5.8723e-02
D      1.6537e-02 4.7684e-03
E     -1.8197e-01 7.3355e-02
B      3.0609e+00 5.0197e-01
C      5.6154e+00 9.4564e-01]
Dave Fournier
quelle
Dave, das ist interessant, wirft aber einige Fragen auf. Was genau meinen Sie mit "solchen nichtlinearen Modellen"? Die Frage bezieht sich zunächst auf eine "generische Anpassungsfunktion", Ihre Beschreibung bezieht sich jedoch nur auf "insgesamt 5 Parameter".
Whuber
Ich meine zum Beispiel Modelle wie vonbertalanffy oder logistic oder double exponential. In allen Fällen ist das Modell in einigen Parametern linear und in anderen nichtlinear. Die Leute versuchen im Allgemeinen, sie zu transformieren, um stabilere Parametrisierungen zu erhalten, indem sie sich auf die nichtlinearen Parameter konzentrieren. Dies ist jedoch der falsche Ansatz. Es ist die lineare Parametrisierung, die modifiziert werden sollte. Zum Beispiel für eine 4-Parameter-Logistik ist das Modell in der oberen und unteren Asymptote linear, aber anstatt diese Parameter zu verwenden, sollten die vorhergesagten Werte für kleinste und größte ind verwendet werden. var.
Dave Fournier
@davefournier Vielen Dank für die Beantwortung und den Hinweis auf Ihr Papier. Ihre Arbeit scheint ein wenig schwierig zu sein, aber die Technik hört sich interessant an und kann es kaum erwarten, sie zu lesen.
Fixpunkt
2

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.

  1. D und E kommen von der Steigung und dem Schnittpunkt der Daten (ohne Berücksichtigung des Gaußschen)
  2. A ist der vertikale Abstand des Maximums des Gaußschen von der Dx + E-Linienschätzung.
  3. B ist der x-Wert des Maximums des Gaußschen
  4. C ist die halbe scheinbare Breite des Gaußschen
Adrian O'Connor
quelle
1

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.

Emil Friedman
quelle