lmfit - minimizer не принимает аргументы ключевых слов scipy minimizer - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь приспособить какую-то модель к моим данным с помощью lmfit. См. MWE ниже:

import lmfit
import numpy as np

def lm(params, x):
    slope = params['slope']
    interc = params['interc']

    return interc + slope * x

def lm_min(params, x, data):
    y = lm(params, x)
    return data - y

x = np.linspace(0,100,1000)
y = lm({'slope':1, 'interc':0.5}, x)

ydata = y + np.random.randn(1000)

params = lmfit.Parameters()
params.add('slope', 2)
params.add('interc', 1)

fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), fit_kws={'xatol':0.01})
fit = fitter.minimize(method='nelder')

Чтобы закончить раньше (точность не самая важная вещь на данный момент), я хочу изменить критерии для прекращения посадки. Основываясь на документах и некоторых поисках по SO , я попытался дать некоторые ключевые аргументы (fit_kws в строке ниже), которые будут переданы используемому минимизатору. Я также пытался использовать kws и **{'xatol':0.01}. Кроме того, я также попробовал вышеупомянутые опции в последней строке, где я звоню fitter.minimize(). Однако во всех случаях я получаю TypeError, говоря, что он получил неожиданные аргументы ключевого слова:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/STACK/WUR/PhD/Experiments/Microclimate experiment/Scripts/Fluctuations/mwe.py in <module>()
     25 
     26 fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), fit_kws={'xatol':0.01})
---> 27 fit = fitter.minimize(method='nelder')
     28 

~/anaconda3/envs/py/lib/python3.6/site-packages/lmfit/minimizer.py in minimize(self, method, params, **kws)
   1924                         val.lower().startswith(user_method)):
   1925                     kwargs['method'] = val
-> 1926         return function(**kwargs)
   1927 
   1928 

~/anaconda3/envs/py/lib/python3.6/site-packages/lmfit/minimizer.py in scalar_minimize(self, method, params, **kws)
    906         else:
    907             try:
--> 908                 ret = scipy_minimize(self.penalty, variables, **fmin_kws)
    909             except AbortFitException:
    910                 pass

TypeError: minimize() got an unexpected keyword argument 'fit_kws'

Кто-нибудь знает, как я могу добавить аргументы ключевого слова для конкретных решателей?

Версияинформация:

python: 3.6.9
scipy: 1.3.1
lmfit: 0.9.12

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

В github проблема Я нашел следующее решение:

fit = fitter.minimize(method='nelder', **{'options':{'xatol':4e-4}})

Это также работает для других опций решателя.

0 голосов
/ 09 ноября 2019

Лучший способ передать аргументы ключевого слова в базовый решатель scipy - просто использовать

# Note: valid but will not do what you want
fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), xatol=0.01)
fit = fitter.minimize(method='nelder')

или

# Also: valid but will not do what you want
fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata))
fit = fitter.minimize(method='nelder', xatol=0.01)

Основная проблема здесь заключается в том, что xatolне является допустимым аргументом ключевого слова для базового решателя, scipy.optimize.minimize(). Вместо этого вы, вероятно, хотите использовать tol:

fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata), tol=0.01)
fit = fitter.minimize(method='nelder')

или

fitter = lmfit.Minimizer(lm_min, params, fcn_args=(x, ydata))
fit = fitter.minimize(method='nelder', tol=0.01)
...