带约束的Python曲线拟合



我一直在寻找带约束的Python曲线拟合。其中一个选项是使用lmfit模块,另一个选项则是使用惩罚来强制执行约束。我在下面的代码中尝试强制使用a+b=3.6作为约束。换句话说,在我的情况下,当x=1x时的y=3.6总是>=1

import numpy as np
import scipy.optimize as sio
def func(x, a, b, c):
return a+b*x**c
x = [1, 2, 4, 8, 16]
y = [3.6, 3.96, 4.31, 5.217, 6.842]
lb = np.ones(3, dtype=float)
ub = np.ones(3, dtype=float)*10.
popt, pcov = sio.curve_fit(func, x, y)
print(popt)

理想情况下,我想使用lmfit方法,并花了大量时间试图理解示例,但未能成功。有人能举个例子吗?

如果我正确理解你的问题,你想用对一些数据建模

def func(x, a, b, c):
return a+b*x**c

对于一组特定的数据,您希望施加CCD_ 7的约束。你可以,只是";硬接线;,将功能更改为

def func2(x, b, c):
a = 3.6 - b
return a+b*x**c

现在有了一个只有两个变量的模型函数:bc

这不是很灵活,但会奏效。

使用lmfit可以恢复一些灵活性。要进行完全不受约束的拟合,您可以说

from lmfit import Model
mymodel = Model(func)
params = mymodel.make_params(a=2, b=1.6, c=0.5)
result = mymodel.fit(y, params,  x=x)

(顺便说一句:scipy.optimize.curve_fit允许您不指定参数的初始值,并在不通知您的情况下隐式地将其设置为1。这是一个可怕的错误特性-总是给出初始值(。

如果你确实想施加约束a+b=3.6,那么你可以进行

params['a'].expr = '3.6-b'
result2 = mymodel.fit(y, params, x=x)
print(result2.fit_report())

当我对你提供的数据进行处理时,它会打印(注意,它报告的是2个变量,而不是3个(:

[[Model]]
Model(func)
[[Fit Statistics]]
# fitting method   = leastsq
# function evals   = 34
# data points      = 5
# variables        = 2
chi-square         = 0.01066525
reduced chi-square = 0.00355508
Akaike info crit   = -26.7510142
Bayesian info crit = -27.5321384
[[Variables]]
a:  3.28044833 +/- 0.04900625 (1.49%) == '3.6-b'
b:  0.31955167 +/- 0.04900626 (15.34%) (init = 1.6)
c:  0.86901253 +/- 0.05281279 (6.08%) (init = 0.5)
[[Correlations]] (unreported correlations are < 0.100)
C(b, c) = -0.994

您的代码暗示使用(但实际上没有使用(参数值的上限和下限。lmfit和也有可能

params['b'].min = 1
params['b'].min = 10

等等。我不确定你在这里是否需要它们,我会提醒你不要试图把边界设置得太紧。

最新更新