Scipy Curve_fit. 多个参数的分离边界。

5

我正在使用Scipy将我的数据拟合到一个函数。该函数会给出2个参数的值,这里是ab。我想使用bound参数来限制这些参数可以取的值,它们各自都有一定范围内可接受的值。

可接受的值:15 < a < 50 和 0.05 < b < 0.2

我想知道如何实现它们。官方文档仅展示了如何对1个参数进行设定。这个问题与 Python曲线拟合库允许我为参数分配边界类似。该问题也仅解决了1个参数的边界问题。

以下是我尝试过的:

def Ebfit(x,a,b):
    Eb_mean = a*(0.0256/kt)                         # Eb at bake temperature
    Eb_sigma = b*Eb_mean
    Foursigma =  4*Eb_sigma
    Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device)
    dEb = Eb_a[1] - Eb_a[0]
    pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma)

    ## Retention Time

    DMom = np.zeros(len(x),float)
    tau = (1/f0)*np.exp(Eb_a)
    for bb in range(len(x)):
        DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb))
    return DMom

time = datafile['time'][0:501]
Moment = datafile['25Oe'][0:501]

params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[(15,50),(0.05,0.2)])

我还尝试了以下变化,以查看括号是否是问题:

 params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[[15,50],[0.02,0.2]])
 params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=((15,50),(0.02,0.2)))

但是我对所有这些变化都得到同样的错误

值错误: 每个下限必须严格小于每个上限。

仅适用于单个界限,例如:

params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[0,50])

非常感谢您的帮助。

谢谢!


curve_fit.bounds文档的哪些部分不清楚,以至于您不明白如何操作?请注意,文档中提到的是“2- tuple数组”,因此您可能需要将内部列表更改为元组。 - user707650
@Evert 嘿,是的,我也试过了。但我仍然得到相同的错误。我已经编辑了问题并包含了我尝试过的内容。 - xplodnow
2个回答

8

bounds=[[0,50],[0,0.3]]) 表示第二个参数大于50但小于0.3。同时,第一个参数固定为零。

格式为 bounds=(下限, 上限)。


啊,我明白你的意思了。所以应该是:bounds = [[15,0.05],[50,0.2]]。 - xplodnow

3
根据@ev-br的建议,我尝试了对bounds参数进行以下更改,效果非常好。
bounds=[[15,0.02],[50,0.2]]

所以最终,应该给出如下论点:
 bounds=[[a1,b1],[a2,b2]]

其中a1a的下限,a2a的上限。对于b也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接