SciPy (prononcé sai pie) est un package mathématique basé sur numpy qui comprend également les bibliothèques C et Fortran. SciPy transforme votre session Python interactive en un environnement complet de science des données comme MATLAB, IDL, Octave, R ou SciLab.
Dans cet article, nous examinerons les techniques de base de la programmation mathématique - résoudre des problèmes d'optimisation conditionnelle pour une fonction scalaire de plusieurs variables à l'aide du package scipy.optimize. Les algorithmes d'optimisation sans contraintes ont déjà été discutés dans dernier article. Une aide plus détaillée et à jour sur les fonctions scipy peut toujours être obtenue en utilisant la commande help(), Shift+Tab ou dans documents officiels.
introduction
Une interface commune pour résoudre les problèmes d'optimisation conditionnelle et sans contrainte dans le package scipy.optimize est fournie par la fonction minimize(). Cependant, on sait qu'il n'existe pas de méthode universelle pour résoudre tous les problèmes, de sorte que le choix d'une méthode adéquate incombe, comme toujours, au chercheur.
L'algorithme d'optimisation approprié est spécifié à l'aide de l'argument de fonction minimize(..., method="").
Pour l'optimisation conditionnelle d'une fonction de plusieurs variables, des implémentations des méthodes suivantes sont disponibles :
SLSQP — programmation quadratique séquentielle avec contraintes, méthode newtonienne de résolution du système de Lagrange. Article wiki.
TNC - Newton tronqué contraint, nombre d'itérations limité, idéal pour les fonctions non linéaires avec un grand nombre de variables indépendantes. Article wiki.
L-BFGS-B — une méthode de l'équipe Broyden – Fletcher – Goldfarb – Shanno, implémentée avec une consommation de mémoire réduite en raison du chargement partiel des vecteurs de la matrice hessienne. Article wiki, article sur Habré.
COBYLA — MARE Constrained Optimization By Linear Approximation, optimisation contrainte avec approximation linéaire (sans calcul de gradient). Article wiki.
Selon la méthode choisie, les conditions et restrictions de résolution du problème sont fixées différemment :
objet de classe Bounds pour les méthodes L-BFGS-B, TNC, SLSQP, trust-constr ;
liste (min, max) pour les mêmes méthodes L-BFGS-B, TNC, SLSQP, trust-constr ;
un objet ou une liste d'objets LinearConstraint, NonlinearConstraint pour COBYLA, SLSQP, méthodes trust-constr ;
dictionnaire ou liste de dictionnaires {'type':str, 'fun':callable, 'jac':callable,opt, 'args':sequence,opt} pour les méthodes COBYLA, SLSQP.
Aperçu de l'article :
1) Envisagez l'utilisation d'un algorithme d'optimisation conditionnelle dans la région de confiance (method=”trust-constr”) avec des contraintes spécifiées comme objets Bounds, LinearConstraint, NonlinearConstraint ;
2) Envisager une programmation séquentielle par la méthode des moindres carrés (méthode = "SLSQP") avec des restrictions précisées sous forme de dictionnaire {'type', 'fun', 'jac', 'args'};
3) Analyser un exemple d'optimisation de produits fabriqués en utilisant l'exemple d'un studio web.
Mise en œuvre de la méthode trust-constr basé sur EQSQP pour les problèmes avec des contraintes de forme d'égalité et sur VOYAGE pour les problèmes avec des contraintes sous forme d’inégalités. Les deux méthodes sont mises en œuvre par des algorithmes permettant de trouver un minimum local dans la région de confiance et conviennent bien aux problèmes à grande échelle.
Formulation mathématique du problème de la recherche d'un minimum sous forme générale :
Pour les contraintes d'égalité stricte, la limite inférieure est fixée égale à la limite supérieure .
Pour une contrainte unidirectionnelle, la limite supérieure ou inférieure est fixée np.inf avec le signe correspondant.
Soit il faut trouver le minimum d'une fonction de Rosenbrock connue de deux variables :
Dans ce cas, les restrictions suivantes sont définies sur son domaine de définition :
Dans notre cas, il existe une solution unique au point , pour lequel seules les première et quatrième restrictions sont valables.
Passons en revue les restrictions de bas en haut et voyons comment nous pouvons les écrire dans scipy.
Restrictions и Définissons-le à l'aide de l'objet Bounds.
Lors du calcul de la matrice de Hesse demande beaucoup d'efforts, vous pouvez utiliser un cours HessianUpdateStrategy. Les stratégies suivantes sont disponibles : BFGS и SR1.
La matrice jacobienne des contraintes peut également être calculée en utilisant des différences finies. Cependant, dans ce cas, la matrice hessienne ne peut pas être calculée en utilisant des différences finies. Le Hessian doit être défini comme une fonction ou à l’aide de la classe HessianUpdateStrategy.
Alternativement, les dérivées première et seconde de la fonction optimisée peuvent être approchées. Par exemple, le Hessian peut être approximé à l'aide de la fonction SR1 (approximation quasi-newtonienne). Le gradient peut être approché par des différences finies.
from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr', jac="2-point", hess=SR1(),
constraints=[linear_constraint, nonlinear_constraint],
options={'verbose': 1}, bounds=bounds)
print(res.x)
Méthode d'optimisation conditionnelle="SLSQP"
La méthode SLSQP est conçue pour résoudre des problèmes de minimisation d'une fonction sous la forme :
Où и — des ensembles d'indices d'expressions décrivant des restrictions sous forme d'égalités ou d'inégalités. — des ensembles de bornes inférieures et supérieures pour le domaine de définition de la fonction.
Les contraintes linéaires et non linéaires sont décrites sous forme de dictionnaires avec clés type, fun и jac.
ineq_cons = {'type': 'ineq',
'fun': lambda x: np.array ([1 - x [0] - 2 * x [1],
1 - x [0] ** 2 - x [1],
1 - x [0] ** 2 + x [1]]),
'jac': lambda x: np.array ([[- 1.0, -2.0],
[-2 * x [0], -1.0],
[-2 * x [0], 1.0]])
}
eq_cons = {'type': 'eq',
'fun': lambda x: np.array ([2 * x [0] + x [1] - 1]),
'jac': lambda x: np.array ([2.0, 1.0])
}
La recherche du minimum s'effectue de la manière suivante :
Optimization terminated successfully. (Exit mode 0)
Current function value: 0.34271757499419825
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
[0.41494475 0.1701105 ]
Exemple d'optimisation
A propos du passage à la cinquième structure technologique, regardons l'optimisation de la production à l'aide de l'exemple d'un studio web, qui nous rapporte un revenu modeste mais stable. Imaginons-nous en tant que directeur d'une galère qui produit trois types de produits :
x0 - vente de pages de destination, à partir de 10 tr.
x1 - sites Web d'entreprise, à partir de 20 tr.
x2 - boutiques en ligne, à partir de 30 tr.
Notre équipe de travail amicale comprend quatre juniors, deux intermédiaires et un senior. Leur fonds mensuel de temps de travail :
Juin : 4 * 150 = 600 чел * час,
milieu: 2 * 150 = 300 чел * час,
sénateur : 150 чел * час.
Laissez le premier junior disponible consacrer (0, 1, 2) heures au développement et au déploiement d'un site de type (x10, x20, x30), intermédiaire - (7, 15, 20), senior - (5, 10, 15 ) heures du meilleur moment de votre vie.
Comme tout administrateur normal, nous souhaitons maximiser les profits mensuels. La première étape vers le succès est d'écrire la fonction objectif value comme le montant des revenus des produits fabriqués par mois :
Et enfin, l’hypothèse la plus optimiste est qu’en raison du prix bas et de la haute qualité, une file de clients satisfaits fait constamment la queue pour nous. Nous pouvons choisir nous-mêmes les volumes de production mensuels, en nous basant sur la résolution du problème d'optimisation contraint avec scipy.optimize:
Conclusion : pour que le réalisateur reçoive son maximum bien mérité, il est optimal de créer 8 landing pages, 6 sites de taille moyenne et 3 boutiques par mois. Dans ce cas, le senior doit labourer sans lever les yeux de la machine, la charge des intermédiaires sera d'environ 2/3, les juniors moins de la moitié.
Conclusion
L'article décrit les techniques de base pour travailler avec le package scipy.optimize, utilisé pour résoudre des problèmes de minimisation conditionnelle. Personnellement j'utilise scipy purement académique, c’est pourquoi l’exemple donné est si comique.
De nombreux exemples théoriques et virtuels peuvent être trouvés, par exemple, dans le livre de I.L. Akulich « Programmation mathématique dans les exemples et les problèmes ». Application plus hardcore scipy.optimize construire une structure 3D à partir d'un ensemble d'images (article sur Habré) peut être consulté dans livre de recettes scipy.
La principale source d'information est docs.scipy.orgceux qui souhaitent contribuer à la traduction de cette section et d'autres scipy Bienvenue à GitHub.
merci méphistophées pour participer à la préparation de la publication.