2012-03-01 22 views
7

Sto provando ad adattare una curva di crescita logistica ai miei dati usando curve_fit usando la seguente funzione come input.Restrizione dei valori per 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 

Come si può vedere la funzione che sto usando ha alcune restrizioni sui valori che può accettare per i parametri aeb. Qualche ipotesi su come gestire i valori errati? La funzione di input dovrebbe sollevare un'eccezione o restituire un valore fittizio? Grazie in anticipo.

risposta

7

Quando i parametri cadono dal campo ammesso, restituire un numero enormemente enorme (lontano dai dati da installare). In questo modo (si spera) penalizzano questa scelta di parametri, tanto che curve_fit si depositerà su qualche altro set ammissibile di parametri come ottimale:

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

Sembra funzionare un po 'meglio, grazie! Ci giocherò un po 'di più anche se ... – mgalardini

Problemi correlati