Pytanie w sprawie scipy – Pozytywna pochodna kierunkowa dla wyszukiwania linii

9

Co oznacza smod scipy.optimize „Pozytywna pochodna kierunkowa dla wyszukiwania linii”?

na przykład w fmin_slsqphttp://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

Proszę podać link do strony dokumentacji. Sven Marnach

Twoja odpowiedź

5   odpowiedzi
1

x0 jest poza prawidłowym zakresem zdefiniowanym wbounds.a maksymalne maksimum jest osiągane dla wartości na zewnątrzbounds.

Ustawię hipotetyczny problem optymalizacji, uruchom go z dwiema różnymi wartościami początkowymi i wydrukuj wynikscipy.optimize:

import numpy as np
from scipy import optimize

H = np.array([[2., 0.],
              [0., 8.]])

c = np.array([0, -32])

x0 = np.array([0.5, 0.5])    # valid initial value
x1 = np.array([-1, 1.1])     # invalid initial value

def loss(x, sign=1.):
    return sign * (0.5 * np.dot(x.T, np.dot(H, x)) + np.dot(c, x))

def jac(x, sign=1.):
    return sign * (np.dot(x.T, H) + c)

bounds = [(0, 1), (0, 1)]

Teraz, gdy funkcja strat, gradient, x0 i granice są na miejscu, możemy rozwiązać problem:

def solve(start):
    res = optimize.minimize(fun=loss, 
                            x0=start, 
                            jac=jac, 
                            bounds=bounds,
                            method='SLSQP')
    return res



solve(x0)   # valid initial value
# fun: -27.999999999963507
# jac: array([ 2.90878432e-14, -2.40000000e+01])
# message: 'Optimization terminated successfully.'
# ...
#  status: 0
# success: True
# x: array([1.45439216e-14, 1.00000000e+00])

solve(x1)      # invalid initial value:
#  fun: -29.534653465326528
#  jac: array([ -1.16831683, -23.36633663])
#  message: 'Positive directional derivative for linesearch'
#  ...
#  status: 8
#  success: False
#  x: array([-0.58415842,  1.07920792])

Jako @pv. wskazany w zaakceptowanej odpowiedzi, algorytm nie może zweryfikować, że jest to minimum:

Myślę, że ten komunikat oznacza, że ​​optymalizator znalazł się w pozycji, w której nie zdołał znaleźć kierunku, w którym wartość funkcji celu maleje (wystarczająco szybko), ale nie mógł również sprawdzić, czy bieżąca pozycja jest minimalna.

1

ale możesz zobaczyć kod źródłowy, który generuje smod tu:

https://github.com/scipy/scipy/blob/master/scipy/optimize/slsqp/slsqp_optmz.f

Zadania zmode = 8 („Pozytywna pochodna kierunkowa dla wyszukiwania linii”, o którą pytasz) można znaleźć w wierszach 412 i 486. Jeśli możesz dowiedzieć się, dlaczego zostały one przypisane do kodu, masz swoją odpowiedź.

5

możesz również spróbować eksperymentować z parametrami ftol i eps. Zmiana ftol na wyższą wartość jest równoważna zmianie funkcji na mniejszą wartość.

lepiej nadaje się jako komentarz jjj
Prawda, że. Popełniłem błąd i nie wiedziałem, jak go poprawić. danielrd
15

wybierając kierunek zniżania, a następnie przeprowadzając wyszukiwanie linii w tym kierunku. Myślę, że ten komunikat oznacza, że ​​optymalizator znalazł się w pozycji, w której nie zdołał znaleźć kierunku, w którym wartość funkcji celu maleje (wystarczająco szybko), ale nie mógł również sprawdzić, czy bieżąca pozycja jest minimalna.

12

co to znaczy, ale jak to rozwiązać. Zasadniczo zoptymalizowana funkcja musi zwracać mniejszą wartość.

F(x):
    ...
    return value / 10000000
@ Windstorm1981, jeśli skalujesz tylko cel, to wartości rozwiązaniax powinien być dobry jak jest. Jeśli jednak skalujesz również wartości wejściowe, musisz odwrócić skalowanie na końcu, aby uzyskać rzeczywiste rozwiązanie. W przypadku tych problemów jest właściwie najlepiej, jeśli wszystkie wartości, zarówno wejścia, jak i cele, są skalowane do porządku 1. Wprowadzenie tego skalowania i skalowania na końcu wymaga pewnego wysiłku, ale jeśli problem optymalizacji jest duży, powinno to pomóc dużo zbieżności. Mike
Wiem, że to stare pytanie, ale jeśli dzielisz funkcję, która ma być zoptymalizowanan nakłonić metodę do pracy, co robisz z wartościamix w rozwiązaniach? Windstorm1981
Bardziej ogólna odpowiedź brzmi, że optymalizowana funkcja jest słabo skalowana. Myślę, że idealnym rozwiązaniem jest to, że optymalizowana funkcja powinna dawać średnią w zakresie 1-5. Dla mojej skrzynki musiałem pomnożyć się przez 1000. jebob

Powiązane pytania