SciPy - Optimiser
le scipy.optimize packagefournit plusieurs algorithmes d'optimisation couramment utilisés. Ce module contient les aspects suivants -
Minimisation sans contrainte et contrainte de fonctions scalaires multivariées (minimiser ()) à l'aide de divers algorithmes (par exemple BFGS, Nelder-Mead simplex, Newton Conjugate Gradient, COBYLA ou SLSQP)
Routines d'optimisation globale (force brute) (par exemple, anneal (), bassinhopping ())
Minimisation des moindres carrés (algorithmes de minimisation des moindres carrés ()) et d'ajustement de courbe (curve_fit ())
Minimiseurs de fonctions scalaires univariées (minimiser_scalar ()) et recherche de racines (newton ())
Solveurs de systèmes d'équations multivariées (root ()) utilisant une variété d'algorithmes (par exemple, des méthodes hybrides Powell, Levenberg-Marquardt ou à grande échelle comme Newton-Krylov)
Minimisation sans contrainte et contrainte des fonctions scalaires multivariées
le minimize() function fournit une interface commune aux algorithmes de minimisation sans contrainte et contrainte pour les fonctions scalaires multivariées dans scipy.optimize. Pour démontrer la fonction de minimisation, considérons le problème de minimisation de la fonction de Rosenbrock des variables NN -
$$ f (x) = \ sum_ {i = 1} ^ {N-1} \: 100 (x_i - x_ {i-1} ^ {2}) $$
La valeur minimale de cette fonction est 0, ce qui est obtenu lorsque xi = 1.
Algorithme Nelder – Mead Simplex
Dans l'exemple suivant, la routine minimiser () est utilisée avec le Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(sélectionné via le paramètre de méthode). Prenons l'exemple suivant.
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)
Le programme ci-dessus générera la sortie suivante.
[7.93700741e+54 -5.41692163e+53 6.28769150e+53 1.38050484e+55 -4.14751333e+54]
L'algorithme simplex est probablement le moyen le plus simple de minimiser une fonction assez bien comportée. Il ne nécessite que des évaluations de fonctions et constitue un bon choix pour les problèmes de minimisation simples. Cependant, comme il n'utilise aucune évaluation de gradient, la recherche du minimum peut prendre plus de temps.
Un autre algorithme d'optimisation qui n'a besoin que d'appels de fonction pour trouver le minimum est le Powell‘s method, qui est disponible en définissant method = 'powell' dans la fonction minimiser ().
Moindres carrés
Résolvez un problème de moindres carrés non linéaire avec des limites sur les variables. Compte tenu des résidus f (x) (une fonction réelle à m dimensions de n variables réelles) et de la fonction de perte rho (s) (une fonction scalaire), les moindres_squares trouvent un minimum local de la fonction de coût F (x). Prenons l'exemple suivant.
Dans cet exemple, nous trouvons un minimum de la fonction Rosenbrock sans bornes sur les variables indépendantes.
#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
Notez que nous ne fournissons que le vecteur des résidus. L'algorithme construit la fonction de coût comme une somme des carrés des résidus, ce qui donne la fonction de Rosenbrock. Le minimum exact est à x = [1.0,1.0].
Le programme ci-dessus générera la sortie suivante.
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.])
Recherche de racine
Laissez-nous comprendre comment la recherche de racine aide dans SciPy.
Fonctions scalaires
Si l'on a une équation à une seule variable, il existe quatre algorithmes de recherche de racine différents, qui peuvent être essayés. Chacun de ces algorithmes nécessite les extrémités d'un intervalle dans lequel une racine est attendue (car la fonction change de signe). En général,brentq est le meilleur choix, mais les autres méthodes peuvent être utiles dans certaines circonstances ou à des fins académiques.
Résolution en virgule fixe
Un problème étroitement lié à la recherche des zéros d'une fonction est le problème de la recherche d'un point fixe d'une fonction. Un point fixe d'une fonction est le point auquel l'évaluation de la fonction renvoie le point: g (x) = x. Clairement le point fixe deggest la racine de f (x) = g (x) −x. De manière équivalente, la racine deffest le point fixe de g (x) = f (x) + x. La routine fixed_point fournit une méthode itérative simple utilisant leAitkens sequence acceleration pour estimer le point fixe de gg, si un point de départ est donné.
Ensembles d'équations
Trouver une racine d'un ensemble d'équations non linéaires peut être obtenu en utilisant root() function. Several methods are available, amongst which hybr (the default) and lm, respectively use the hybrid method of Powell and the Levenberg-Marquardt method from the MINPACK.
The following example considers the single-variable transcendental equation.
x2 + 2cos(x) = 0
A root of which can be found as follows −
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
The above program will generate the following output.
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])