SciPy - Optimieren

Das scipy.optimize packagebietet mehrere häufig verwendete Optimierungsalgorithmen. Dieses Modul enthält folgende Aspekte:

  • Uneingeschränkte und eingeschränkte Minimierung multivariater Skalarfunktionen (minim ()) unter Verwendung einer Vielzahl von Algorithmen (z. B. BFGS, Nelder-Mead-Simplex, Newton-Konjugat-Gradient, COBYLA oder SLSQP)

  • Globale (Brute-Force-) Optimierungsroutinen (z. B. Anneal (), Basinhopping ())

  • Algorithmen zur Minimierung der kleinsten Quadrate (Leastsq ()) und zur Kurvenanpassung (Curve_fit ())

  • Minimierer für univariate Skalarfunktionen (minim_scalar ()) und Wurzelfinder (newton ())

  • Multivariate Gleichungssystemlöser (root ()) unter Verwendung einer Vielzahl von Algorithmen (z. B. Hybrid-Powell, Levenberg-Marquardt oder groß angelegte Methoden wie Newton-Krylov)

Unbeschränkte und eingeschränkte Minimierung multivariater Skalarfunktionen

Das minimize() function bietet eine gemeinsame Schnittstelle zu uneingeschränkten und eingeschränkten Minimierungsalgorithmen für multivariate Skalarfunktionen in scipy.optimize. Betrachten Sie zur Demonstration der Minimierungsfunktion das Problem der Minimierung der Rosenbrock-Funktion der NN-Variablen -

$$ f (x) = \ sum_ {i = 1} ^ {N-1} \: 100 (x_i - x_ {i-1} ^ {2}) $$

Der Minimalwert dieser Funktion ist 0, was erreicht wird, wenn xi = 1 ist.

Nelder-Mead-Simplex-Algorithmus

Im folgenden Beispiel wird die Routine minim () mit dem verwendet Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(ausgewählt über den Methodenparameter). Betrachten wir das folgende Beispiel.

import numpy as np
from scipy.optimize import minimize

def rosen(x):

x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')

print(res.x)

Das obige Programm erzeugt die folgende Ausgabe.

[7.93700741e+54  -5.41692163e+53  6.28769150e+53  1.38050484e+55  -4.14751333e+54]

Der Simplex-Algorithmus ist wahrscheinlich der einfachste Weg, um eine ziemlich gut verhaltene Funktion zu minimieren. Es erfordert nur Funktionsbewertungen und ist eine gute Wahl für einfache Minimierungsprobleme. Da jedoch keine Gradientenauswertungen verwendet werden, kann es länger dauern, bis das Minimum gefunden ist.

Ein weiterer Optimierungsalgorithmus, der nur Funktionsaufrufe benötigt, um das Minimum zu finden, ist der Powell‘s method, die durch Setzen von method = 'powell' in der Funktion minim () verfügbar ist.

Kleinsten Quadrate

Lösen Sie ein nichtlineares Problem der kleinsten Quadrate mit Grenzen für die Variablen. Bei den Residuen f (x) (eine m-dimensionale reelle Funktion von n reellen Variablen) und der Verlustfunktion rho (s) (eine Skalarfunktion) finden die kleinsten Quadrate ein lokales Minimum der Kostenfunktion F (x). Betrachten wir das folgende Beispiel.

In diesem Beispiel finden wir ein Minimum der Rosenbrock-Funktion ohne Grenzen für die unabhängigen Variablen.

#Rosenbrock Function
def fun_rosenbrock(x):
   return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
   
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)

print res

Beachten Sie, dass wir nur den Vektor der Residuen angeben. Der Algorithmus konstruiert die Kostenfunktion als Summe der Quadrate der Residuen, was die Rosenbrock-Funktion ergibt. Das genaue Minimum liegt bei x = [1.0,1.0].

Das obige Programm erzeugt die folgende Ausgabe.

active_mask: array([ 0., 0.])
      cost: 9.8669242910846867e-30
      fun: array([ 4.44089210e-15, 1.11022302e-16])
      grad: array([ -8.89288649e-14, 4.44089210e-14])
      jac: array([[-20.00000015,10.],[ -1.,0.]])
   message: '`gtol` termination condition is satisfied.'
      nfev: 3
      njev: 3
   optimality: 8.8928864934219529e-14
      status: 1
      success: True
         x: array([ 1., 1.])

Wurzelfindung

Lassen Sie uns verstehen, wie Root Finding in SciPy hilft.

Skalarfunktionen

Wenn man eine Einzelvariablengleichung hat, gibt es vier verschiedene Wurzelfindungsalgorithmen, die ausprobiert werden können. Jeder dieser Algorithmen erfordert die Endpunkte eines Intervalls, in dem eine Wurzel erwartet wird (weil die Funktion die Vorzeichen ändert). Im Allgemeinen,brentq ist die beste Wahl, aber die anderen Methoden können unter bestimmten Umständen oder für akademische Zwecke nützlich sein.

Fixpunktlösung

Ein Problem, das eng mit dem Finden der Nullen einer Funktion zusammenhängt, ist das Problem, einen festen Punkt einer Funktion zu finden. Ein fester Punkt einer Funktion ist der Punkt, an dem die Auswertung der Funktion den Punkt zurückgibt: g (x) = x. Klar der Fixpunkt vonggist die Wurzel von f (x) = g (x) −x. Entsprechend die Wurzel vonffist der feste Punkt von g (x) = f (x) + x. Die Routine fixed_point bietet eine einfache iterative Methode unter Verwendung vonAitkens sequence acceleration den festen Punkt von schätzen gg, wenn ein Ausgangspunkt angegeben ist.

Gleichungssysteme

Das Finden einer Wurzel eines Satzes nichtlinearer Gleichungen kann unter Verwendung der erreicht werden root() function. Es stehen verschiedene Methoden zur Verfügung, darunterhybr (Standardeinstellung) und lm verwenden jeweils die hybrid method of Powell und die Levenberg-Marquardt method aus dem MINPACK.

Das folgende Beispiel betrachtet die transzendentale Gleichung mit einer Variablen.

x2 + 2cos(x) = 0

Eine Wurzel davon kann wie folgt gefunden werden -

import numpy as np
from scipy.optimize import root
def func(x):
   return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol

Das obige Programm erzeugt die folgende Ausgabe.

fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
   nfev: 10
   qtf: array([ -2.77644574e-12])
      r: array([-3.34722409])
   status: 1
   success: True
      x: array([-0.73908513])