¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Optimizador de SciPy y sus límites

Después de esta lección: Puedo usar el optimizador de SciPy y reconocer cuándo el descenso se atasca.

Lección de 70 min2 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

Un optimizador busca el mínimo por ti

Un optimizador es un programa que busca por ti el mínimo de una función. SciPy, la biblioteca científica de Python, trae uno ya hecho: la función minimize.

También tiene límites. Puede quedarse en un mínimo local, atascarse en terreno plano o divergir. Saber detectarlos evita fiarte de un resultado malo.

Al final de esta lección

Nota

Puedo usar el optimizador de SciPy y reconocer cuándo el descenso se atasca.

Palabras clave

PalabraQué significa
Optimizadorun programa que busca el mínimo de una función
Mínimo localel punto más bajo solo en su entorno
Mínimo globalel punto más bajo de toda la función
Terreno planouna zona con pendiente casi cero que no es un mínimo
Divergiralejarse sin parar del mínimo en vez de acercarse

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

minimize busca un mínimo desde tu punto inicial

La función minimize recibe la función y un punto de partida. Devuelve el punto donde cree que está el mínimo. Tú no eliges la tasa ni los pasos: SciPy los decide.

Mira siempre el campo success: dice si el método terminó bien. Aun así, un True no garantiza que sea el mejor mínimo.

Ejemplo resuelto: minimize en un valle

PiezaValor en el ejemploQué significa
Función`(x - 3) ** 2 + (y + 1) ** 2`Un valle con el fondo en (3, -1)
Punto de partida`[0, 0]`Donde empieza la búsqueda
Resultado `x``[ 3. -1.]`El punto que ha encontrado
`success``True`El método terminó bien

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Usa minimize en el laboratorio

Comando
docker exec jupyter python3 -c "from scipy.optimize import minimize; r=minimize(lambda p: (p[0]-3)**2+(p[1]+1)**2, [0, 0]); print(r.x.round(3), r.success)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un mínimo local no es el mínimo global

Una función con dos valles tiene dos mínimos. El más bajo es el mínimo global. El otro es un mínimo local: solo es el más bajo de su entorno.

El descenso termina en el valle más cercano al punto de partida, no en el más profundo.

Ejemplo resuelto: dos valles, dos resultados

Punto de partidaLlega aValor de la funciónQué es
21,131-1,07Mínimo local
-2-1,301-3,514Mínimo global
0,51,131-1,07Mínimo local
-0,5-1,301-3,514Mínimo global

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Dos inicios, dos resultados

Comando
docker exec jupyter python3 -c "from scipy.optimize import minimize; f=lambda x: x[0]**4-3*x[0]**2+x[0]; print(minimize(f,[2.0]).x.round(3), minimize(f,[-2.0]).x.round(3))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El descenso en dos valles

Código: python
# Dos valles: la función es x ** 4 - 3 * x ** 2 + x.
def pendiente(x):
    return 4 * x ** 3 - 6 * x + 1

def valor(x):
    return x ** 4 - 3 * x ** 2 + x

for inicio in [2.0, -2.0]:
    x = inicio
    for paso in range(2000):
        x = x - 0.01 * pendiente(x)
    print("desde", inicio, "llega a", round(x, 3), "valor", round(valor(x), 3))
# Prueba con inicio 0.5 y con -0.5.
# ¿A qué valle va cada uno?

Un error muy común

Advertencia

Mucha gente cree que el optimizador siempre halla el mejor punto. Solo halla uno bajo desde donde empieza. Prueba varios puntos de partida y compara el valor de la función en cada resultado.

Terreno plano y divergencia atascan el descenso

En terreno plano la pendiente es casi cero, y el descenso apenas se mueve aunque no estés en un mínimo. Un ejemplo es x ** 3 en 0: su pendiente vale 0, pero no es un mínimo.

La divergencia es lo contrario: con una tasa demasiado grande, los valores crecen sin parar. Se detecta comprobando si pasan de un límite.

Ejemplo resuelto: señales y remedios

SituaciónSeñalQué hacer
Mínimo localInicios distintos dan resultados distintosProbar varios inicios
Terreno planoPendiente casi cero y valor altoCambiar el inicio
DivergenciaLos valores crecen sin pararBajar la tasa
Rebotex salta entre dos valoresBajar la tasa

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Para ir más lejos: tu propia función

En el comando de los dos valles, cambia la función por x[0]**4-2*x[0]**2 y prueba los inicios 1.5 y -1.5. Antes de ejecutar, escribe si esperas el mismo resultado.

Después dibuja a mano la función y explica por qué sí o por qué no.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.