我正在使用lmfit来找到适合的置信区间,但它经常给我一个错误:ValueError: f(a) and f(b) must have different signs
这是一个最小的工作示例(运行几次以获取错误):
import lmfit
import numpy as np
def residual(p, X):
a1, a2, t1, t2 = [i.value for i in p.values()]
return a1*np.exp(-x/t1)+a2*np.exp(-x/t2)-y
if __name__ == '__main__':
x = np.linspace(0.3,10,100)
y = 3*np.exp(-x/2.)-5*np.exp(-x/10.)+0.2*np.random.randn(x.size)
p = lmfit.Parameters()
p.add_many(('a1', 5), ('a2', -5), ('t1', 2), ('t2', 5))
mi = lmfit.minimize(residual, p, args=(x,))
lmfit.printfuncs.report_fit(mi.params, show_correl=False)
ci, trace = lmfit.conf_interval(mi, sigmas=[0.68,0.95], trace=True, verbose=False)
lmfit.printfuncs.report_ci(ci)
为什么这样做?有工作吗?
由于
答案 0 :(得分:0)
我不知道具体的答案或解决方法。
我会将其报告为问题https://github.com/lmfit/lmfit-py/issues。
通过找到轮廓似然等于值的点来计算置信区间。这需要找到非线性函数的零或根。 这种方法通常提供比依赖局部导数更准确的置信区间,例如scipy的curve_fit。
为scipy的brentq指定适用于所有情况的边界通常很棘手。我的猜测是默认界限对你的例子来说太紧了。
我对该方法只有一般概念,但不知道lmfit中的具体代码。