如何使用不对称误差条拟合曲线?

时间:2016-06-28 13:48:20

标签: scipy curve-fitting

我通过一系列计算机模拟获得了一些数据,结果可能是1和0.他们有不对称的错误栏。

即:

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显然只期望标准派生sigma作为参数。如何考虑非对称误差条来拟合曲线?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

curve_fit()接受从SciPy 0.17.0开始的bounds参数。