Python 2.7 Python lmfit自定义模型:设置固定参数并分配前缀

Python 2.7 Python lmfit自定义模型:设置固定参数并分配前缀,python-2.7,curve-fitting,lmfit,Python 2.7,Curve Fitting,Lmfit,我有两个关于包中参数的问题 一, 有没有办法预先设置自定义模型的参数值 例如 例如,在最后一行中,amp=2000初始化参数amp。如果我想在内置模型中修复此参数(例如): 问题1 是否可以在mod.fit()行或自定义模型的其他地方amp参数值在2000时进行修正 二, 我正在尝试为自定义复合模型分配前缀,如下所示: cust_combination_mod = Model(my_cust, prefix='lin_') + Model(gaussian, prefix='g1_') 当我尝

我有两个关于包中参数的问题

一,

有没有办法预先设置自定义模型的参数值

例如

例如,在最后一行中,
amp=2000
初始化参数
amp
。如果我想在内置模型中修复此参数(例如):

问题1

是否可以
mod.fit()
行或自定义模型的其他地方
amp
参数值在2000时进行修正

二,

我正在尝试为自定义复合模型分配前缀,如下所示:

cust_combination_mod = Model(my_cust, prefix='lin_') + Model(gaussian, prefix='g1_')
当我尝试上面这句话时,我得到:

  File "build\bdist.win-amd64\egg\lmfit\model.py", line 541, in fit
  File "build\bdist.win-amd64\egg\lmfit\model.py", line 747, in fit
  File "build\bdist.win-amd64\egg\lmfit\minimizer.py", line 1242, in minimize
  File "build\bdist.win-amd64\egg\lmfit\minimizer.py", line 1072, in leastsq
  File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 377, in leastsq
    shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
  File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 26, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "build\bdist.win-amd64\egg\lmfit\minimizer.py", line 371, in __residual
  File "build\bdist.win-amd64\egg\lmfit\minimizer.py", line 1432, in _nan_policy
ValueError: The input contains nan values
如果有许多自定义模型,那么初始化
mod.make_params()
中的所有参数(如我在上面1.中所示)可能会很繁琐。这个问题似乎在这里讨论(,) 但它们并没有真正指明如何实际为复合模型的各个组件指定前缀

问题2


是否可以在
lmfit
中为复合自定义模型指定前缀?

Q1:定义模型时,可以为自定义模型设置默认值:

>>> def my_cust(x, a=1.0, b=2.0):
...    return a*x + b

>>> lmodel = Model(my_cust)
>>> params = lmodel.make_params()
>>> params 
Parameters([('a', <Parameter 'a', 1.0, bounds=[-inf:inf]>), ('b', <Parameter 'b', 2.0, bounds=[-inf:inf]>)])
您还可以在模型上设置“参数提示”,以便在创建参数时告知要分配的属性:

>>> lmodel.set_param_hint('a', vary=False)
>>> lmodel.set_param_hint('b', min=0)
>>> params = lmodel.make_params()
>>> params
Parameters([('a', <Parameter 'a', value=1.0 (fixed), bounds=[-inf:inf]>), ('b', <Parameter 'b', 2.0, bounds=[0:inf]>)])
应该行得通(对我来说也行)。为此生成的参数将具有正确的前缀,并且应在
模型中使用前缀引用。make_params

>>> params = comp_model.make_params(g1_amp=9, g1_cen=2.0, g1_wid=0.5)
>>> for name, par in params.items():
...    print(name, par)
...
('lin_a', <Parameter 'lin_a', 1.0, bounds=[-inf:inf]>)
('lin_b', <Parameter 'lin_b', 2.0, bounds=[-inf:inf]>)
('g1_amp', <Parameter 'g1_amp', 9, bounds=[-inf:inf]>)
('g1_cen', <Parameter 'g1_cen', 2.0, bounds=[-inf:inf]>)
('g1_wid', <Parameter 'g1_wid', 0.5, bounds=[-inf:inf]>)
>>params=comp_model.make_参数(g1_amp=9,g1_cen=2.0,g1_wid=0.5)
>名称,PAR中的PAR。项目():
...    印刷品(名称、面值)
...
(‘林欧阿’,)
(‘林_b’,)
(‘g1_amp’,)
(‘g1_cen’,)
(‘g1_wid’,)
如果要保留上面设置的参数提示,应使用前缀创建自定义模型,设置参数提示,然后创建自定义模型:

>>> lmodel = Model(my_cust, prefix='lin_')
>>> lmodel.set_param_hint('a', vary=False)
>>> lmodel.set_param_hint('b', min=0)
>>> comp = lmodel + Model(gauss, prefix='g1_')
>>> params = comp.make_params(g1_amp=9.0, g1_cen=2.0, g1_wid=0.5)
>>> for name, par in params.items(): 
...    print(name, par)
... 
('lin_a', <Parameter 'lin_a', value=1.0 (fixed), bounds=[-inf:inf]>)
('lin_b', <Parameter 'lin_b', 2.0, bounds=[0:inf]>)
('g1_amp', <Parameter 'g1_amp', 9.0, bounds=[-inf:inf]>)
('g1_cen', <Parameter 'g1_cen', 2.0, bounds=[-inf:inf]>)
('g1_wid', <Parameter 'g1_wid', 0.5, bounds=[-inf:inf]>)
>>lmodel=Model(我的客户,前缀为林)
>>>lmodel.set_param_hint('a',vary=False)
>>>l模型设置参数提示('b',最小值=0)
>>>comp=lmodel+Model(高斯,前缀为'g1')
>>>参数=组件制造参数(g1_amp=9.0,g1_cen=2.0,g1_wid=0.5)
>名称,PAR中的PAR。项目():
...    印刷品(名称、面值)
... 
(‘林欧阿’,)
(‘林_b’,)
(‘g1_amp’,)
(‘g1_cen’,)
(‘g1_wid’,)

我不确定南斯的例外情况是从哪里来的。可能是因为没有为参数提供初始值(这可能会导致默认为-inf),或者因为在建模的数据中存在NaN?

当我第一次尝试时,我使用了
mod=Model(my_cust)+Model(gaussian)
,然后包括
pars=mod.make_参数(A=11.78,b=25,amp=2000,cen=109.5,wid=17)
。第二行是问题所在,导致了NaNs的异常——正如您所指出的,我需要通过前缀引用它们。前缀起作用了。我的两个问题都得到了回答。谢谢对不起,在我的评论中,第一句应该是:“…我使用了
mod=Model(my_cust,prefix='lin')+Model(gaussian,prefix='g')
,然后…”
>>> lmodel.set_param_hint('a', vary=False)
>>> lmodel.set_param_hint('b', min=0)
>>> params = lmodel.make_params()
>>> params
Parameters([('a', <Parameter 'a', value=1.0 (fixed), bounds=[-inf:inf]>), ('b', <Parameter 'b', 2.0, bounds=[0:inf]>)])
>>> comp_model = Model(my_cust, prefix='lin_') + Model(gaussian, prefix='g1_')
>>> params = comp_model.make_params(g1_amp=9, g1_cen=2.0, g1_wid=0.5)
>>> for name, par in params.items():
...    print(name, par)
...
('lin_a', <Parameter 'lin_a', 1.0, bounds=[-inf:inf]>)
('lin_b', <Parameter 'lin_b', 2.0, bounds=[-inf:inf]>)
('g1_amp', <Parameter 'g1_amp', 9, bounds=[-inf:inf]>)
('g1_cen', <Parameter 'g1_cen', 2.0, bounds=[-inf:inf]>)
('g1_wid', <Parameter 'g1_wid', 0.5, bounds=[-inf:inf]>)
>>> lmodel = Model(my_cust, prefix='lin_')
>>> lmodel.set_param_hint('a', vary=False)
>>> lmodel.set_param_hint('b', min=0)
>>> comp = lmodel + Model(gauss, prefix='g1_')
>>> params = comp.make_params(g1_amp=9.0, g1_cen=2.0, g1_wid=0.5)
>>> for name, par in params.items(): 
...    print(name, par)
... 
('lin_a', <Parameter 'lin_a', value=1.0 (fixed), bounds=[-inf:inf]>)
('lin_b', <Parameter 'lin_b', 2.0, bounds=[0:inf]>)
('g1_amp', <Parameter 'g1_amp', 9.0, bounds=[-inf:inf]>)
('g1_cen', <Parameter 'g1_cen', 2.0, bounds=[-inf:inf]>)
('g1_wid', <Parameter 'g1_wid', 0.5, bounds=[-inf:inf]>)