scipy.optimize.

fmin_cg#

scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=np.float64(1.4901161193847656e-08), maxiter=None, full_output=0, disp=1, retall=0, callback=None, c1=0.0001, c2=0.4)[Quelle]#

Minimiert eine Funktion mithilfe eines nichtlinearen konjugierten Gradienten-Algorithmus.

Parameter:
faufrufbar, f(x, *args)

Zu minimierende Zielfunktion. Hier muss x ein 1D-Array der Variablen sein, die bei der Suche nach einem Minimum geändert werden sollen, und args sind die anderen (festen) Parameter von f.

x0ndarray

Ein vom Benutzer bereitgestellter erster Schätzwert für xopt, den optimalen Wert von x. Muss ein 1D-Array von Werten sein.

fprimeaufrufbar, fprime(x, *args), optional

Eine Funktion, die den Gradienten von f an der Stelle x zurückgibt. Hier sind x und args wie oben für f beschrieben. Der zurückgegebene Wert muss ein 1D-Array sein. Standardwert ist None, in diesem Fall wird der Gradient numerisch angenähert (siehe epsilon unten).

argstuple, optional

Parameterwerte, die an f und fprime übergeben werden. Muss bereitgestellt werden, wenn zusätzliche feste Parameter benötigt werden, um die Funktionen f und fprime vollständig zu spezifizieren.

gtolfloat, optional

Stoppt, wenn die Norm des Gradienten kleiner als gtol ist.

normfloat, optional

Reihenfolge, die für die Norm des Gradienten verwendet werden soll (-np.inf ist Minimum, np.inf ist Maximum).

epsilonfloat oder ndarray, optional

Schrittgröße(n), die verwendet werden sollen, wenn fprime numerisch angenähert wird. Kann ein Skalar oder ein 1D-Array sein. Standardwert ist sqrt(eps), wobei eps die Gleitkomma-Maschinengenauigkeit ist. Normalerweise ist sqrt(eps) etwa 1,5e-8.

maxiterint, optional

Maximale Anzahl von Iterationen, die durchgeführt werden sollen. Standardwert ist 200 * len(x0).

full_outputbool, optional

Wenn True, werden zusätzlich zu xopt auch fopt, func_calls, grad_calls und warnflag zurückgegeben. Siehe den Abschnitt Returns unten für zusätzliche Informationen zu optionalen Rückgabewerten.

dispbool, optional

Wenn True, wird eine Konvergenzmeldung gefolgt von xopt zurückgegeben.

retallbool, optional

Wenn True, werden die Ergebnisse jeder Iteration zu den zurückgegebenen Werten hinzugefügt.

callbackcallable, optional

Eine optionale Funktion, die vom Benutzer bereitgestellt wird und nach jeder Iteration aufgerufen wird. Aufruf erfolgt als callback(xk), wobei xk der aktuelle Wert von x0 ist.

c1float, Standard: 1e-4

Parameter für die Armijo-Bedingungsregel.

c2float, Standard: 0.4

Parameter für die Krümmungsbedingungsregel.

Rückgabe:
xoptndarray

Parameter, die f minimieren, d.h. f(xopt) == fopt.

foptfloat, optional

Gefundener Minimalwert, f(xopt). Wird nur zurückgegeben, wenn full_output True ist.

func_callsint, optional

Die Anzahl der durchgeführten Funktionsaufrufe. Wird nur zurückgegeben, wenn full_output True ist.

grad_callsint, optional

Die Anzahl der durchgeführten Gradientenaufrufe. Wird nur zurückgegeben, wenn full_output True ist.

warnflagint, optional

Ganzzahliger Wert mit Warnstatus, wird nur zurückgegeben, wenn full_output True ist.

0 : Erfolg.

1 : Die maximale Anzahl von Iterationen wurde überschritten.

2Gradienten- und/oder Funktionsaufrufe haben sich nicht geändert. Kann darauf hindeuten,

dass die Genauigkeit verloren ging, d.h. die Routine ist nicht konvergiert.

3 : NaN-Ergebnis aufgetreten.

allvecsListe von ndarray, optional

Liste von Arrays, die die Ergebnisse jeder Iteration enthalten. Wird nur zurückgegeben, wenn retall True ist.

Siehe auch

minimieren

gemeinsame Schnittstelle zu allen scipy.optimize-Algorithmen für die unbeaufsichtigte und beaufsichtigte Minimierung multivariater Funktionen. Sie bietet eine alternative Möglichkeit, fmin_cg aufzurufen, indem method='CG' angegeben wird.

Hinweise

Dieser konjugierte Gradientenalgorithmus basiert auf dem von Polak und Ribiere [1].

Konjugierte Gradientenmethoden funktionieren tendenziell besser, wenn

  1. f einen eindeutigen globalen Minimierungspunkt und keine lokalen Minima oder andere stationäre Punkte hat,

  2. f zumindest lokal durch eine quadratische Funktion der Variablen angenähert werden kann,

  3. f stetig ist und einen stetigen Gradienten hat,

  4. fprime nicht zu groß ist, z.B. eine Norm kleiner als 1000 hat,

  5. Der erste Schätzwert, x0, ist dem globalen Minimierungspunkt von f, xopt, einigermaßen nahe.

Die Parameter c1 und c2 müssen 0 < c1 < c2 < 1 erfüllen.

Referenzen

[1]

Wright & Nocedal, „Numerical Optimization“, 1999, S. 120-122.

Beispiele

Beispiel 1: Suchen Sie den minimalen Wert des Ausdrucks a*u**2 + b*u*v + c*v**2 + d*u + e*v + f für gegebene Parameterwerte und einen ersten Schätzwert (u, v) = (0, 0).

>>> import numpy as np
>>> args = (2, 3, 7, 8, 9, 10)  # parameter values
>>> def f(x, *args):
...     u, v = x
...     a, b, c, d, e, f = args
...     return a*u**2 + b*u*v + c*v**2 + d*u + e*v + f
>>> def gradf(x, *args):
...     u, v = x
...     a, b, c, d, e, f = args
...     gu = 2*a*u + b*v + d     # u-component of the gradient
...     gv = b*u + 2*c*v + e     # v-component of the gradient
...     return np.asarray((gu, gv))
>>> x0 = np.asarray((0, 0))  # Initial guess.
>>> from scipy import optimize
>>> res1 = optimize.fmin_cg(f, x0, fprime=gradf, args=args)
Optimization terminated successfully.
         Current function value: 1.617021
         Iterations: 4
         Function evaluations: 8
         Gradient evaluations: 8
>>> res1
array([-1.80851064, -0.25531915])

Beispiel 2: Lösen Sie dasselbe Problem mit der Funktion minimize. (Dieses myopts-Dictionary zeigt alle verfügbaren Optionen, obwohl in der Praxis nur nicht standardmäßige Werte benötigt würden. Der Rückgabewert ist ein Dictionary.)

>>> opts = {'maxiter' : None,    # default value.
...         'disp' : True,    # non-default value.
...         'gtol' : 1e-5,    # default value.
...         'norm' : np.inf,  # default value.
...         'eps' : 1.4901161193847656e-08}  # default value.
>>> res2 = optimize.minimize(f, x0, jac=gradf, args=args,
...                          method='CG', options=opts)
Optimization terminated successfully.
        Current function value: 1.617021
        Iterations: 4
        Function evaluations: 8
        Gradient evaluations: 8
>>> res2.x  # minimum found
array([-1.80851064, -0.25531915])