2012-03-01 20 views
7

Estoy tratando de ajustar una curva de crecimiento logístico a mis datos usando curve_fit usando la siguiente función como entrada.Restringir valores para 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 

Como puede ver, la función que estoy usando tiene algunas restricciones sobre los valores que puede aceptar para los parámetros a y b. ¿Alguna conjetura sobre cómo manejar los valores incorrectos? ¿Debería la función de entrada generar una excepción o devolver un valor ficticio? Gracias de antemano.

Respuesta

7

Cuando los parámetros caen fuera del rango admisible, devuelve un número enormemente grande (lejos de los datos que se van a instalar). Esto (con suerte) penalizar a esta elección de los parámetros tanto que curve_fit se instalará en algún otro conjunto de parámetros admisibles como óptima:

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

Parece que funciona un poco mejor, gracias! Aunque jugaré un poco más ... – mgalardini

Cuestiones relacionadas