Scipy Curve_fit。多个参数的单独边界
Scipy Curve_fit. Separate bounds for multiple parameters
我正在使用 Scipy 将我的数据拟合到一个函数中。该函数为我提供了 2 个参数的值,在本例中为 a 和 b 。我想使用绑定参数来限制这些参数可以取的值,每个参数都有自己的可接受值范围。
可接受的值:15< a <50 和 0.05< b <0.2
我想知道如何实现它们。官方文档只展示了如何为 1 个参数执行它们。本题类似于:Python curve fit library that allows me to assign bounds to parameters。这也只处理 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)))
但是对于所有这些变体我都得到了相同的错误
ValueError: Each lower bound mush be strictly less than each upper
bound.
它仅适用于单个边界,例如:
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[0,50])
感谢任何帮助。
谢谢!
bounds=[[0,50],[0,0.3]])
表示第二个参数大于50小于0.3。第一个参数也固定为零。
格式为 bounds=(lower, upper).
根据@ev-br 的建议。我尝试对边界参数进行以下更改,效果很好。
bounds=[[15,0.02],[50,0.2]]
所以最后给出的参数应该是这样的:
bounds=[[a1,b1],[a2,b2]]
其中 a1 是 a 的下限,a2 是 a。 b 相同。
我正在使用 Scipy 将我的数据拟合到一个函数中。该函数为我提供了 2 个参数的值,在本例中为 a 和 b 。我想使用绑定参数来限制这些参数可以取的值,每个参数都有自己的可接受值范围。
可接受的值:15< a <50 和 0.05< b <0.2
我想知道如何实现它们。官方文档只展示了如何为 1 个参数执行它们。本题类似于:Python curve fit library that allows me to assign bounds to parameters。这也只处理 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)))
但是对于所有这些变体我都得到了相同的错误
ValueError: Each lower bound mush be strictly less than each upper bound.
它仅适用于单个边界,例如:
params,extras = curve_fit(Ebfit,time,Moment, p0=[20,0.1], bounds=[0,50])
感谢任何帮助。 谢谢!
bounds=[[0,50],[0,0.3]])
表示第二个参数大于50小于0.3。第一个参数也固定为零。
格式为 bounds=(lower, upper).
根据@ev-br 的建议。我尝试对边界参数进行以下更改,效果很好。
bounds=[[15,0.02],[50,0.2]]
所以最后给出的参数应该是这样的:
bounds=[[a1,b1],[a2,b2]]
其中 a1 是 a 的下限,a2 是 a。 b 相同。