domingo, 7 de junio de 2020

Optimización en Python con SciPy

Resolver problemas de optimización es una herramienta esencial para la ingeniería y la ciencia y debería ser una prioridad en los programas académicos. La bibliografía para aprender la teoría que podría sugerir es el capítulo 7 del libro gratuito Mathematics for Machine Learning. Por ahora me concentraré a detallar una nota para usar la función minimize() del modulo SciPy. Me estoy basando en gran parte en el ejemplo de APmonitor. No sólo será un traducción sino que añadiré detalles importantes que fueron omitidos en su tutorial.

En la jerga de optimización, se le llama función objetivo a la función que se desea optimizar alguno o algunos de sus argumentos. En este ejemplo la función objetivo a minimizar será:
La solución del problema de minimización consiste en encontrar los valores del vector x para los cuales la salida de la función objetivo sea mínima. En la práctica la función objetivo está sujeta a restricciones por lo que este ejemplo no será la excepción:

Restricción 1. El producto de todas las variables debe ser mayor o igual a 25.
Restricción 2. La suma de los cuadrados de las variables debe ser igual a 40.
Finalmente hay que considerar los intervalos que acotan a cada una de las variables:  
Para escribir el programa de Python usando el submódulo optimize de SciPy necesitamos saber lo siguiente. La función minimize() tomará, para este ejemplo, estos argumentos:

func. Una función que debe definirse con un único argumento vectorial y retornando un único escalar.
method. La lista de métodos de minimización disponibles aparecen en la documentación. Es importante saber que los únicos métodos que permiten optimización con restricciones son ''COBYLA", "SLSQP" y "trust-constr".
bounds. Lista de tuplas con las cotas para cada variable.
constraints. Lista de diccionarios donde cada uno tiene la esctructura:
  • 'type': Tipo de restricción. 'eq' para igualdad o 'ineq' para desigualdad
  • 'func': Nombre de la función que describe la desigualdad (debe crearse) 
Código completo:

2 comentarios:

Alexander Strauffon dijo...

Ok, pues quisiera entender qué es, pero muy apenas y sé medio entender el html, así que ni para cuando.

Rodolfo Escobar dijo...

Bienvenido, este lugar es dónde aviento mis notas técnicas, dramas y demás. Todo va a la misma canasta jaja. Yo te conozco, ¿no eras del grupo de bloggers de Guerrero, el Bieno, el eterno candidato...? O al menos ellos te enlazaban.