Quelques exemples de comment trouver numériquement le minimum local d'une fonction avec scipy en python:
Définir une fonction en python
Soit par exemple la fonction suivante:
from pylab import figure, cm
import matplotlib.pyplot as plt
import numpy as np
def function(x):
return 3.0*x**2 + 4 * x - 4
x = np.arange(-5.0,5.0,0.1)
y = function(x)
fig = figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')
plt.plot(x,y)
plt.grid()
plt.axvline(x=-4.0/(2.0*2.4),color='red')
plt.show()
Dans cet exemple on peut calculer le minimum analytiquement:
print(-4.0/(2.0*3.0))
donne
-0.6666666666666666
Méthode de Nelder-Mead
from scipy.optimize import minimize
x0 = 4.0
res = minimize(function, x0, method='Nelder-Mead', tol=1e-6)
print(res.x[0])
donne
-0.6666664123535198
Algorithme de gradient conjugué
x0 = 4.0
res = minimize(function, x0, method='CG', tol=1e-6)
print(res.x[0])
donne
-0.6666666709714467
Algorithme BFGS
from scipy.optimize import minimize
x0 = 4.0
res = minimize(function, x0, method='BFGS', tol=1e-6)
print(res.x[0])
donne
-0.6666666860653405
Algorithme du gradient
from scipy import misc
alpha = 0.1 # learning rate
nb_max_iter = 100 # Nb max d'iteration
eps = 1e-6 # stop condition
x0 = 4.0 # start point
y0 = function(x0)
cond = eps + 10.0 # start with cond greater than eps (assumption)
nb_iter = 0
tmp_y = y0
while cond > eps and nb_iter < nb_max_iter:
x0 = x0 - alpha * misc.derivative(function, x0)
y0 = function(x0)
nb_iter = nb_iter + 1
cond = abs( tmp_y - y0 )
tmp_y = y0
#print(x0,y0,cond)
print(x0)
donne
-0.6664709324799999