Estoy tratando de implementar el algoritmo Nelder-Mead para optimizar una función. La página de Wikipedia sobre Nelder-Mead es sorprendentemente clara sobre todo el algoritmo, excepto por su criterio de detención. Ahí dice tristemente:
Verifique la convergencia [se necesita aclaración] .
Probé y probé un par de criterios yo mismo:
Deténgase si donde es pequeño y donde es el -ésimo vértice del simplex, ordenado de bajo ( ) a alto ( ) valores de función. En otras palabras, cuando el valor máximo del simplex es casi igual al valor mínimo. Descubrí que esto no funcionaba correctamente, ya que esto no garantiza lo que hace la función dentro del simplex. Ejemplo, considere la función: Esto es, por supuesto, trivial para optimizar, pero digamos que hacemos esto con NM, y que nuestros dos puntos simplex sean yϵ x i i f ( x 1 ) f ( x N + 1 ) f ( x ) = x 2 x 1 = - 1 x 2 = 1
. El algoritmo convergería aquí sin encontrar su óptimo.La segunda opción implica evaluar el centroide del símplex: detener si . Esto supone que si el punto más bajo del simplex y el centroide tienen valores similares, el simplex es lo suficientemente pequeño como para llamar a la convergencia.
¿Es esta una forma adecuada de verificar la convergencia? ¿O hay una forma establecida de verificar esto? No pude encontrar ninguna fuente sobre esto, ya que la mayoría de los resultados de búsqueda se centran en la complejidad del algoritmo.
Respuestas:
La explicación de este "algoritmo simplex de descenso" en las versiones originales de Numerical Recipes es particularmente lúcida y útil. Por lo tanto, citaré partes relevantes de la misma. Aquí está el fondo:
Ahora para el problema en cuestión, terminando el algoritmo. Tenga en cuenta la generalidad de la cuenta: los autores proporcionan consejos intuitivos y útiles para terminar cualquier optimizador multidimensional y luego muestran específicamente cómo se aplica a este algoritmo en particular. El primer párrafo responde a la pregunta que tenemos ante nosotros:
[Páginas 290-292.]
Referencia
William H. Press y col. , Recetas Numéricas: El Arte de la Computación Científica. Cambridge University Press (1986). Visite http://numerical.recipes/ para ver las últimas ediciones.
fuente
No es una respuesta completa, pero es demasiado larga para un comentario y puede ponerlo en el camino correcto.
Este tema se trata brevemente en la página 171 de "Métodos numéricos compactos para computadoras", segunda edición, de John C. Nash. Y resulta ser la referencia citada para la rutina Nelder-Mead implementada en la
optim()
función de R. Citando la parte relevante:Un vistazo rápido a la fuente de
optim()
indica que utiliza la diferencia entre los valores de función más altos y más bajos (de los puntos que definen el símplex) para determinar la convergencia:if (VH <= VL + convtol || VL <= abstol) break;
¿DóndeVH
está el valor alto yVL
el valor bajo? Esto viene con la advertencia de que eché un vistazo muy rápido a la fuente, y probablemente me falta algo.Ahora, su opción (1) parece ser el segundo enfoque defendido por Nash. También habla sobre el problema que encontraste:
Las referencias originales a las que Nash se refiere aquí son:
Nelder JA, Mead R. 1965. Un método simplex para la minimización de funciones. The Computer Journal 7: 308-313.
O'Neill R. 1971. Algoritmo AS 47: minimización de funciones utilizando un procedimiento simplex. Estadística Aplicada 20: 338-345.
fuente
queda por ver - bienvenidos casos de prueba reales.
(
Stopiter
Además, una clase real tiene muchas condiciones de paradapatience
; la más simple es la hora del reloj de pared).Ver también:
NLopt : muchos algoritmos, incluido Nelder-Mead, fáciles de comparar. Consulte especialmente las notas sobre Comparación de algoritmos
cuesta abajo : la paciencia se detiene con
min_improvement
fuente