Soit une fonction
Il est possible de chercher
Exemple : On cherche le minimum de
On imagine un problème d'optimisation en 2D comme un terrain avec du relief,
La méthode du gradient consiste a prendre un point au hasard et descendre dans la direction qui descend le plus afin de trouver le minimum de
L'algorithme du gradient consiste à :
def J(x, y):
return x**2 + 0.5 * y**2 - 2 * x + 3
x = np.linspace(-3,3,100) # genere des points a distance egale sur l'intervalle [-3,3]
y = np.linspace(-3,3,100)
mx, my = np.meshgrid(x,y)
mz = J(mx, my)
Calcul du gradient :
def grad_J(x,y):
return np.array([2*x-2, y]) # calculé à la main à partir de J
Algorithme du gradient :
x = np.array([0,0]) # un point au hasard
µ = 0.1 # plus il est petit et moins on avance vite
e = 0.0001 # epsilon pour la condition d'arrêt
while True:
x_old = x
x = x - µ * grad_J(*x) # *x donne en arguments toutes les valeurs de x donc x[0] en 1er arg et x[1] en 2e
if np.square(x_old - x).sum() < e**2:
break
Le minimum obtenu en appelant
On stocke les valeurs des points entre le point initial et le point final pour obtenir un ensemble de points et tracer des courbes de convergence.
def minimum_J(start_value, µ=0.1, e = 0.001):
x = [np.array(start_value)]
while True:
x.append(x[-1] - µ * grad_J(*x[-1]))
if np.square(x[-1] - x[-2]).sum() < e**2:
break
x = minimum_J(start_value = (0,1)) # valeur initiale non alignee avec la solution
Comment est-ce que
La valeur de