创建具有任意数量参数的 python lmfit 模型
Creating a python lmfit Model with arbitrary number of parameters
有没有办法根据具有任意数量因变量的函数构建 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'])
如果我对多项式级数感兴趣并且想测试级数增长或收缩时的性能,那么类似于上面的东西会很棒。
由于 Model()
使用函数参数名称来构建参数名称,因此使用 *params
并不容易(人们怎么知道将它们称为 A
、B
、C
,而不是 coeff0
、coeff1
、coeff2
或其他?)。
不知道能不能支持真正的任意数,但是应该可以支持很大的数。多项式模型(参见 http://lmfit.github.io/lmfit-py/builtin_models.html#polynomialmodel and https://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())
希望对您有所帮助。
有没有办法根据具有任意数量因变量的函数构建 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'])
如果我对多项式级数感兴趣并且想测试级数增长或收缩时的性能,那么类似于上面的东西会很棒。
由于 Model()
使用函数参数名称来构建参数名称,因此使用 *params
并不容易(人们怎么知道将它们称为 A
、B
、C
,而不是 coeff0
、coeff1
、coeff2
或其他?)。
不知道能不能支持真正的任意数,但是应该可以支持很大的数。多项式模型(参见 http://lmfit.github.io/lmfit-py/builtin_models.html#polynomialmodel and https://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())
希望对您有所帮助。