我正在使用内置的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
。
答案 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