Necesito encontrar el mínimo de una función. Leer los documentos en http://docs.scipy.org/doc/scipy/reference/optimize.html , veo que hay varios algoritmos que hacen lo mismo, es decir, encontrar el mínimo. ¿Cómo sé cuál debo elegir?
algunos de los algoritmos enumerados
- Minimice una función usando el algoritmo downx simplex.
- Minimice una función usando el algoritmo BFGS.
- Minimice una función con un algoritmo de gradiente conjugado no lineal.
- Minimice la función f usando el método Newton-CG.
- Minimice una función usando el método de Powell modificado.
Mi función es lineal. la dimensionalidad es de alrededor de 232750 (esta es la cantidad de gradientes diferentes que tengo que calcular cada vez), toma aproximadamente 2 minutos calcular el gradiente y el costo una vez, por lo que no es barato. No creo que tenga limitaciones. Es determinista y continuo.
optimization
siamii
fuente
fuente
Respuestas:
Basado en lo que dijo: supongo que tiene que optimizar para 50 variables; También supongo que está teniendo una situación en la que es muy costoso encontrar derivados analíticos (y mucho menos obtener números) y que su optimización no tiene restricciones.
Permítanme enfatizar, usted es un poco desafortunado porque entre 25-30 y 100 variables es una zona de penumbra cuando se trata de elegir entre rutinas de optimización a gran o pequeña escala. Dicho esto, sin embargo, no se pierde nada.
Dado que incluso la derivada de primer orden es costosa, eliminar la idea del método de Newton. Sin embargo, es posible que tengas suerte con Quasi-Newton (BFGS) si tu Hessian es ligeramente diagonal como para empezar. CG generalmente es un poco más lento que BFGS, por lo que probablemente eso no mejore mucho las cosas; úselo si la memoria también es un problema (o simplemente elija L-BFGS en ese caso). Además, dado lo lento que es evaluar su función, un simple algoritmo de búsqueda de línea / descenso más empinado sería tortuosamente lento; Lo mismo ocurre con el recocido simulado y otras variantes de búsqueda al azar (supongo que no tiene acceso a HMC y todo ese jazz).
Entonces, cuando necesite el mejor rendimiento de su inversión cuando se trata de una evaluación de una sola función: vaya con el método de Powell y también pruebe COBYLA; a pesar de ser un algoritmo de optimización restringido porque internamente lineal se aproximará al gradiente de su función para acelerar las cosas, podrá aprovechar la linealidad de su función. Definitivamente, también prueba NLopt para Python . Tienen muchos optimizadores sin gradiente; prueba UOBYQA; también es una creación de Powell (Optimización sin restricciones por aproximaciones cuadráticas).
Muy brevemente: los algoritmos N-CG dependen de la computación del Hessian, y su Hessian parece muy costoso de computar. NLCG y BFGS no lo requieren, aunque podrían intentar calcularlo una vez en su primer paso.
Dejé el algoritmo simplex a propósito porque es una bestia totalmente diferente; nada que ver con gradientes como tales. Pruébalo pero realmente no puedo comentarlo; realmente depende de la naturaleza de su problema.
Para una primera buena referencia sobre optimización numérica, el libro de CTKelly, Métodos iterativos para la optimización, lo llevará bastante lejos, bastante bien.
fuente
Tal vez debería obtener un libro introductorio sobre optimización numérica. Deberá tener en cuenta su función para decidir el algoritmo.
Entre los algoritmos que menciona, las diferencias importantes son si se necesita el jacobiano o el hessiano o solo la función en sí.
Teniendo en cuenta que este es un sitio de preguntas y respuestas sobre estadísticas y, por lo tanto, trata con variables aleatorias: asegúrese de que su función sea determinista y pueda evaluarse de manera que produzca resultados continuos en el espacio de búsqueda.
fuente