2012-03-01 14 views
7

Próbuję dopasować logistyczną krzywą wzrostu do moich danych za pomocą curve_fit, używając następującej funkcji jako danych wejściowych.Ograniczanie wartości dla 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 

Jak widać funkcja, której używam, ma pewne ograniczenia dotyczące wartości, które może zaakceptować dla parametrów aib. Czy wiesz, jak radzić sobie z niepoprawnymi wartościami? Czy funkcja wejściowa powinna wywołać wyjątek, czy zwrócić fałszywą wartość? Z góry dzięki.

Odpowiedz

7

Gdy parametry wypadają poza dopuszczalny zakres, zwracają ogromnie dużą liczbę (z dala od danych, które mają zostać zainstalowane). To będzie (miejmy nadzieję) karać tego wyboru parametrów tyle że curve_fit osiądzie na jakiejś innej dopuszczalnej zestawu parametrów jako optymalna:

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

wydaje się działać nieco lepiej, dziękuję! Jeszcze trochę się z tym pobawię ... – mgalardini

Powiązane problemy