2011-02-17 8 views
5

¿Alguien ha tenido problemas con fmin_slsqp (o cualquier otra cosa en scipy.optimize) solo cuando usa números muy grandes o muy pequeños?Problema con scipy.optimize.fmin_slsqp cuando se usan números muy grandes o muy pequeños

Estoy trabajando en un código python para tomar una imagen en escala de grises y una máscara, generar un histograma y luego ajustar múltiples gaussianos al histograma. Para desarrollar el código utilicé una pequeña imagen de muestra, y después de un trabajo, el código funcionaba de manera brillante. Sin embargo, cuando normalizo el histograma primero, generando valores de contenedor < < 1, o cuando hago un histograma de imágenes enormes, generando valores de contenedor en cientos de miles, fmin_slsqp() comienza a fallar esporádicamente. Se cierra después de solo ~ 5 iteraciones, por lo general solo devuelve una versión ligeramente modificada de la suposición inicial que le di, y devuelve el modo de salida 8, que significa "derivada direccional positiva para la búsqueda de líneas". Si compruebo el tamaño de los recuentos de contenedores al principio y los escalo en la vecindad de ~ 100-1000, fmin_slsqp() funciona como siempre. Acabo de escalar cosas antes de devolver los resultados. Creo que podría dejarlo así, pero se siente como un truco.

He mirado alrededor y he encontrado gente hablando sobre el valor épsilon, que es básicamente el dx usado para aproximar derivados, pero el ajuste no ha ayudado. Aparte de eso, no he encontrado nada útil todavía. Cualquier idea sería muy apreciada. Gracias por adelantado.

James

Respuesta

4

¿Va a actualizar su estimación inicial ("x 0") cuando sus cambios de datos subyacentes escalar dramáticamente? para cualquier problema iterativo de optimización lineal, estos problemas ocurrirán si su conjetura inicial está lejos de los datos que está tratando de encajar. Es más un problema de optimización que un problema espurio.

5

He tenido problemas similares optimize.leastsq. Los datos que necesito tratar a menudo son muy pequeños, como 1e-18 y demás, y noté que leastsq no converge a los parámetros que mejor se ajustan en esos casos. Solo cuando escalo los datos a algo más común (como en cientos, miles, etc., algo que puede mantener la resolución y el rango dinámico con enteros), puedo dejar que leastsq converja en algo muy razonable.

He estado tratando un poco con esos parámetros de tolerancia opcionales para que yo no tengo que escalar los datos antes de la optimización, pero no he tenido mucha suerte con él ...

¿Alguien sabe un buen general enfoque para evitar este problema con las funciones en el paquete scipy.optimize? Apreciaría que pudieras compartir ... Creo que la raíz es el mismo problema con los OP's.

1

También tuve problemas con este problema, pero lo resolví en mi proyecto. No estoy seguro si esta es una solución general.

La razón fue que el scipy.optimize.fmin_slsqp calculó el gradiente con un enfoque aproximado cuando el argumento jac está establecido por False o por defecto. El gradiente producido a partir del enfoque aproximado no se normalizó (a gran escala). Al calcular la longitud del paso, el gran valor de gradiente influiría en el rendimiento y la precisión de la búsqueda de línea. Esta podría ser la razón por la que obtuvimos Positive directional derivative for linesearch.

Puede intentar implementar la forma cerrada de la matriz jacobiana en la función objeto y pasarla al argumento jac. Lo que es más importante, debe volver a escalar el valor de la matriz jacobiana (como la normalización) para evitar afectar la búsqueda de líneas.

Mejor.

Cuestiones relacionadas