python - 使用任意数量的参数创建 python lmfit 模型

标签 python curve-fitting polynomials lmfit

有没有办法基于具有任意数量因变量的函数构建 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不会很容易工作(人们怎么知道叫他们 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())

希望有帮助。

关于python - 使用任意数量的参数创建 python lmfit 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386179/

相关文章:

python - numpy 获取行索引,其中某些列中的元素为零

python - sklearn Transformation 对哪些数据进行操作?

c++ - NTL 库 GF2X

python - 计算多项式的质数结果

python - 更改 SymPy 多项式中以 p 为模的系数

python - 如何在 tkinter Canvas 上创建按钮?

python - 双击文件运行 python 脚本。如何获取该文件作为输入?

Python曲线拟合使用相对偏差而不是绝对偏差进行优化

python - 从数据集*编辑*中标准化普朗克定律的 curve_fit 中的值

python - 如何用指数曲线拟合数据