python中的多个参数

时间:2015-03-10 16:55:00

标签: python

我正在使用内置的Levenberg-Marquardt算法来拟合一些数据。它调用一些需要具有语法foo(x,a1,a2,...,an)的函数,其中a是参数,输入参数的数量指定L-M算法最小化的维数。目前这个foo函数调用我定义的其他函数:

foo(x, a1, a2, ..., an):
    ai = [a1,a2,...,an]
    result = somefun(x,ai)
    return result

在这种情况下,有没有办法使用紧凑的语法?我希望能够定义一些参数L = n,它指定函数定义之前某处的输入参数的数量。

  

注意:另请注意,使用foo(x,*ai)时,会在标记为重复之前生成ValueError: Unable to determine number of fit parameters

3 个答案:

答案 0 :(得分:2)

使用*args语法:

foo(x, *args):
    result = somefun(x, args)
    return result

这会抓取除x之外的所有参数,并将它们存储在元组args中。

答案 1 :(得分:1)

您应该在问题中指明您使用的功能来自scipy,而不是标准库的一部分。

来自scipy.optimize.curve_fit的文档字符串:

optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False, check_finite=True, **kw)
...
Parameters
----------

f : callable
The model function, f(x, ...).  It must take the independent
variable as the first argument and the parameters to fit as
separate remaining arguments.

xdata : An M-length sequence or an (k,M)-shaped array
for functions with k predictors.
The independent variable where the data is measured.

ydata : M-length sequence
The dependent data --- nominally f(xdata, ...)

p0 : None, scalar, or N-length sequence
Initial guess for the parameters.  If None, then the initial
values will all be 1 (**if the number of parameters for the function
can be determined using introspection, otherwise a ValueError
is raised**).
...

使用foo(x,* args)构造,参数的数量无法通过内省确定,因此您获得了ValueError,但仍然可以通过p0参数传递一系列初始值,将让算法知道参数的数量是该序列的长度。例如,

n=5
foo(x,*args):
    return somefun(x,args)
curve_fit(foo,x0,y0,p0=[1]*n)

答案 2 :(得分:0)

您正在使用的功能scipy.optimize.curve_fit,如果您未将初始猜测作为{{1}传递,则只需要内省f来查找参数数量参数。如果你能提供一个好的猜测,那就这样做;否则,你可以猜测所有的:

p0

然后您可以使用scipy.optimize.curve_fit(f, xdata, ydata, p0=[1]*n) 语法。

如果由于某种原因你真的需要def f(x, *args)拥有独立指定的位置参数,我会使用f。这不是一个好主意,但在这种情况下,可能是有道理的。

exec