fmin_l_bfgs_b#
- scipy.optimize.fmin_l_bfgs_b(func, x0, fprime=None, args=(), approx_grad=0, bounds=None, m=10, factr=10000000.0, pgtol=1e-05, epsilon=1e-08, iprint=<object object>, maxfun=15000, maxiter=15000, disp=<object object>, callback=None, maxls=20)[Quelle]#
Minimiere eine Funktion func mit dem L-BFGS-B-Algorithmus.
- Parameter:
- funccallable f(x,*args)
Zu minimierende Funktion.
- x0ndarray
Anfangsschätzung.
- fprimecallable fprime(x,*args), optional
Der Gradient von func. Wenn None, dann gibt func den Funktionswert und den Gradienten zurück (
f, g = func(x, *args)), es sei denn, approx_grad ist True, in welchem Fall func nurfzurückgibt.- argssequence, optional
Argumente, die an func und fprime übergeben werden sollen.
- approx_gradbool, optional
Ob der Gradient numerisch approximiert werden soll (in diesem Fall gibt func nur den Funktionswert zurück).
- boundslist, optional
(min, max)Paare für jedes Element inx, die die Grenzen für diesen Parameter definieren. Verwenden Sie None oder +-inf für eine der Grenzenminodermax, wenn keine Grenze in dieser Richtung vorhanden ist.- mint, optional
Die maximale Anzahl von variablen Metrik-Korrekturen, die zur Definition der Limit-Memory-Matrix verwendet werden. (Die Limited-Memory-BFGS-Methode speichert nicht die volle Hesse-Matrix, sondern verwendet diese Anzahl von Termen in einer Approximation davon.)
- factrfloat, optional
Die Iteration stoppt, wenn
(f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr * epsist, wobeiepsdie Maschinenpräzision ist, die automatisch vom Code generiert wird. Typische Werte für factr sind: 1e12 für geringe Genauigkeit; 1e7 für moderate Genauigkeit; 10.0 für extrem hohe Genauigkeit. Siehe Hinweise für die Beziehung zu ftol, die (anstelle von factr) von derscipy.optimize.minimizeSchnittstelle zu L-BFGS-B bereitgestellt wird.- pgtolfloat, optional
Die Iteration stoppt, wenn
max{|proj g_i | i = 1, ..., n} <= pgtolist, wobeiproj g_idie i-te Komponente des projizierten Gradienten ist.- epsilonfloat, optional
Schrittgröße, die bei `approx_grad=True` zur numerischen Berechnung des Gradienten verwendet wird.
- iprintint, optional
Veraltete Option, die zuvor den auf dem Bildschirm während der Problemlösung ausgegebenen Text steuerte. Jetzt gibt der Code keine Ausgabe mehr aus und dieses Schlüsselwort hat keine Funktion.
Seit Version 1.15.0 veraltet: Dieses Schlüsselwort ist veraltet und wird aus SciPy 1.18.0 entfernt.
- dispint, optional
Veraltete Option, die zuvor den auf dem Bildschirm während der Problemlösung ausgegebenen Text steuerte. Jetzt gibt der Code keine Ausgabe mehr aus und dieses Schlüsselwort hat keine Funktion.
Seit Version 1.15.0 veraltet: Dieses Schlüsselwort ist veraltet und wird aus SciPy 1.18.0 entfernt.
- maxfunint, optional
Maximale Anzahl von Funktionsauswertungen. Beachten Sie, dass diese Funktion das Limit verletzen kann, da die Gradienten mittels numerischer Differenzierung ausgewertet werden.
- maxiterint, optional
Maximale Anzahl von Iterationen.
- callbackcallable, optional
Wird nach jeder Iteration aufgerufen als
callback(xk), wobeixkder aktuelle Parametervektor ist.- maxlsint, optional
Maximale Anzahl von Schrittweiten-Suchläufen (pro Iteration). Standard ist 20.
- Rückgabe:
- xarray_like
Geschätzte Position des Minimums.
- ffloat
Wert von func am Minimum.
- ddict
Informations-Dictionary.
d[‘warnflag’] ist
0 bei Konvergenz,
1 bei zu vielen Funktionsauswertungen oder zu vielen Iterationen,
2 bei Abbruch aus einem anderen Grund, angegeben in d[‘task’]
d[‘grad’] ist der Gradient am Minimum (sollte nahe 0 sein)
d[‘funcalls’] ist die Anzahl der durchgeführten Funktionsaufrufe.
d[‘nit’] ist die Anzahl der Iterationen.
Siehe auch
minimierenSchnittstelle zu Minimierungsalgorithmen für multivariate Funktionen. Beachten Sie insbesondere die Methode 'L-BFGS-B'. Beachten Sie, dass die Option ftol über diese Schnittstelle verfügbar ist, während factr über diese Schnittstelle bereitgestellt wird, wobei factr der Faktor ist, der die Standard-Maschinen-Gleitkommapräzision multipliziert, um ftol zu erhalten:
ftol = factr * numpy.finfo(float).eps.
Hinweise
SciPy verwendet eine in C übersetzte und modifizierte Version des Fortran-Codes L-BFGS-B v3.0 (veröffentlicht am 25. April 2011, BSD-3-lizenziert). Die ursprüngliche Fortran-Version wurde von Ciyou Zhu, Richard Byrd, Jorge Nocedal und Jose Luis Morales geschrieben.
Referenzen
R. H. Byrd, P. Lu und J. Nocedal. A Limited Memory Algorithm for Bound Constrained Optimization, (1995), SIAM Journal on Scientific and Statistical Computing, 16, 5, S. 1190-1208.
C. Zhu, R. H. Byrd und J. Nocedal. L-BFGS-B: Algorithm 778: L-BFGS-B, FORTRAN routines for large scale bound constrained optimization (1997), ACM Transactions on Mathematical Software, 23, 4, S. 550 - 560.
J.L. Morales und J. Nocedal. L-BFGS-B: Remark on Algorithm 778: L-BFGS-B, FORTRAN routines for large scale bound constrained optimization (2011), ACM Transactions on Mathematical Software, 38, 1.
Beispiele
Löse ein lineares Regressionsproblem mittels
fmin_l_bfgs_b. Dazu definieren wir zunächst eine Zielfunktionf(m, b) = (y - y_model)**2, wobei y die Beobachtungen beschreibt und y_model die Vorhersage des linearen Modells alsy_model = m*x + b. Die Grenzen für die Parametermundbwerden für dieses Beispiel willkürlich als(0,5)und(5,10)gewählt.>>> import numpy as np >>> from scipy.optimize import fmin_l_bfgs_b >>> X = np.arange(0, 10, 1) >>> M = 2 >>> B = 3 >>> Y = M * X + B >>> def func(parameters, *args): ... x = args[0] ... y = args[1] ... m, b = parameters ... y_model = m*x + b ... error = sum(np.power((y - y_model), 2)) ... return error
>>> initial_values = np.array([0.0, 1.0])
>>> x_opt, f_opt, info = fmin_l_bfgs_b(func, x0=initial_values, args=(X, Y), ... approx_grad=True) >>> x_opt, f_opt array([1.99999999, 3.00000006]), 1.7746231151323805e-14 # may vary
Die optimierten Parameter in
x_optstimmen mit den Ground-Truth-Parameternmundbüberein. Als Nächstes führen wir eine grenz_beschränkte Optimierung mit dem Parameter bounds durch.>>> bounds = [(0, 5), (5, 10)] >>> x_opt, f_op, info = fmin_l_bfgs_b(func, x0=initial_values, args=(X, Y), ... approx_grad=True, bounds=bounds) >>> x_opt, f_opt array([1.65990508, 5.31649385]), 15.721334516453945 # may vary