Python, scipy, curve_fit, границы: Как я могу ограничить параметр двумя интервалами?

#python #scipy #curve-fitting

#python #scipy #подгонка кривой

Вопрос:

Я использую scipy.optimize.curve_fit для подгонки сигмоидальной кривой к данным. Мне нужно связать один из параметров из [-3, 0.5] и [0.5, 3.0]

Я попробовал подгонку кривой без границ, а затем, если параметр меньше нуля, я снова подгоняю границы [-3, 0.5] и, наоборот, [0.5, 3.0]

Возможно ли связать функцию curve_fit с двумя интервалами?

Комментарии:

1. Я не думаю, что можно связать параметры с curve_fit помощью, но вас может заинтересовать пакет lmfit, который предоставляет именно эту функциональность.

2. Я говорил слишком оптимистично — теперь, когда я думаю об этом, нет прямого способа наложить ограничение на два интервала lmfit . Возможно, вы можете попытаться создать два зависимых параметра, где один масштабируется на коэффициент -1 от другого?

Ответ №1:

Нет, least_squares (следовательно, curve_fit) поддерживает только ограничения box.

Ответ №2:

Существует грубый способ сделать это, и он заключается в том, чтобы ваша функция возвращала очень большие значения, если параметр находится за пределами нескольких границ. Например:

 sigmoid_func(x, parameters):
    if parameter outside multiple bounds:
        return 1.0E10 * len(x) # very large number
    else:
        return sigmoid value
  

Это приводит к очень большим ошибкам, если параметр находится за пределами ваших множественных границ. Если у вас есть диапазон с одной границей [upper, lower], вам не следует использовать этот метод, поскольку самая последняя версия scipy уже поддерживает более распространенный тип проблемы с одним ограниченным диапазоном.