Frage

Ich bin auf der Suche nach einer nicht-linearen Kurvenanpassungsroutine (wahrscheinlich am ehesten in R oder Python gefunden werden, aber ich bin offen für andere Sprachen), die x, y-Daten nehmen und eine Kurve, um es zu passen.

Ich sollte als String den Typ des Ausdrucks I angepasst werden soll angeben können.

Beispiele:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

Was würde ich aus diesem zumindest die Werte für die Konstanten (A, B, C, etc.) Und hoffentlich Statistiken über die Fitness des Spiels.

Es gibt kommerzielle Programme, dies zu tun, aber ich voraussichtlich in der Lage sein, etwas so häufig zu finden wie in einer Sprache Bibliothek heutzutage auf einen gewünschten Ausdruck paßt. Ich vermute, SciPy Optimierungs Sachen der Lage sein könnten, dies zu tun, aber ich kann nicht sehen, dass es läßt mich eine Gleichung definieren. Ebenso kann ich nicht genau zu finden scheinen, was ich in R wollen.

Ist das, was ich suche da draußen, oder muss ich meine eigene Rolle? Ich hasse es zu tun, wenn es da ist und ich nur Probleme, es zu finden.


Edit: Ich möchte dies über den Prozess für ein bisschen mehr Kontrolle tun, als ich von LAB Fit bekommen. Die LAB Fit UI ist schrecklich. Ich möchte auch in der Lage sein den Bereich in mehrere Stücke zu brechen und haben unterschiedliche Kurven, die die verschiedenen Teile des Bereichs darstellen. Am Ende das Ergebnis (Speed-wise) schlug eine LUT mit linearer Interpolation zu können, hat oder ich bin nicht interessiert.

In meiner aktuellen Reihe von Problemen, ich habe trigonometrische Funktionen oder exp () und ich brauche sie 352.800 Mal pro Sekunde in Echtzeit auszuführen (und nur einen Bruchteil der CPU verwenden). Also habe ich die Kurve plotten und die Daten verwenden, um die Kurve zu fahren fitter weniger teuer Annäherungen zu bekommen. In den alten Tagen, waren LUTs fast immer die Lösung, aber heutzutage die Speicher Lookups Skipping und eine Annäherung zu tun ist manchmal schneller.

War es hilfreich?

Lösung

Um Ihre Frage in einem allgemeinen Sinn (in Bezug auf die Parameterschätzung in R) zu beantworten, ohne die Besonderheiten der Gleichungen Erwägen Sie wies darauf hin, ich glaube, Sie suchen nach nls () oder Optim () ... ‚nls‘ ist mein erste Wahl, da sie Fehlerschätzungen für jeden geschätzten Parameter liefert, und wenn es nicht ich ‚Optim‘. Wenn Sie Ihre x, y Variablen:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

die Koeffizienten zu erhalten, so etwas wie

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

Wenn Sie die Standardfehler im Fall von ‚nls‘ wollen,

summary(out)$parameters

Die Hilfedateien und r-Hilfe Mailingliste Beiträge enthalten viele Diskussionen über spezifische Minimierungsalgorithmen von jedem implementiert (der Standard in jedem Beispielfall verwendet oben) und deren Eignung für die spezifische Form der Gleichung auf der Hand. Bestimmte Algorithmen können Box Constraints handhaben, und eine andere Funktion aufgerufen constrOptim (), wird eine Reihe von linearen Constraints handhaben. Diese Website kann auch helfen:

http://cran.r-project.org/web/views/ Optimization.html

Andere Tipps

Ihr erstes Modell ist eigentlich linear in den drei Parametern und fit in R sein mit

 fit <- lm(y ~ x + I(x^2), data=X)

, die Sie Ihre drei Parameter erhalten.

Das zweite Modell kann auch fit mit nls() in R sein mit den üblichen Einschränkungen von schaffen Startwerte usw. Die statistische Probleme bei der Optimierung ist nicht unbedingt das gleiche wie die numerische Themen - Sie jede funktionale Form nicht nur optimieren, egal welche Sprache Sie wählen

.

Schauen Sie sich GNU Octave - zwischen seinem polyfit () und der nicht-lineare Zwänge Solver es sollte möglich sein, etwas für Ihr Problem zu konstruieren.

R, das ist ganz einfach.

Die in Verfahren gebaut heißt Optim (). Es nimmt als Argument einen Ausgangsvektor von möglichen Parametern, dann einer Funktion. Sie müssen Ihre eigene Fehlerfunktion gehen zu bauen, aber das ist wirklich einfach.

Dann rufen Sie es mögen out = Optim (1, err_fn)

Dabei gilt err_fn heißt

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

Dies ist nur vorausgesetzt, dass Sie haben einen Vektor von x und y-Werte in eckses und Daten. Ändern Sie die model_y Linie, wie Sie sehen, passen, noch mehr Parameter hinzuzufügen.

Es ist auf nicht-lineare funktioniert gut, ich benutze es für vierdimensionale e ^ x Kurven und es ist sehr schnell. Die Ausgangsdaten enthalten den Fehlerwert am Ende der Armatur, die ein Maß dafür, wie gut sie paßt, als eine Summe von quadrierten Differenzen gegeben (in meinem err_fn).

EDIT: Wenn Sie als Zeichenfolge im Modell nehmen, dann können Sie Ihre Benutzeroberfläche diesen ganzen Modell Anpassungsprozess als R-Skript konstruieren und es in zu laufen laden. R kann Text aus STDIN oder aus einer Datei übernehmen, so dass es nicht zu hart sein, sollte diese Funktion der entsprechenden Zeichenfolge Handwerk, und hat es automatisch ausgeführt optim.

Du bist wahrscheinlich nicht eine einzige Routine mit der Flexibilität in Ihren Beispielen (Polynomen und rationalen Funktionen mit der gleichen Routine) implizierte finden gehen, geschweige denn eine, die einen String, um herauszufinden, welche Art von Gleichung fit analysieren wird.

Ein Least-Squares-Polynom fitter wäre angemessen für Ihr erstes Beispiel. (Es ist an Ihnen, welchen Grad Polynom zu verwenden - quadradic, kubisch, quartic, etc.). Für eine rationale Funktion wie Ihr zweites Beispiel, könnten Sie müssen „Ihre eigene Rolle“, wenn Sie keine passende Bibliothek finden. bedenken Sie auch, dass ein ausreichend hoher Grad Polynom verwendet werden können Ihre „echte“ Funktion, solange man zu extrapolieren, müssen nicht annähernd über die Grenzen des Datensatzes Sie sind passend zu.

Wie andere haben festgestellt, gibt es andere, allgemeinere Parameterschätzalgorithmen, die auch als nützlich erweisen könnten. Aber diese Algorithmen sind nicht ganz „plug and play“: sie in der Regel erforderlich, dass Sie einige Hilfsroutinen zu schreiben, und liefern eine Liste der Anfangswerte für die Modellparameter. Es ist möglich, für diese Art von Algorithmen zu divergieren, oder dir in einem lokalen Minimum oder Maximum für eine unglückliche Wahl der anfänglichen Parameterschätzungen fest.

Wenn Sie Einschränkungen für Ihre Koeffizienten haben, und Sie wissen, dass es eine bestimmte Art von Funktion, die Sie auf Ihre Daten passen wollen würden und diese Funktion ist ein unordentlich, wo Standard-Regressionsverfahren oder andere Kurve Methoden passend werden nicht Arbeit, Sie haben genetische Algorithmen?

betrachtet

Sie sind nicht meine erste Wahl, aber wenn Sie versuchen, die Koeffizienten der zweiten Funktion zu finden, die Sie erwähnt, dann vielleicht würde GAs arbeiten --- vor allem, wenn Sie Nicht-Standard-Metriken verwenden beste Lösung zu bewerten. zum Beispiel, wenn Sie die Koeffizienten „(A + Bx + Cx ^ 2) / (Dx + Ex ^ 2)“, so dass die Summe der quadratischen Differenzen zwischen Funktion und Daten ist minimal und , dass es auf der Bogenlänge der resultierenden Funktion einige Einschränkung sein, dann ein stochastischer Algorithmus könnte ein guter Weg, dies zu nähern.

einige Einschränkungen: 1) stochastische Algorithmen werden keine Garantie für die am besten Lösung, aber sie werden oft sehr nahe. 2) Sie müssen vorsichtig sein, um die Stabilität des Algorithmus.

auf einer längeren Note, wenn Sie in der Phase sind, wo Sie eine Funktion aus einem Raum von Funktionen finden möchten, dass am besten für Ihre Daten (zB Sie gehen zu verhängen nicht, sagen wir, das zweite Modell auf Ihre Daten) , dann genetische Programmiertechniken kann auch helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top