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
| Palabra | Qué significa |
|---|---|
| Optimizador | un programa que busca el mínimo de una función |
| Mínimo local | el punto más bajo solo en su entorno |
| Mínimo global | el punto más bajo de toda la función |
| Terreno plano | una zona con pendiente casi cero que no es un mínimo |
| Divergir | alejarse 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
| Pieza | Valor en el ejemplo | Qué 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
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 partida | Llega a | Valor de la función | Qué es |
|---|---|---|---|
| 2 | 1,131 | -1,07 | Mínimo local |
| -2 | -1,301 | -3,514 | Mínimo global |
| 0,5 | 1,131 | -1,07 | Mínimo local |
| -0,5 | -1,301 | -3,514 | Mínimo global |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Dos inicios, dos resultados
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
# 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ón | Señal | Qué hacer |
|---|---|---|
| Mínimo local | Inicios distintos dan resultados distintos | Probar varios inicios |
| Terreno plano | Pendiente casi cero y valor alto | Cambiar el inicio |
| Divergencia | Los valores crecen sin parar | Bajar la tasa |
| Rebote | x salta entre dos valores | Bajar 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.