我試圖用scipy.optimize.curve_fit
來擬合一些數據的直方圖。如果我想在y
中添加一個錯誤,我可以簡單地通過將weight
應用於適合。但是如何應用x
中的錯誤(即在直方圖情況下由於分箱而導致的錯誤)?scipy curve_fit的正確擬合,包括x中的錯誤?
我的問題也適用於x
的錯誤,當用curve_fit
或polyfit
進行線性迴歸時;我知道如何在y
中添加錯誤,但不在x
中。
下面的例子(部分來自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--')
現在,這種配合(當它不失敗)不會考慮在y錯誤sigma_n
,但我還沒有找到一種方法,使其考慮sigma_x
。我掃描了scipy郵件列表上的一些線程,並發現瞭如何使用absolute_sigma
值和Stackoverflow上關於asymmetrical errors的帖子,但沒有涉及雙向錯誤。是否有可能實現?
我不知道curve_fit是否能在X處理錯誤,但scipy.optimize.odr一樣。實際上,它對於因變量進行正交距離迴歸而不是簡單的最小二乘。 – 2014-09-26 12:35:40
感謝您的評論!我沒有找到另一個適合的函數(順便說一下,odr在scipy.odr中,而不是在scipy.optimize.odr中)。它完美的工作,謝謝!如果您發表評論作爲答案,我很樂意接受它作爲解決方案。 :-) – Zollern 2014-09-27 11:22:05
@ChristianK。你可以發表你的評論作爲答案... – 2014-09-28 09:03:06