Frage an scipy – Positive Richtungsableitung für die Liniensuche

9

Was bedeutet der Smode von scipy.optimize 'Positive Directional Derivative for Linesearch'?

Zum Beispiel in fmin_slsqphttp://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_slsqp.html

Bitte geben Sie einen Link zur Dokumentationsseite an. Sven Marnach

Deine Antwort

5   die antwort
5

können Sie auch versuchen, mit den Parametern ftol und eps zu experimentieren. Das Ändern von ftol auf einen höheren Wert entspricht dem Ändern der Funktion auf einen kleineren Wert.

besser als Kommentar geeignet jjj
Das stimmt. Ich habe beim Posten einen Fehler gemacht und wusste nicht, wie ich ihn korrigieren sollte. danielrd
1

aber Sie können den Quellcode, der den Smode generiert, hier sehen:

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

Aufträge vonmode = 8 (Die "Positive Richtungsableitung für die Liniensuche", nach der Sie fragen) finden Sie in den Zeilen 412 und 486. Wenn Sie herausfinden können, warum sie im Code zugewiesen sind, haben Sie Ihre Antwort.

12

was es bedeutet, aber wie ich es lösen soll. Grundsätzlich muss die optimierte Funktion einen kleineren Wert zurückgeben.

F(x):
    ...
    return value / 10000000
Ich weiß, das ist eine alte Frage, aber wenn Sie die zu optimierende Funktion durch teilenn Was tun Sie mit den Werten, um die Methode zum Arbeiten zu bewegen?x in den lösungen? Windstorm1981
Die allgemeinere Antwort lautet, dass die zu optimierende Funktion schlecht skaliert ist. Ich denke, das Ideal ist, dass die Funktion, über die optimiert wird, tendenziell einen Mittelwert im Bereich von 1 bis 5 ergibt. Für meinen Verwendungszweck musste ich mit 1000 multiplizieren. jebob
@ Windstorm1981, wenn Sie nur das Ziel skalieren, werden die Lösungswertex sollte so gut sein wie es ist. Wenn Sie jedoch auch die Eingabewerte skaliert haben, müssen Sie die Skalierung am Ende umkehren, um die eigentliche Lösung zu erhalten. Für diese Probleme ist es eigentlich am besten, wenn alle Werte, sowohl Eingaben als auch Ziele, so skaliert werden, dass sie der Reihenfolge 1 entsprechen. Es ist ein gewisser Aufwand, diese Skalierung und Dekalierung am Ende durchzuführen. Wenn das Optimierungsproblem jedoch groß ist, sollte dies Abhilfe schaffen Konvergenz viel. Mike
15

indem sie eine Abstiegsrichtung auswählen und dann eine Liniensuche in diese Richtung durchführen. Ich denke, diese Meldung bedeutet, dass der Optimierer in eine Position gelangt ist, in der er keine Richtung gefunden hat, in der der Wert der Zielfunktion abnimmt (schnell genug), aber auch nicht überprüfen konnte, ob die aktuelle Position ein Minimum ist.

1

x0 liegt außerhalb des gültigen Bereichs, in dem Sie definiert habenbounds.und das uneingeschränkte Maximum wird für Werte außerhalb erreichtbounds.

Ich werde ein hypothetisches Optimierungsproblem erstellen, es mit zwei verschiedenen Anfangswerten ausführen und die Ausgabe von ausgebenscipy.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)]

Nun, da Verlustfunktion, Gradient, x0 und Grenzen vorhanden sind, können wir das Problem lösen:

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])

Als @pv. In der akzeptierten Antwort wird darauf hingewiesen, dass der Algorithmus nicht überprüfen kann, ob dies ein Minimum ist:

Ich denke, diese Meldung bedeutet, dass der Optimierer in eine Position gelangt ist, in der er keine Richtung gefunden hat, in der der Wert der Zielfunktion abnimmt (schnell genug), aber auch nicht überprüfen konnte, ob die aktuelle Position ein Minimum ist.

Verwandte Fragen