scipy.optimize.fmin_bfgs: "El error deseado no necesariamente se logra debido a la pérdida de precisión"

8

Recibo la advertencia en el asunto de la publicación cuando intento optimizar una función en Python con la función scipy.optimize.fmin_bfgs . La salida completa:

Advertencia: el error deseado no se logra necesariamente debido a la pérdida de precisión

     Current function value: nan
     Iterations: 1
     Function evaluations: 18
     Gradient evaluations: 3

No es un error fatal, estoy obteniendo respuestas, pero están lejos de lo óptimo que busco.

¿Hay algún error típico de "novato" que pueda generar este error? Ayer empecé a trabajar con este paquete; tal como están las cosas, ni siquiera estoy seguro de dónde empezar a buscar. Cualquier ayuda es apreciada!

ACEG
fuente

Respuestas:

9

Es útil en situaciones como esta echar un vistazo al código fuente . ¡Esto es fácil porque todo scipyes de código abierto!

Como puede ver al leer el código fuente, el mensaje de advertencia se imprime cuando warnflag==2. Esto se establece en otra parte del código cuando la linesearchfunción devuelve Ninguno (falla).

Entonces, ¿por qué falla la búsqueda de líneas? El objetivo de un algoritmo de optimización es encontrar los mínimos de alguna función objetivo a través de un conjunto sucesivo de iteraciones. La búsqueda de línea, en este caso, está tratando de encontrar un tamaño de paso donde las aproximaciones en BFGS todavía sean válidas. Cuando el Hessian de su función o su gradiente se comportan mal de alguna manera, el tamaño del paso entre corchetes podría calcularse como cero, aunque el gradiente no sea cero.

Supongo que mi sugerencia es ir a la literatura (Nocedal y Wright tienen una buena discusión sobre la búsqueda de líneas y el método BFGS) o sobre su función y asegurarse de que se comporta bien en la región que está buscando.

Aron Ahmadia
fuente
Gracias, ya había revisado el código fuente. Por desgracia, el problema es mi falta de conocimiento teórico de BFGS :-) Logré usar BFGS con éxito con una implementación no vectorizada, así que supongo que mis matrices no se comportan como se esperaba. Esa podría ser una dirección para descubrir el problema.
ACEG
Si declara la función real que está tratando de minimizar y la región en la que está buscando, es posible que podamos darle más pistas sobre cómo proceder.
Aron Ahmadia
1
Gracias, resolví el problema mientras tanto. El error no tuvo (como sucede a menudo) absolutamente nada que ver con los resultados problemáticos. Mi presentimiento era correcto, estaba pasando matrices donde el método esperaba matrices transpuestas. Ahora todavía recibo la advertencia inicial, pero hay muchas más iteraciones y obtengo buenos valores.
ACEG
El enlace está podrido ... actualice el enlace e incluya bits relevantes en la respuesta en sí misma
innisfree
Enlace podrido fijo.
Aron Ahmadia