使用scipy.optimize.curve_fit传递额外参数?

17

我正在使用Python编写一个程序,用于将高斯和洛伦兹形状拟合到一些给定的共振数据上。起初我使用了scipy.optimize.leastsq,但在从协方差矩阵中检索优化参数的误差时遇到了困难,之后改用了optimize.curve_fit

我已经定义了一个函数来拟合高斯和洛伦兹的总和:

def mix(x,*p):
    ng = numg
    p1 = p[:3*ng]
    p2 = p[3*ng:]
    a = sumarray(gaussian(x,p1),lorentzian(x,p2))
    return a

在这里,p是拟合参数的初始猜测数组。以下是使用curve_fit调用的实例:

leastsq,covar = opt.curve_fit(mix,energy,intensity,inputtot)

目前,numg(高斯形状的数量)是一个全局变量。是否有任何方法可以将其作为额外参数纳入到curve_fit中,就像使用leastsq一样?

2个回答

22

Python的伟大之处在于您可以定义返回其他函数的函数,尝试使用柯里化:

def make_mix(numg): 
    def mix(x, *p): 
        ng = numg
        p1 = p[:3*ng]
        p2 = p[3*ng:]
        a = sumarray(gaussian(x,p1),lorentzian(x,p2))
        return a
    return mix

然后

leastsq, covar = opt.curve_fit(make_mix(numg),energy,intensity,inputtot)

0

不必使用内部闭包,你也可以使用functools.partial进行柯里化:

leastsq, covar = opt.curve_fit(
    partial(mix, numg=my_constant),
    # ...
)

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