Ich versuche ein Histogramm mit einigen Daten darin unter Verwendung scipy.optimize.curve_fit
anzupassen. Wenn ich einen Fehler in y
hinzufügen möchte, kann ich einfach einen weight
auf die Anpassung anwenden. Aber wie kann man den Fehler in x
anwenden (d. H. Der Fehler wegen Binning im Falle von Histogrammen)?Korrekte Anpassung mit scipy curve_fit einschließlich Fehler in x?
Meine Frage gilt auch für Fehler in x
bei einer linearen Regression mit curve_fit
oder polyfit
; Ich weiß, wie man Fehler in y
hinzufügt, aber nicht in x
.
Hier ein Beispiel (zum Teil aus dem matplotlib documentation):
import numpy as np
import pylab as P
from scipy.optimize import curve_fit
# create the data histogram
mu, sigma = 200, 25
x = mu + sigma*P.randn(10000)
# define fit function
def gauss(x, *p):
A, mu, sigma = p
return A*np.exp(-(x-mu)**2/(2*sigma**2))
# the histogram of the data
n, bins, patches = P.hist(x, 50, histtype='step')
sigma_n = np.sqrt(n) # Adding Poisson errors in y
bin_centres = (bins[:-1] + bins[1:])/2
sigma_x = (bins[1] - bins[0])/np.sqrt(12) # Binning error in x
P.setp(patches, 'facecolor', 'g', 'alpha', 0.75)
# fitting and plotting
p0 = [700, 200, 25]
popt, pcov = curve_fit(gauss, bin_centres, n, p0=p0, sigma=sigma_n, absolute_sigma=True)
x = np.arange(100, 300, 0.5)
fit = gauss(x, *popt)
P.plot(x, fit, 'r--')
Nun, diese passen (wenn er nicht ausfällt) hält die y-Fehler sigma_n
, aber ich habe keine Möglichkeit gefunden mach es in Betracht ziehen sigma_x
. Ich scannte ein paar Threads auf der scipy Mailingliste und fand heraus, wie man den absolute_sigma
Wert und einen Beitrag auf Stackoverflow über asymmetrical errors verwendet, aber nichts über Fehler in beiden Richtungen. Ist es möglich zu erreichen?
Ich weiß nicht, ob curve_fit Fehler in x verarbeiten kann aber scipy.optimize.odr tut. Tatsächlich führt sie eine orthogonale Distanzregression statt einfacher einfacher Quadrate für die abhängige Variable durch. –
Vielen Dank für Ihren Kommentar! Ich habe keine andere Fit-Funktion gefunden (odr ist übrigens in scipy.odr, nicht in scipy.optimize.odr). Es funktioniert perfekt, danke! Wenn Sie Ihren Kommentar als Antwort posten, nehme ich ihn gerne als Lösung an. :-) – Zollern
@ChristianK. Sie könnten Ihren Kommentar als Antwort posten ... –