在python中只使用具有许多参数的函数的一个参数

lov*_*eed 32 python curve-fitting scipy

在python中我有一个有很多参数的函数.我想将此函数适用于数据集,但只使用一个参数,我想要自己提供的其余参数.这是一个例子:

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

for b in xrange(10):
   popt,pcov = curve_fit(func,x1,x2)
Run Code Online (Sandbox Code Playgroud)

在这里我希望仅适用于拟合a,参数b采用循环变量的值.如何才能做到这一点?

Ant*_*zov 41

你可以func用lambda 包装,如下所示:

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

for b in xrange(10):
   popt,pcov = curve_fit(lambda x, a: func(x, a, b), x1, x2)
Run Code Online (Sandbox Code Playgroud)

lambda是一个匿名函数,在Python中只能用于简单的一行函数.基本上,它通常用于在不需要为函数指定名称时减少代码量.官方文档中给出了更详细的描述:http://docs.python.org/tutorial/controlflow.html#lambda-forms

在这种情况下,lambda用于修复其中一个参数func.新创建的函数只接受两个参数:xa,而b固定为从局部b变量获取的值.然后将此新函数curve_fit作为参数传递.


M N*_*lle 6

更好的方法是使用lmfit,它为曲线拟合提供了更高级别的接口。在其他功能中,Lmfit 使拟合参数成为可以有边界或显式固定(以及其他功能)的一流对象。

使用 lmfit,这个问题可以这样解决:

from lmfit import Model
def func(x,a,b):
   return a*x*x + b

# create model
fmodel = Model(func)
# create parameters -- these are named from the function arguments --
# giving initial values
params = fmodel.make_params(a=1, b=0)

# fix b:
params['b'].vary = False

# fit parameters to data with various *static* values of b:
for b in range(10):
   params['b'].value = b
   result = fmodel.fit(ydata, params, x=x)
   print(": b=%f, a=%f+/-%f, chi-square=%f" % (b, result.params['a'].value, 
                                             result.params['a'].stderr,
                                             result.chisqr))
Run Code Online (Sandbox Code Playgroud)