Seite 1 von 1
Scipy Minimize mit '"L-BFGS-B"' verletzt bounds und maxiter
Verfasst: Dienstag 10. Dezember 2019, 18:30
von Martin5032
Hey Leute,
ich habe folgendes simples Minimierungs-Problem aufgebaut:
Code: Alles auswählen
from scipy import optimize
x0=[1,1]
bnds=((0.8,2.5),(0.8,2))
result = optimize.minimize(f,x0,bounds=bnds,method="L-BFGS-B",options={'eps':0.1,'maxiter':10})
result.success
x_min = result.x
Ich lasse mir die beiden Variablen für jede Iteration anzeigen und habe dabei festgestellt, dass der optimierer jeweils einmal 0.1 über die Bounds heraus geht
z.B. [ x[0] , x[1] ] = [ 2.6 , 2 ] oder [ 1 , 2.1 ]
Zudem ignoriert er den maxiter Wert und läuft nach der 10.ten Iteration einfach weiter.
Hat einer von euch ne Idee woran das liegen kann ?
Re: Scipy Minimize mit '"L-BFGS-B"' verletzt bounds und maxiter
Verfasst: Mittwoch 11. Dezember 2019, 09:33
von einfachTobi
Bist du sicher, dass `maxiter` überschritten wird? Das funktioniert bei mir nämlich absolut zuverlässig. Hast du den Wert von `result.nit` (= Anzahl der Iterationen) überprüft?
Re: Scipy Minimize mit '"L-BFGS-B"' verletzt bounds und maxiter
Verfasst: Mittwoch 11. Dezember 2019, 16:55
von Martin5032
Danke für den Tipp Tobi !
Ich hatte nicht gewusst, dass die Anzahl der Funktionsaufrufe nicht zwangsweise dasselbe wie die Anzahl der Iterationen (vom Algorithmus) ist.
Ich habe jetzt auch die Problematik mit den Bounds verstanden.
Nur zweifle ich jetzt daran ob der L-BFGS-B Algorithmus für mein Programm geeignet ist.
Ich möchte mit dem Optimierer die Eingangsdaten eines anderen Modells verbessern.
Die Idee ist wie folgt:
1. Der Optimierer ruft f(x) mit den Variablen x[0] und x[1] auf.
2. In der Funktion f(x) wird mit den Variablen eine Modellrechnung aufgerufen und deren Ergebis zu einem Fehlerwert verarbeitet.
3. Der Fehlerwert wird wieder an den Optimierer zurückgegeben.
Der Opt. weis also nicht, was in der Funktionen passiert, und sieht nur den Input (Optimierungs-Variablen x[0], x[1] ) und den Output (Fehlerwert z.B = 300).
Das Problem ist das die Modellrechnung nur Eingangswerte im zulässigen Bereich (meine Bounds) verarbeiten kann und ansonsten eine Fehlermeldung erzeugt.
Desshalb ist es wichtig das die Grenzen nicht innerhalb der Iterationen verletzt werden (viele der anderen Methoden garantieren nur das das Endergebniss die Bounds/Constraints erfüllt).
Der L-BFGS-B Algorithmus erfüllt die Voraussetzungen zwar,scheint aber nicht zu konvergieren.
Hat jemand eine Idee welche Methode klappen könnte?
Re: Scipy Minimize mit '"L-BFGS-B"' verletzt bounds und maxiter
Verfasst: Mittwoch 11. Dezember 2019, 17:53
von einfachTobi
Hast du mal den konkreten Code und eine konkretere Beschreibung? Ich kann mir noch nicht ganz vorstellen wie du vorgehst und was du letztlich erreichen willst.
Hast du mal probiert die Schrittweite `eps` zu verringern?
Re: Scipy Minimize mit '"L-BFGS-B"' verletzt bounds und maxiter
Verfasst: Donnerstag 12. Dezember 2019, 17:25
von Martin5032
Ich habe heute mit der Schrittweite experimentiert und konnte erreichen das der Optimierer erfolgreich Konvergiert !
Danke Tobi !!!!!!!
Falls du den relevanten Code-Ausschnitt noch sehen willst:
Code: Alles auswählen
from scipy import optimize
def f(x):
output=Modell(x)
mse_error= Calc_Error(output)
return (mse_error)
#output enthält die Ergebnisse des Modelldurchlaufs in einem pandas Dataframe. Ein einzelner Modelldurchlauf ist relativ zeitintensiv mit 4-5 Sekunden
#der output wird zu einem einzelnen scalaren Fehlerwert verarbeitet. In diesem Fall dem Mean Square Error (MSE)
x0=[1,1]
bnds=((0.8,2),(0.8,2))
result = optimize.minimize(f,x0,method="L-BFGS-B",bounds=bnds,options={'maxiter':10,'eps':0.001})
result.success
print(result)
Der Wert des mse_error soll durch die Variation der Variablen in x (enthält. x[0],x[1],x[2],.....) minimiert werden.
Modell(x) ruft dein größeres Modell auf und übergibt die Werte in x die dann intern als Korrekturfaktoren für bestimmte Parameter verwendet werden.
Die Werte in x beeinflussen somit den auftretenden MSE maßgeblich.
Wenn an die Funktion f(x) Werte außerhalb der Bounds übergeben werden wirft das Modell einen Fehler.
Das Problem war bisher das die Optimierung nicht konvergiert oder zumindest nicht in einer annehmbaren Zeit.
Ich denke ich habe die benötigte Anzahl der Funktionsaufrufe einfach stark unterschätzt !