使用Python lmfit创建具有任意数量参数的模型

4
有没有一种方法可以基于具有任意数量的自变量的函数构建lmfit模型?例如:
from lmfit import Model

def my_poly(x, *params):
  func = 0
  for i in range(len(params)):
    func+= params[i]*z**i
  return func

#note: below does not work
my_model = Model(my_poly, independent_vars = ['x'], param_names = ['A','B','C'])

如果我对多项式序列感兴趣并希望测试随着序列的增长或缩小性能的话,类似上述内容的东西会很棒。

1个回答

4

由于Model()使用函数参数名称构建参数名称,因此使用*params不容易实现 (如何知道将它们称为ABC,而不是coeff0coeff1coeff2或其他名称?)。

我不知道是否支持真正的任意数量,但应该可以支持非常大的数量。多项式模型(参见http://lmfit.github.io/lmfit-py/builtin_models.html#polynomialmodelhttps://github.com/lmfit/lmfit-py/blob/master/lmfit/models.py#L126以获取实现)支持最多7个系数。将其扩展到更大的数量应该没有问题。这可能很容易导致计算问题,但我认为这就是你想要探索的内容。

如果您愿意进行一些小改动,那么可以做到像您所需的那样。这将使用关键字参数而不是位置参数,并依赖于参数名称顺序(使用sort)来指示哪个系数与哪个指数相对应,而不是位置参数的顺序。这可能接近于您所需的内容:

import numpy as np

from lmfit import Model, Parameters

def my_poly(x, **params):
    val= 0.0
    parnames = sorted(params.keys())
    for i, pname in enumerate(parnames):
        val += params[pname]*x**i
    return val

my_model = Model(my_poly)

# Parameter names and starting values
params = Parameters()
params.add('C00', value=-10)
params.add('C01', value=  5)
params.add('C02', value=  1)
params.add('C03', value=  0)
params.add('C04', value=  0)

x = np.linspace(-20, 20, 101)
y = -30.4 + 7.8*x - 0.5*x*x + 0.03 * x**3 + 0.009*x**4
y = y + np.random.normal(size=len(y), scale=0.2)

out = my_model.fit(y, params, x=x)
print(out.fit_report())

希望能对您有所帮助。

太好了!我已经探索了内置的多项式模型,但在我的实际分析中使用起来很困难。然而,你关于使用kwargs而不是args的建议非常完美。谢谢。 - Brian Pollack
在谈论任意数量的参数时,是否可能拟合任意数量的高斯函数?即高斯模型的数量是可变的?当然,限制为最多2-10个?提前致谢。 - user1301295

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