Установка предела итераций с помощью lmfit и метода дифференциальной эволюции

Я пытаюсь уместить набор данных с помощью пакета lmfit. В качестве процедуры минимизации я выбрал дифференциал_эволюции (https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.differential_evolution.html) и я хотел бы ограничить максимальное количество выполняемых итераций.

Согласно руководству lmfit (https://lmfit.github.io/lmfit-py/fitting.html#the-minimize-function), я могу передавать аргументы ключевого слова через функцию минимизации в базовый scipy минимизатор, используя словарь ** fit_kws.

Я пробовал несколько вариантов, чтобы передать ключевое слово в процедуру подбора. Примеры:

fit_kws={'maxiter':20}
out = minimize(f2min, fit_params, args=(q, Iexp, errI), iter_cb=printout, method='differential_evolution', **fit_kws) 

or

out = minimize(f2min, fit_params, args=(q, Iexp, errI), iter_cb=printout, method='differential_evolution', fit_kws={'maxiter':20})

or

out = minimize(f2min, fit_params, args=(q, Iexp, errI), iter_cb=printout, method='differential_evolution', maxiter = 20)

Я не получаю сообщения об ошибке, но maxiter просто игнорируется. Я просто ожидал, что после 20 итераций (я пробовал также с большими числами) процедура подгонки остановится. Кроме того, если я определю fit_kws как

fit_kws={'maxiter':a}

что чепуха, я ожидал бы ошибки, которой я не получаю.

Не могли бы вы помочь мне понять, как передать некоторые параметры базовой функции scipy.optimize?


person leonardo2887    schedule 05.11.2019    source источник
comment
Попробуйте просто передать maxiter=20 функции вместо dict, что тогда произойдет?   -  person Tinu    schedule 05.11.2019
comment
Ничего, как и ничего, если я пропущу maxiter = 'a'.   -  person leonardo2887    schedule 05.11.2019
comment
Здесь вроде как угадай, так как я ничего не могу воспроизвести, но попробуй передать kws={'maxiter'=20} вместо fit_kws={'maxiter'=20}.   -  person Tinu    schedule 05.11.2019
comment
Использование minimize(..., method='differential_evolution', maxiter=20) должно работать. Если вы уверены, что это не работает (каковы доказательства? FWIW, где differential_evolution, maxiter означает максимальное количество поколений), задайте вопрос в списке рассылки или отправьте отчет об ошибке.   -  person M Newville    schedule 06.11.2019
comment
Да, действительно, значение maxiter - это не максимальное количество итераций, а количество поколений. Итак, действительно, спасибо за ваше предложение. В конце концов, это сработало.   -  person leonardo2887    schedule 15.01.2020


Ответы (1)


У меня была та же проблема, хотя в моем случае возникла ошибка, см. Для этого следующий вопрос SO.

Короче говоря, вы можете передать аргументы ключевого слова базовому решателю с аргументом ключевого слова options:

fit = fitter.minimize(method='differential_evolution', options={'maxiter':20})

или, более конкретно, для ваших примеров выше:

out = minimize(f2min, fit_params, args=(q, Iexp, errI), iter_cb=printout, method='differential_evolution', options={'maxiter':20})
person westr    schedule 14.01.2020