Próbuję dopasować histogram z niektórych danych w nim przy użyciu scipy.optimize.curve_fit
. Jeśli chcę dodać błąd w y
, mogę to zrobić, nakładając na dopasowanie weight
. Ale jak zastosować błąd w x
(np. Błąd związany z binowaniem w przypadku histogramów)?Prawidłowe dopasowanie za pomocą scipy curve_fit z błędami x?
Moje pytanie dotyczy również błędów w x
podczas regresji liniowej z curve_fit
lub polyfit
; Wiem, jak dodawać błędy w y
, ale nie w x
.
Oto przykład (częściowo z 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--')
Teraz, to pasuje (gdy nie powiedzie) uważa Y błędy sigma_n
, ale nie znalazłem sposób zmusić go do rozważenia sigma_x
. Przeskanowałem kilka wątków na liście dyskusyjnej scipy i dowiedziałem się, jak używać wartości absolute_sigma
i posta na Stackoverflow o asymmetrical errors, ale nic o błędach w obu kierunkach. Czy można to osiągnąć?
nie wiem czy curve_fit może obsługiwać błędy w x ale scipy.optimize.odr robi. W rzeczywistości zajmuje regresję ortogonalną, a nie proste najmniejsze kwadraty na zmiennej zależnej. –
Dziękuję za komentarz! Nie znalazłem innej funkcji dopasowania (odr jest w scipy.odr, nawiasem mówiąc, nie w scipy.optimize.odr). Działa doskonale, dzięki! Jeśli umieścisz swój komentarz jako odpowiedź, chętnie zaakceptuję go jako rozwiązanie. :-) – Zollern
@ Christiana. możesz opublikować swój komentarz jako odpowiedź ... –