如何使用kapteyn.kmpfit

时间:2017-05-18 12:20:06

标签: python scipy curve-fitting

我尝试为具有两个独立变量的模型计算置信带。

我使用kapteyn包中的kmpfit来优化参数并计算置信带。 confidence_band函数似乎不适用于具有多个独立参数的模型。有谁知道如何解决这个问题?

对于具有一个独立参数的模型,一切都按预期工作,没有任何问题:

from kapteyn import kmpfit
import numpy as np
import matplotlib.pyplot as plt 


#linear 1d model
def model_1d(p, x):
    a = p[0]
    b = p[1]
    return a*x + b


#data
x = np.array([0, 10, 20, 30])
y  = np.array([1.1, 1.8, 3.2, 3.0])

#optimizing parameters a and b with kmpfit
p0 = [0, 0] #start values for parameters a and b
f = kmpfit.simplefit(model_1d, p0, x, y)    


#calculation of confidence band

derivatives_a = x #1st derivative of a is x
derivatives_b = np.array([1, 1, 1, 1]) #1st derivative of b is always 1
dfdp = [derivatives_a, derivatives_b]

yhat, upper, lower = f.confidence_band(x, dfdp, 0.95, model_1d)


#plots
plt.plot(x,yhat) #plot fitted model
plt.plot(x,upper,'--') #plot upper confidence band
plt.plot(x,lower,'--') #plot lower confidence band
plt.plot(x,y,'.r') #plot data points

该脚本运行良好。因此,您会看到具有上下置信带的拟合模型: plot with upper and lower confidence bands

下面,代码稍微改为2D模型,即有两个独立变量。此代码不再起作用:

from kapteyn import kmpfit
import numpy as np

#linear with two independent variables x[0] amd x[1]
def model_2d(p, x):
    a = p[0]
    b = p[1]
    return a*x[0] + b*x[1]


#data
x = np.array([[0, 10, 20, 30], [0, 10, 20, 30]])
y  = [1.1, 1.8, 3.2, 3.0]

#optimizing parameters a and b with kmpfit
p0 = [0, 0] #start values for parameters a and b
f = kmpfit.simplefit(model_2d, p0, x, y)    


#calculation of confidence band

derivatives_a = x[0,:] #1st derivative of a is x[0]
derivatives_b = x[1,:] #1st derivative of b is x[1]
dfdp = [derivatives_a, derivatives_b]

yhat, upper, lower = f.confidence_band(x, dfdp, 0.95, model_2d)

对于2D模型,使用simplefit进行参数优化仍然有效。 然而,置信带的置信带的计算不再起作用。 我得到以下错误消息,表明numpy数组x的形状产生问题(但是,相同的x适用于simplefit):

File "tmp.py", line 25, in <module>
    yhat, upper, lower = f.confidence_band(x, dfdp, 0.95, model_2d)
  File "src/kmpfit.pyx", line 845, in kmpfit.Fitter.confidence_band 
(src/kmpfit.c:8343)

如果您有任何想法如何解决这个问题或者是否有其他可用的python包,我将非常感谢。 谢谢!

1 个答案:

答案 0 :(得分:1)

您可能会发现lmfit(http://lmfit.github.io/lmfit-py/)对此很有用。它具有强大但易于使用的曲线拟合方法及其Model类,并且还支持在每个参数上放置边界和约束。

通常,使用快速且通常可靠的反转曲率矩阵的方法来计算所有变量的不确定性和变量对之间的相关性。对于更详细的不确定性(包括任何指定的'sigma'级别的置信度),它还允许直接(如果稍微慢一点)探索任何变量的置信水平,并且可以帮助您制作卡方的二维映射一对 变量。

更具体地说,我认为你要求的是从变量的不确定性中产生模型y中的不确定性。 Lmfit的Model类有一个eval_uncertainty()方法来执行此操作。看到 http://lmfit.github.io/lmfit-py/model.html#calculating-uncertainties-in-the-model-function举个例子。