Orthogonale regression fitting in scipy-least-squares-Methode
Den leastsq Methode in scipy lib passt eine Kurve, um einige Daten. Und diese Methode impliziert, dass in diesen Daten die Y-Werte abhängig von X-argument. Und berechnet den minimalen Abstand zwischen Kurve und die Daten zeigen in der Y-Achse (dy)
Aber was ist, wenn ich brauche zu berechnen minimalen Abstand in beiden Achsen (dy und dx)
Gibt es einige Möglichkeiten zur Umsetzung dieser Berechnung?
Hier ist ein Beispiel des Codes, wenn eine Achse Berechnung:
import numpy as np
from scipy.optimize import leastsq
xData = [some data...]
yData = [some data...]
def mFunc(p, x, y):
return y - (p[0]*x**p[1]) # is takes into account only y axis
plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData))
print plsq
Ich habe vor kurzem versucht scipy.odr Bibliothek und es gibt die richtigen Ergebnisse nur für die lineare Funktion. Für andere Funktionen wie y=a*x^b es gibt falsche Ergebnisse. Dies ist, wie ich es verwenden:
def f(p, x):
return p[0]*x**p[1]
myModel = Model(f)
myData = Data(xData, yData)
myOdr = ODR(myData, myModel , beta0=[1,1])
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq
out = myOdr.run()
out.pprint()
Dieser liefert falsche Ergebnisse, die nicht erwünscht sind, und in einigen input-Daten nicht einmal annähernd real.
Kann sein, es gibt einige spezielle Möglichkeiten, es zu benutzen, was mache ich falsch?
- Scipy hat ein Modul für "Orthogonal Distance Regression" - ist es das, was Sie brauchen? docs.scipy.org/doc/scipy/reference/odr.html
- Ja, es scheint, um dieses problem zu beheben, aber wenn ich versuche, es liefert das gleiche Ergebnis wie leastsq Methode. Ich folgte dem Beispiele, die gegeben sind in der Dokumentation, und es nicht funktioniert, wie gebraucht. Hast du einige Beispiele?
- Wenn ich es versuchte ich fand, dass die Ergebnisse waren ähnlich, aber nicht identisch sind - bin ich davon ausgegangen, dass einfach nur gemeint, dass die zusätzliche Berechnung nicht viel Unterschied zu der Passform.
- Ich habe Es! Ich habe die Lösung gefunden. Das problem war in ungeeigneter anfänglicher Vermutungen für odr-solver(beta0-parameter).
Du musst angemeldet sein, um einen Kommentar abzugeben.
scipy.odr
implementiert Orthogonal Distance Regression. Siehe die Anweisungen für die Grundfunktionen im docstring:https://github.com/scipy/scipy/blob/master/scipy/odr/odrpack.py#L27
scipy.odr
Euch gibt falsche Ergebnisse?Habe ich die Lösung gefunden. Scipy Odrpack funktioniert noramally aber es braucht eine gute Schätzung für die richtigen Ergebnisse. Also ich unterteilt den Prozess in zwei Schritte.
Erste Schritt: finden Sie die anfänglichen raten von der Verwendung ordinaty least-squares-Verfahren.
Zweite Schritt: substitude diese erste Vermutung in ODR als parameter beta0.
Und es funktioniert sehr gut mit einer akzeptablen Geschwindigkeit.
Danke Jungs, Ihr Rat verwies mich auf die richtige Lösung
Wenn Sie in der Lage sind, invertieren die Funktion beschrieben durch p können Sie nur x-pinverted(y) in mFunc, ich denke mal, so sqrt(a^2+b^2), so (pseudo-code)
beispielsweise für
Aber, was Sie Fragen, ist in einigen Fällen problematisch. Zum Beispiel, wenn ein Polynom (oder Ihre x^j) - Kurve hat ein minimum ym y(m) und Sie haben einen Punkt x,y niedriger als die ym, welche Art von Wert Sie zurückgeben möchten? Es gibt nicht immer eine Lösung.