2016-06-28 42 views
1

作爲一系列計算機模擬的結果,我得到了一些數據,結果可能爲1和0.他們有不對稱的錯誤條。如何用不對稱誤差線擬合曲線?

IE:

xdata = [...] 
pdata = [...] 
pdatamax = [...] 
pdatamin = [...] 

我想,以適應S形曲線,以我的數據,並試圖這樣做使用scipy.optimize.curve_fit1功能:

def sigmoid(x,x0,k): 
     y = 1./(1+np.exp(-k*(x-x0))) 
     return y 

popt, pcov = curve_fit(sigmoid, xdata, ydata) 

curve_fit顯然只期望標準偏差σ相一個論點。考慮到不對稱誤差棒,我如何擬合曲線?

+0

你能提供一些數據嗎? – Cleb

+0

我是否正確,基本上有非對稱誤差棒的數據? – cmmnn

回答

0

最簡單的方法是使用lmfit。 https://lmfit.github.io/lmfit-py/

它帶有功能使用SciPy的程序與指定的「參數」的對象,它允許您指定要運行最小平方擬合變化/不變化,最小/最大和複雜的關係:

%pylab inline 
import lmfit 

def sigmoid(x,x0,k): 
     y = 1./(1+np.exp(-k*(x-x0))) 
     return y 

x = linspace(0,10,100) 
x0 = 1 
k = 1 
y = sigmoid(x, x0, k) 
noise = (np.random.rand(100) - 0.5)/20 
y_data = y + noise 

def residuals(params, x, y_data): 
    x0 = params['x0'].value 
    k = params['k'].value 
    y_calc = sigmoid(x, x0, k) 
    return y_data - y_calc 

parameters = lmfit.Parameters() 
parameters.add("x0", value=1, vary=True, min=0.1, max=2.0) 
parameters.add("k", value=1, vary=True, min=0.1, max=2.0) 

result = lmfit.minimize(residuals, parameters, args=(x, y_data)) 
lmfit.report_fit(result.params) 

plot(x, y_data) 
plot(x, sigmoid(x, result.params['x0'].value, result.params['k'].value)) 

輸出:

Populating the interactive namespace from numpy and matplotlib 
[[Variables]] 
    x0: 1.01570966 +/- 0.012437 (1.22%) (init= 1) 
    k: 0.99250215 +/- 0.012903 (1.30%) (init= 1) 
[[Correlations]] (unreported correlations are < 0.100) 
    C(x0, k)      = 0.355 

enter image description here

0

curve_fit()接受01從SciPy 0.17.0開始的參數。

+1

'bounds'參數是關於擬合參數的邊界,而不是關於誤差邊界。 – goethin