Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Optimiser avec SciPy et ses limites

Après cette leçon: Je peux utiliser l’optimiseur de SciPy et dire quand une descente reste coincée ou diverge.

Leçon de 65 min3 commandesLab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Un optimiseur trouve-t-il toujours le meilleur point ?

SciPy est une bibliothèque Python de calcul scientifique, et sa fonction minimize cherche le minimum d’une fonction à votre place. Elle va vite, mais elle peut s’arrêter sur un faux minimum ou échouer.

Savoir lire son résultat est aussi important que de savoir la lancer.

À la fin de cette leçon

Remarque

Je peux utiliser l’optimiseur de SciPy et dire quand une descente reste coincée ou diverge.

Mots clés

MotCe que ça veut dire
Optimiseurun programme qui cherche le minimum d’une fonction
Point de départla valeur à partir de laquelle la recherche commence
Minimum localun creux plus bas que ses voisins, mais pas le plus bas
Minimum globalle point le plus bas de toute la fonction
Terrain platune zone où la pente est presque nulle

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La fonction minimize fait la descente pour vous

On donne à minimize la fonction et un point de départ. Elle fait ses pas et rend un objet résultat. Trois champs comptent.

success dit si elle s’est arrêtée sans problème. x est le point trouvé. fun est la valeur de la fonction à ce point.

Exemple travaillé : lire le résultat de minimize

ChampCe qu’il ditValeur pour (x - 3) au carré plus (y + 1) au carré
successla recherche a fini sans erreurTrue
xle point trouvé[3, -1]
funla valeur de la fonction en ce point0

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Minimiser une fonction de deux variables

Commande
docker exec jupyter python3 -c "from scipy.optimize import minimize; r = minimize(lambda v: (v[0] - 3) ** 2 + (v[1] + 1) ** 2, [0, 0]); print(r.success, [round(float(v), 3) for v in r.x], round(float(r.fun), 6))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un minimum local n’est pas le minimum global

Certaines fonctions ont deux creux. Une descente tombe dans celui qui est de son côté. Selon le point de départ, elle s’arrête dans l’un ou dans l’autre.

Le creux atteint est un minimum local. Il peut être plus haut que le minimum global. Pour s’en méfier, on essaie plusieurs points de départ.

Exemple travaillé : deux creux, deux réponses

Point de départCreux atteint (x)Valeur de la fonctionLecture
-2-1,301-3,514le minimum global
21,131-1,07un minimum local, plus haut

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Lancer l’optimiseur depuis deux départs

Commande
docker exec jupyter python3 -c "from scipy.optimize import minimize; f = lambda v: v[0] ** 4 - 3 * v[0] ** 2 + v[0]; print([round(float(minimize(f, [x0]).x[0]), 3) for x0 in (-2, 2)], [round(float(minimize(f, [x0]).fun), 3) for x0 in (-2, 2)])"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Un terrain plat arrête la descente

Une descente s’arrête quand la pente est presque nulle. Or la pente peut être nulle ailleurs qu’au fond : sur un replat, par exemple.

La fonction x au cube a une dérivée nulle en x = 0. Pourtant elle est négative à gauche et positive à droite : ce n’est pas un minimum.

Regarder la fonction autour d’un replat

Commande
docker exec jupyter python3 -c "f = lambda x: x ** 3; print(round(f(-0.1), 4), round(f(0), 4), round(f(0.1), 4), 3 * 0 ** 2)"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une divergence fait exploser les valeurs

Quand le taux est trop grand, x s’éloigne de plus en plus. Le programme n’affiche pas d’erreur : les valeurs grandissent sans fin.

On fixe donc une limite, comme 100, et on arrête si x la dépasse. Il suffit alors de réduire le taux, ou d’essayer plusieurs taux.

Détecter une divergence dans une boucle

Code: python
# Repérer une divergence : x dépasse une limite.
def derivee(x):
    return 2 * (x - 3)

x = 0.0
taux = 1.1
for pas in range(1, 31):
    x = x - taux * derivee(x)
    if abs(x) > 100:
        print("diverge au pas", pas)
        break
# Mettez taux à 0.9 : le programme n’affiche plus rien. Pourquoi ?

Une erreur fréquente

Attention

Beaucoup pensent que le point rendu par un optimiseur est forcément le meilleur. Il est seulement le creux où la recherche est tombée. Essayez plusieurs points de départ et gardez la plus petite valeur de la fonction.

Pour aller plus loin

Dans un carnet, appelez minimize sur l’erreur d’une droite avec les deux réglages a et b, puis comparez au résultat de polyfit. Ils doivent s’accorder.

Essayez ensuite minimize(f, [x0], method="Nelder-Mead") et voyez si le résultat change.

À propos de ce labo et de sa source: Lab JupyterLab de science des données : pandas, Matplotlib et scikit-learn dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.