2012-03-01 2 views
7

Я пытаюсь подогнать кривую роста логистики к своим данным с помощью функции curve_fit, используя в качестве входной функции следующую функцию.Ограничение значений для curve_fit (scipy.optimize)

def logistic(x, y0, k, d, a, b): 
    if b > 0 and a > 0: 
     y = (k * pow(1 + np.exp(d - (a * b * x)), (-1/b))) + y0 
    elif b >= -1 or b < 0 or a < 0: 
     y = (k * pow(1 - np.exp(d - (a * b * x)), (-1/b))) + y0 

    return y 

Как вы можете видеть, функция, которую я использую, имеет некоторые ограничения на значения, которые она может принимать для параметров a и b. Можно ли предположить, как обращаться с неправильными значениями? Если функция ввода вызывает исключение или возвращает фиктивное значение? Спасибо заранее.

ответ

7

Когда параметры выпадают из допустимого диапазона, возвращайте огромное количество (вдали от данных, которые нужно установить). Это будет (надеюсь) оштрафовать этот выбор параметров так много, что curve_fit будет располагаться на другом допустимом множестве параметров, как оптимальная:

def logistic(x, y0, k, d, a, b): 
    if b > 0 and a > 0: 
     y = (k * pow(1 + np.exp(d - (a * b * x)), (-1/b))) + y0 
    elif b >= -1 or b < 0 or a < 0: 
     y = (k * pow(1 - np.exp(d - (a * b * x)), (-1/b))) + y0 
    else: 
     y = 1e10 
    return y 
+0

Это, кажется, работает немного лучше, спасибо! Я поиграю с ним еще немного, хотя ... – mgalardini

Смежные вопросы