gpt4 book ai didi

python - 如何在 Python 中的 scipy.optimize.curve_fit 中设置变量参数?

转载 作者:行者123 更新时间:2023-12-02 17:12:29 24 4
gpt4 key购买 nike

我正在使用 scioy.optimize.curve_fit 在 Python 中做一个优化问题。 curve_fit 函数将输入作为 curve_fit(f, xdata, ydata, ...),其中可调用的 f 是模型函数 f(x, ...)。它必须将自变量作为第一个参数,并将适合的参数作为单独的剩余参数。

但是,在我的例子中,其余参数是可变的。例如,f 可以是 f = fun(indepent_var, a, b, c, d),或 f = fun(indepent_var, a, c, d)。

f 的实际参数由用户在求解优化问题时定义。例如,一个用户可能想要使用 a、b、c、d 作为参数,而另一个用户想要使用 a、c、d,而第三个用户可能使用 b、c。那么,我的问题是如何在f中设置可变参数,然后用户可以配置自己的参数?

def func(data, a, b, c, d):
return a * np.exp(-b * data) + c

#def func(data, a, c, d):
# return a * np.exp(-c * x)

popt, pcov = curve_fit(func, xdata, ydata)

"config_1.ini"
params_to_be_optimized = a, b, c, d

"config_2.ini"
params_to_be_optimized = a, c, d

我正在尝试做这样的事情:

def func(data, **kwards):
a = kwargs['a'] if a in kwargs else 0
...
return ...

popt, pcov = curve_fit(lambda(...), xdata, ydata)

但是我不知 Prop 体怎么解决这个问题。我想 lambda 函数可能有用,但谁能给我一个例子吗?

最佳答案

使用 curve_fit 文档中的示例:

In [260]: def func(x, a, b, c):
...: return a * np.exp(-b * x) + c
...:
In [261]: xdata = np.linspace(0, 4, 50)
...: y = func(xdata, 2.5, 1.3, 0.5)
...: np.random.seed(1729)
...: y_noise = 0.2 * np.random.normal(size=xdata.size)
...: ydata = y + y_noise

如果没有 p0 参数,拟合参数的数量由内省(introspection)决定,即检查 func 代码和属性

p0 : None, scalar, or N-length sequence, optional

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).

在这种情况下,它标识了 3 个参数:

In [263]: optimize.curve_fit(func, xdata, ydata)
Out[263]:
(array([ 2.55423706, 1.35190947, 0.47450618]),
array([[ 0.0158905 , 0.00681778, -0.0007614 ],
[ 0.00681778, 0.02019919, 0.00541905],
[-0.0007614 , 0.00541905, 0.00282595]]))

我可以使用 *args 定义等效函数:

In [264]: def f1(x, *args):
...: return func(x, *args)
...:

但是如果我试图适应它,我会得到一个错误:

In [266]: optimize.curve_fit(f1, xdata, ydata)
ValueError: Unable to determine number of fit parameters.

但我可以指定一个p0:

In [268]: optimize.curve_fit(f1, xdata, ydata, p0=np.ones(3))
Out[268]:
(array([ 2.55423706, 1.35190947, 0.47450618]),
....)

如果我给其他 p0 大小,我会得到错误,因为 f1 将它的参数传递给 func。我可以定义 f1 以便它更能容忍其他 args 数字,但我可能会得到 OptimizeWarning

关于python - 如何在 Python 中的 scipy.optimize.curve_fit 中设置变量参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48349556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com