2014-09-26 12 views
13

Ben scipy.optimize.curve_fit kullanarak bazı verilerle bir histogram sığdırmak için çalışıyorum. y içinde bir hata eklemek istiyorsanız, bunu weight uygulayarak sığdırmak için bunu yapabilirim. Ancak, x numaralı hatayı nasıl uygulayacağınız (yani, histogramlar durumunda binning nedeniyle oluşan hata)?X hatası hataları dahil olmak üzere scipy curve_fit ile doğru uydurma?

Benim sorum da curve_fit veya polyfit ile doğrusal bir gerileme yaparken x hatalar için de geçerlidir; y'da hata ekleyebileceğimi biliyorum, ancak x'da değil. İşte

(kısmen matplotlib documentation itibaren) bir örnek:

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

Şimdi, bu uyum (başarısız olmaması durumunda) y-hatalarını sigma_n düşünün, ama ben bir yolu bulamadı sigma_x'u düşünün. Ben scipy posta listesinde parçacığı birkaç taranmış ve her iki yönde de hatalar hakkında absolute_sigma değeri ve asymmetrical errors hakkında Stackoverflow bir yazı, başka bir şey nasıl kullanılacağını öğrendim. Ulaşmak mümkün mü?

+0

ben curve_fit x hataları işleyebilir olmadığını biliyorum ama scipy.optimize.odr yapar yoktur. Aslında bağımlı değişken üzerinde basit en küçük kareler yerine ortogonal mesafe regresyonu yapar. –

+0

Yorumunuz için teşekkür ederiz! Başka bir uygun işlev bulamadım (odr scipy.odr içinde, bu arada scipy.optimize.odr içinde değil). Mükemmel çalışıyor, teşekkürler! Yorumunuzu cevap olarak gönderirseniz, bunu bir çözüm olarak kabul etmekten mutluluk duyarız. :-) – Zollern

+0

@ChristianK. Yorumunuzu cevap olarak gönderebilirsiniz ... –

cevap

15

scipy.optmize.curve_fit standart doğrusal olmayan en küçük kareler optimizasyonu kullanır ve bu nedenle tek tepki değişkenleri sapmayı en aza indirir. Bağımsız değişkendeki bir hataya sahip olmak istiyorsanız, ortogonal mesafe regresyonunu kullanan scipy.odr deneyebilirsiniz. Adından da anlaşılacağı gibi, hem bağımsız hem de bağımlı değişkenlerde en aza indirir.

aşağıdaki örnekte göz at. fit_type parametre scipy.odr tam ODR ( fit_type=0) ya da en küçük kareler optimizasyonu ( fit_type=2) sahip olup olmadıklarını tespit eder.

örneğin y verileri sadece eşit olmayan aralıklı indepenent değişken sonuçlandı gürültülü X verilere hesaplanmıştır çünkü, çok mantıklı değildi çalıştı, ancak DÜZENLEME. Şimdi, aynı zamanda, ağırlıkların yerine verilerin standart hatasını belirlemeye yarayan RealData'un nasıl kullanılacağını gösteren örneği güncelledim.

from scipy.odr import ODR, Model, Data, RealData 
import numpy as np 
from pylab import * 

def func(beta, x): 
    y = beta[0]+beta[1]*x+beta[2]*x**3 
    return y 

#generate data 
x = np.linspace(-3,2,100) 
y = func([-2.3,7.0,-4.0], x) 

# add some noise 
x += np.random.normal(scale=0.3, size=100) 
y += np.random.normal(scale=0.1, size=100) 

data = RealData(x, y, 0.3, 0.1) 
model = Model(func) 

odr = ODR(data, model, [1,0,0]) 
odr.set_job(fit_type=2) 
output = odr.run() 

xn = np.linspace(-3,2,50) 
yn = func(output.beta, xn) 
hold(True) 
plot(x,y,'ro') 
plot(xn,yn,'k-',label='leastsq') 
odr.set_job(fit_type=0) 
output = odr.run() 
yn = func(output.beta, xn) 
plot(xn,yn,'g-',label='odr') 
legend(loc=0) 

fit to noisy data

+1

Nice answer! 'Output.sd_beta' ile' np.sqrt (np.diag (output.cov_beta)) 'arasındaki farkı biliyor musunuz? Parametrelerdeki belirsizliklere hangisi karşılık gelir? – Ger

+0

Teşekkürler. Scipy belgeleri orijinal belgeye başvurur. Bütün bilgiler orada olmalı. Parametreler üzerinde belirsizlik olarak sd_beta kullanıyorum. –

+0

Aslında sb_beta ve cov_beta nedeniyle scipy veya ODR'de bir hata vardır. Bunun http://stackoverflow.com/questions/41028846/how-to-compute-standard-error-from-odr-results – Ger

İlgili konular