Saltar al contenido

Visualización para la optimización de funciones en Python

15 de enero de 2021

Optimización de funciones implica encontrar la entrada que resulte en el valor óptimo de una función objetivo.

Los algoritmos de optimización navegan por el espacio de búsqueda de las variables de entrada para localizar los óptimos, y tanto la forma de la función objetivo como el comportamiento del algoritmo en el espacio de búsqueda son opacos en los problemas del mundo real.

Como tal, es común estudiar algoritmos de optimización utilizando funciones simples de baja dimensión que se pueden visualizar fácilmente directamente. Además, las muestras en el espacio de entrada de estas funciones simples realizadas por un algoritmo de optimización se pueden visualizar con su contexto apropiado.

La visualización de funciones de dimensiones inferiores y el comportamiento del algoritmo en esas funciones pueden ayudar a desarrollar las intuiciones que pueden traspasar a problemas de optimización de funciones de dimensiones superiores más complejos más adelante.

En este tutorial, descubrirá cómo crear visualizaciones para la optimización de funciones en Python.

Después de completar este tutorial, sabrá:

  • La visualización es una herramienta importante al estudiar los algoritmos de optimización de funciones.
  • Cómo visualizar muestras y funciones unidimensionales mediante diagramas de líneas.
  • Cómo visualizar muestras y funciones bidimensionales mediante diagramas de contorno y superficie.

Empecemos.

Visualización para la optimización de funciones en Python

Visualización para la optimización de funciones en Python
Foto de Nathalie, algunos derechos reservados.

Descripción general del tutorial

Este tutorial se divide en tres partes; son:

  1. Visualización para optimización de funciones
  2. Visualice la optimización de funciones 1D
    1. Función de prueba
    2. Función de prueba de muestra
    3. Gráfico de línea de la función de prueba
    4. Gráfico de dispersión de la función de prueba
    5. Gráfico de línea con Optima marcado
    6. Gráfico de línea con muestras
  3. Visualice la optimización de funciones 2D
    1. Función de prueba
    2. Función de prueba de muestra
    3. Gráfico de contorno de la función de prueba
    4. Gráfico de contorno relleno de la función de prueba
    5. Gráfico de contorno relleno de la función de prueba con muestras
    6. Gráfico de superficie de la función de prueba

Visualización para optimización de funciones

La optimización de funciones es un campo de las matemáticas que se ocupa de encontrar las entradas a una función que dan como resultado la salida óptima para la función, generalmente un valor mínimo o máximo.

La optimización puede ser sencilla para funciones diferenciales simples donde la solución se puede calcular analíticamente. Sin embargo, la mayoría de las funciones que estamos interesados ​​en resolver en el aprendizaje automático aplicado pueden o no comportarse bien y pueden ser complejas, no lineales, multivariadas y no diferenciables.

Como tal, es importante comprender una amplia gama de algoritmos diferentes que se pueden utilizar para abordar problemas de optimización de funciones.

Un aspecto importante del estudio de la optimización de funciones es comprender la función objetivo que se está optimizando y comprender el comportamiento de un algoritmo de optimización a lo largo del tiempo.

La visualización juega un papel importante al comenzar con la optimización de funciones.

Podemos seleccionar funciones de prueba simples y bien entendidas para estudiar algoritmos de optimización. Estas funciones simples se pueden trazar para comprender la relación entre la entrada a la función objetivo y la salida de la función objetivo y resaltar colinas, valles y óptimos.

Además, las muestras seleccionadas del espacio de búsqueda mediante un algoritmo de optimización también se pueden representar en la parte superior de los gráficos de la función objetivo. Estos gráficos de comportamiento de algoritmos pueden proporcionar información e intuición sobre cómo funcionan los algoritmos de optimización específicos y navegar por un espacio de búsqueda que puede generalizarse a nuevos problemas en el futuro.

Por lo general, las funciones unidimensionales o bidimensionales se eligen para estudiar los algoritmos de optimización, ya que son fáciles de visualizar utilizando gráficos estándar, como gráficos de líneas y gráficos de superficie. Exploraremos ambos en este tutorial.

Primero, exploremos cómo podríamos visualizar una optimización de función unidimensional.

Visualice la optimización de funciones 1D

Una función unidimensional toma una sola variable de entrada y genera la evaluación de esa variable de entrada.

Las variables de entrada son típicamente continuas, representadas por un valor de punto flotante de valor real. A menudo, el dominio de entrada no está restringido, aunque para los problemas de prueba imponemos un dominio de interés.

Función de prueba

En este caso, exploraremos la visualización de funciones con una función objetivo simple x ^ 2:

Esto tiene un valor óptimo con una entrada de x = 0.0, que es igual a 0.0.

El siguiente ejemplo implementa esta función objetivo y evalúa una única entrada.

Ejecutar el ejemplo evalúa el valor 4.0 con la función objetivo, que es igual a 16.0.

Pruebe la función de prueba

Lo primero que podríamos querer hacer con una nueva función es definir un rango de entrada de interés y muestrear el dominio de interés usando una cuadrícula uniforme.

Esta muestra proporcionará la base para generar un gráfico más adelante.

En este caso, definiremos un dominio de interés alrededor de los óptimos de x = 0.0 desde x = -5.0 ax = 5.0 y muestrearemos una cuadrícula de valores en este rango con incrementos de 0.1, tales como -5.0, -4.9, -4.8 etc.

Entonces podemos evaluar cada uno de los valores de x en nuestra muestra.

Finalmente, podemos verificar algunas de las entradas y sus correspondientes salidas.

Al unir esto, el ejemplo completo de muestreo del espacio de entrada y evaluación de todos los puntos de la muestra se enumera a continuación.

Ejecutar el ejemplo primero genera una muestra uniforme de puntos de entrada como esperábamos.

Luego, los puntos de entrada se evalúan utilizando la función objetivo y, finalmente, podemos ver un mapeo simple de entradas y salidas de la función objetivo.

Ahora que tenemos cierta confianza en generar una muestra de entradas y evaluarlas con la función objetivo, podemos buscar generar gráficos de la función.

Gráfico de línea de la función de prueba

Podríamos muestrear el espacio de entrada al azar, pero el beneficio de una línea o cuadrícula de puntos uniforme es que se puede usar para generar una gráfica suave.

Es suave porque los puntos en el espacio de entrada están ordenados de menor a mayor. Este orden es importante ya que esperamos (esperamos) que la salida de la función objetivo tenga una relación suave similar entre los valores, p. pequeños cambios en la entrada dan como resultado cambios localmente consistentes (suaves) en la salida de la función.

En este caso, podemos usar las muestras para generar una gráfica lineal de la función objetivo con los puntos de entrada (x) en el eje x de la gráfica y la salida (resultados) de la función objetivo en el eje y de la gráfica.

Al unir esto, el ejemplo completo se enumera a continuación.

La ejecución del ejemplo crea un gráfico de líneas de la función objetivo.

Podemos ver que la función tiene una forma de U grande, llamada parábola. Esta es una forma común al estudiar curvas, p. Ej. el estudio del cálculo.

Gráfico de línea de una función unidimensional

Gráfico de línea de una función unidimensional

Gráfico de dispersión de la función de prueba

La línea es una construcción. No es realmente la función, solo un resumen suave de la función. Siempre tenga esto en cuenta.

Recuerde que, de hecho, generamos una muestra de puntos en el espacio de entrada y la evaluación correspondiente de esos puntos.

Como tal, sería más preciso crear un diagrama de dispersión de puntos; por ejemplo:

La ejecución del ejemplo crea un diagrama de dispersión de la función objetivo.

Podemos ver la forma familiar de la función, pero no ganamos nada al trazar los puntos directamente.

La línea y la interpolación suave entre los puntos que proporciona son más útiles, ya que podemos dibujar otros puntos en la parte superior de la línea, como la ubicación de los óptimos o los puntos muestreados por un algoritmo de optimización.

Diagrama de dispersión de una función unidimensional

Diagrama de dispersión de una función unidimensional

Gráfico de línea con Optima marcado

A continuación, dibujemos de nuevo la gráfica lineal y esta vez dibujemos un punto donde se ubica el óptimo conocido de la función.

Esto puede ser útil al estudiar un algoritmo de optimización, ya que es posible que deseemos ver qué tan cerca puede llegar un algoritmo de optimización al óptimo.

Primero, debemos definir la entrada para los óptimos, luego evaluar ese punto para obtener los valores del eje xy del eje y para el trazado.

Luego podemos trazar este punto con cualquier forma o color que nos guste, en este caso, un cuadrado rojo.

Al unir esto, el ejemplo completo de creación de un diagrama de línea de la función con los óptimos resaltados por un punto se enumera a continuación.

Ejecutar el ejemplo crea el gráfico de línea familiar de la función, y esta vez, el óptimo de la función, p. Ej. la entrada que da como resultado la salida mínima de la función, está marcada con un cuadrado rojo.

Gráfico de línea de una función unidimensional con Optima marcado por un cuadrado rojo

Gráfico de línea de una función unidimensional con Optima marcado por un cuadrado rojo

Esta es una función muy simple y el cuadrado rojo del optima es fácil de ver.

A veces, la función puede ser más compleja, con muchas colinas y valles, y es posible que queramos hacer que los óptimos sean más visibles.

En este caso, podemos dibujar una línea vertical a lo largo de toda la parcela.

Al unir esto, el ejemplo completo se enumera a continuación.

Al ejecutar el ejemplo, se crea el mismo gráfico y esta vez se dibuja una línea roja que marca claramente el punto en el espacio de entrada que marca los óptimos.

Gráfico de línea de una función unidimensional con Optima marcado por una línea roja

Gráfico de línea de una función unidimensional con Optima marcado por una línea roja

Gráfico de línea con muestras

Finalmente, es posible que deseemos extraer las muestras del espacio de entrada seleccionado por un algoritmo de optimización.

Simularemos estas muestras con puntos aleatorios extraídos del dominio de entrada.

Luego podemos graficar esta muestra, en este caso usando pequeños círculos negros.

El ejemplo completo de creación de un diagrama de línea de una función con los óptimos marcados con una línea roja y una muestra de algoritmo dibujada con pequeños puntos negros se muestra a continuación.

Al ejecutar el ejemplo, se crea el gráfico de línea del dominio y se marca el óptimo con una línea roja como antes.

Esta vez, la muestra del dominio seleccionado por un algoritmo (en realidad una muestra aleatoria de puntos) se dibuja con puntos negros.

Podemos imaginar que un algoritmo de optimización real mostrará puntos que se estrechan en el dominio mientras busca cuesta abajo desde un punto de partida.

Gráfico de línea de una función unidimensional con Optima marcado por una línea roja y muestras mostradas con puntos negros

Gráfico de línea de una función unidimensional con Optima marcado por una línea roja y muestras mostradas con puntos negros

A continuación, veamos cómo podríamos realizar visualizaciones similares para la optimización de una función bidimensional.

Visualice la optimización de funciones 2D

Una función bidimensional es una función que toma dos variables de entrada, p. Ej. X y y.

Función de prueba

Podemos usar lo mismo x ^ 2 funcionar y escalarlo para que sea una función bidimensional; por ejemplo:

Esto tiene un valor óptimo con una entrada de [x=0.0, y=0.0], que es igual a 0.0.

El siguiente ejemplo implementa esta función objetivo y evalúa una única entrada.

Ejecutar el ejemplo evalúa el punto [x=4, y=4], que es igual a 32.

A continuación, necesitamos una forma de muestrear el dominio para que podamos, a su vez, muestrear la función objetivo.

Función de prueba de muestra

Una forma común de muestrear una función bidimensional es generar primero una muestra uniforme a lo largo de cada variable, X y y, luego use estas dos muestras uniformes para crear una cuadrícula de muestras, llamada cuadrícula de malla.

Esta no es una matriz bidimensional en el espacio de entrada; en cambio, son dos matrices bidimensionales que, cuando se usan juntas, definen una cuadrícula entre las dos variables de entrada.

Esto se logra duplicando todo el X matriz de muestra para cada y punto de muestra y de manera similar duplicando todo el y matriz de muestra para cada X punto de muestreo.

Esto se puede lograr usando la función meshgrid () NumPy; por ejemplo:

We can then evaluate each pair of points using our objective function.

Finally, we can review the mapping of some of the inputs to their corresponding output values.

The example below demonstrates how we can create a uniform sample grid across the two-dimensional input space and objective function.

Running the example first summarizes some points in the mesh grid, then the objective function evaluation for some points.

Finally, we enumerate coordinates in the two-dimensional input space and their corresponding function evaluation.

Now that we are familiar with how to sample the input space and evaluate points, let’s look at how we might plot the function.

Contour Plot of Test Function

A popular plot for two-dimensional functions is a contour plot.

This plot creates a flat representation of the objective function outputs for each x and y coordinate where the color and contour lines indicate the relative value or height of the output of the objective function.

This is just like a contour map of a landscape where mountains can be distinguished from valleys.

This can be achieved using the contour() Matplotlib function that takes the mesh grid and the evaluation of the mesh grid as input directly.

We can then specify the number of levels to draw on the contour and the color scheme to use. In this case, we will use 50 levels and a popular “jet” color scheme where low-levels use a cold color scheme (blue) and high-levels use a hot color scheme (red).

Tying this together, the complete example of creating a contour plot of the two-dimensional objective function is listed below.

Running the example creates the contour plot.

We can see that the more curved parts of the surface around the edges have more contours to show the detail, and the less curved parts of the surface in the middle have fewer contours.

We can see that the lowest part of the domain is the middle, as expected.

Contour Plot of a Two-Dimensional Objective Function

Contour Plot of a Two-Dimensional Objective Function

Filled Contour Plot of Test Function

It is also helpful to color the plot between the contours to show a more complete surface.

Again, the colors are just a simple linear interpolation, not the true function evaluation. This must be kept in mind on more complex functions where fine detail will not be shown.

We can fill the contour plot using the contourf() version of the function that takes the same arguments.

We can also show the optima on the plot, in this case as a white star that will stand out against the blue background color of the lowest part of the plot.

Tying this together, the complete example of a filled contour plot with the optima marked is listed below.

Running the example creates the filled contour plot that gives a better idea of the shape of the objective function.

The optima at [x=0, y=0] is then marked clearly with a white star.

Filled Contour Plot of a Two-Dimensional Objective Function With Optima Marked by a White Star

Filled Contour Plot of a Two-Dimensional Objective Function With Optima Marked by a White Star

Filled Contour Plot of Test Function with Samples

We may want to show the progress of an optimization algorithm to get an idea of its behavior in the context of the shape of the objective function.

In this case, we can simulate the points chosen by an optimization algorithm with random coordinates in the input space.

These points can then be plotted directly as black circles and their context color can give an idea of their relative quality.

Tying this together, the complete example of a filled contour plot with optimal and input sample plotted is listed below.

Running the example, we can see the filled contour plot as before with the optima marked.

We can now see the sample drawn as black dots and their surrounding color and relative distance to the optima gives an idea of how close the algorithm (random points in this case) got to solving the problem.

Filled Contour Plot of a Two-Dimensional Objective Function With Optima and Input Sample Marked

Filled Contour Plot of a Two-Dimensional Objective Function With Optima and Input Sample Marked

Surface Plot of Test Function

Finally, we may want to create a three-dimensional plot of the objective function to get a fuller idea of the curvature of the function.

This can be achieved using the plot_surface() Matplotlib function, that, like the contour plot, takes the mesh grid and function evaluation directly.

The complete example of creating a surface plot is listed below.

Running the example creates a three-dimensional surface plot of the objective function.

Surface Plot of a Two-Dimensional Objective Function

Surface Plot of a Two-Dimensional Objective Function

Additionally, the plot is interactive, meaning that you can use the mouse to drag the perspective on the surface around and view it from different angles.

Surface Plot From a Different Angle of a Two-Dimensional Objective Function

Surface Plot From a Different Angle of a Two-Dimensional Objective Function

Further Reading

This section provides more resources on the topic if you are looking to go deeper.

APIs

Articles

Summary

In this tutorial, you discovered how to create visualizations for function optimization in Python.

Specifically, you learned:

  • Visualization is an important tool when studying function optimization algorithms.
  • How to visualize one-dimensional functions and samples using line plots.
  • How to visualize two-dimensional functions and samples using contour and surface plots.

Do you have any questions?
Ask your questions in the comments below and I will do my best to answer.