Добавить ограничения в scipy.optimize.curve_fit?

У меня есть возможность добавить границы к sio.curve_fit. Есть ли способ расширить эту функцию границ, которая включает функцию параметров? Другими словами, скажем, у меня есть произвольная функция с двумя или более неизвестными константами. И затем давайте также скажем, что я знаю, что сумма всех этих констант меньше 10. Есть ли способ реализовать это последнее ограничение?

import numpy as np
import scipy.optimize as sio
def f(x, a, b, c):
    return a*x**2 + b*x + c

x = np.linspace(0, 100, 101)
y = 2*x**2 + 3*x + 4

popt, pcov = sio.curve_fit(f, x, y, \
     bounds = [(0, 0, 0), (10 - b - c, 10 - a - c, 10 - a - b)]) # a + b + c < 10

Очевидно, это было бы ошибкой, но я думаю, что это помогает понять суть. Есть ли способ включить функцию ограничения, включающую параметры для подгонки кривой?

Спасибо!


person Peter    schedule 12.07.2016    source источник


Ответы (2)


С помощью lmfit вы должны определить 4 параметра (a, b, c и delta). a и b могут свободно изменяться. delta может варьироваться, но имеет максимальное значение 10 для представления неравенства. c будет ограничено значением delta-a-b (таким образом, есть еще 3 переменные: c будет меняться, но не независимо от других). При желании вы также можете ограничить значения для a, b и c. Без тестирования ваш код будет примерно::

import numpy as np
from lmfit import Model, Parameters

def f(x, a, b, c):
    return a*x**2 + b*x + c

x = np.linspace(0, 100.0, 101)
y = 2*x**2 + 3*x + 4.0

fmodel = Model(f)
params = Parameters()
params.add('a', value=1, vary=True)
params.add('b', value=4, vary=True)
params.add('delta', value=5, vary=True, max=10)
params.add('c', expr = 'delta - a - b')

result = fmodel.fit(y, params, x=x)
print(result.fit_report())

Обратите внимание, что если вы действительно столкнетесь с ситуацией, когда выражение ограничения или границы определяют значения параметров, неопределенности могут не оцениваться.

person M Newville    schedule 13.07.2016

Curve_fit и наименьшие_квадраты принимают только ограничения поля. В scipy.optimize SLSQP может работать с более сложными ограничениями. В частности, для подгонки кривой вы можете взглянуть на пакет lmfit.

person ev-br    schedule 13.07.2016