2013-10-08 13 views
8

Próbuję użyć funkcji scipy.optimize, aby znaleźć globalne minimum skomplikowanej funkcji z kilkoma argumentami. scipy.optimize.minimize wydaje się wykonywać najlepszą pracę, mianowicie metodę "Nelder-Mead". Ma jednak tendencję do korzystania z obszarów z obszarów argumentów (aby przypisać wartości ujemne do argumentów, które mogą być tylko dodatnie), a tym samym zwraca błąd w takich przypadkach. Czy istnieje sposób, aby ograniczyć granice argumentów w ramach samej scipy.optimize.minimize funkcji? A może w ramach innych funkcji scipy.optimize?Scipy.optimize: jak ograniczyć wartości argumentów

Znalazłem następujące informacje:

Gdy parametry wypaść z dopuszczalnym zakresie, powrót dziko ogromną liczbę (daleko od danych, które mają być zamontowane). To (miejmy nadzieję) będzie karać ten wybór parametrów tak bardzo, że curve_fit ustali się na jakimś innym dopuszczalnym zbiorze parametrów jako optymalnym.

given in this previous answer, ale procedura zajmie w moim przypadku dużo czasu obliczeniowego.

+0

Włączenie funkcji kosztowej przy dużym koszcie, gdy wartości wejściowe znajdują się poza dopuszczalnym zakresem, jest bardzo złym pomysłem, ponieważ funkcja wyszukiwania zużyje większość energii na przeszukiwanie nieskończonej wielkości niekompletnych odpowiedzi.Użyj argumentu 'constraint' z' scipy.minimize', aby określić metodę, która wskaże algorytmowi, gdzie ograniczyć wyszukiwanie. szukaj "ograniczeń" tutaj: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize –

Odpowiedz

14

Nelder-Mead solver nie obsługuje ograniczonego optymalizacji, ale istnieje wiele innych, które robią.

TNC i L-BFGS-B obsługują tylko ograniczenia związane (np. x[0] >= 0), które powinny być odpowiednie dla twojego przypadku. COBYLA i SLSQP są bardziej elastyczne, wspierając dowolne połączenie ograniczeń, równości i ograniczeń opartych na nierównościach.

Możesz znaleźć bardziej szczegółowe informacje o solverach, patrząc na dokumenty dotyczące samodzielnych funkcji, np. scipy.optimize.fmin_slsqp dla method='SLSQP'.

Możesz zobaczyć moją poprzednią odpowiedź here dla przykładu ograniczonej optymalizacji za pomocą SLSQP.

15

Funkcja ma bounds parameter, która może być używana do ograniczenia granic dla każdej zmiennej przy użyciu metod L-BFGS-B, TNC, COBYLA lub SLSQP.

Na przykład

import scipy.optimize as optimize 

fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2 
res = optimize.minimize(fun, (2, 0), method='TNC', tol=1e-10) 
print(res.x) 
# [ 1.   2.49999999] 

bnds = ((0.25, 0.75), (0, 2.0)) 
res = optimize.minimize(fun, (2, 0), method='TNC', bounds=bnds, tol=1e-10) 
print(res.x) 
# [ 0.75 2. ] 
1

Wiem, że jest późno w grze, ale może warto spojrzeć na mystic. Możesz zastosować dowolne funkcje python jako funkcje kary lub zastosować ograniczenia ograniczeń i więcej ... na dowolnym optymalizatorze (w tym algorytmie z scipy.optimize.fmin).

https://github.com/uqfoundation/mystic

1

Argument szukasz jest: constraints który jest jednym z argumentów przekazanych do . Toczyć własną funkcję lambda, która odbiera parametry, aby ograniczyć tak:

#A function to define the space where scipy.minimize should 
#confine its search: 
def apply_sum_constraint(inputs): 
    #return value must come back as 0 to be accepted 
    #if return value is anything other than 0 it's rejected 
    #as not a valid answer. 
    total = 50.0 - np.sum(inputs) 
    return total 

my_constraints = ({'type': 'eq', "fun": apply_sum_constraint }) 
result = spo.minimize(f, 
         guess, 
         method='SLSQP', 
         args=(a, b, c), 
         bounds=((-1.0, 1.0), (-1.0, 1.0)), 
         options={'disp': True}, 
         constraints=my_constraints) 

Powyższy przykład twierdzi, że wszyscy nowi kandydaci w okolicy ostatniego poszukiwanego elementu lepiej dodać do 50. Zmiana ta metoda do zdefiniowania dopuszczalna przestrzeń przeszukiwania i funkcja scipy.minimize nie będą marnować energii, biorąc pod uwagę te odpowiedzi.

Powiązane problemy