Hola a todos :] así que la versión corta es sólo el título, y específicamente en lo que respecta a los algoritmos incluidos en R's optimx::optimx()
en method =
es decir: Nelder-Mead', 'BFGS', 'CG', 'L-BFGS-B', 'nlm', 'nlminb', 'spg', 'ucminf', 'newuoa', 'bobyqa', 'nmkb', 'hjkb', 'Rcgmin', y 'Rvmmin' . Tengo una idea general de cómo funcionan algunos de ellos, pero en aplicaciones del mundo real algunos tardan más en ejecutarse que otros y no estoy muy seguro de cuándo ese tiempo extra está justificado o no. Es de suponer que ninguno de ellos es estrictamente mejor que otro, si no, ¿para qué molestarse en incluirlos en el paquete?
En concreto, me interesa saber cuáles son los mejores para atravesar geometrías especialmente complicadas llenas de óptimos locales en múltiples dimensiones. Además, ¿cuáles son las mejores formas de mejorar el rendimiento y la estabilidad de la optimización en este contexto? Por ejemplo, un truco común en la filogenética bayesiana es elevar la probabilidad a alguna potencia entre (0,1) para proporcionar una distribución de propuesta más flexible durante MC3 (es decir, 'monte carlo de cadena de markov acoplada a metrópolis'). Estas cadenas 'calentadas' pueden atravesar los espacios entre los máximos locales con más facilidad... pero no estoy seguro de si eso se aplicaría con diferentes algoritmos de optimización o cuándo. ¿Alguna idea? También puedo simplemente volver a ejecutar el algoritmo de optimización muchas veces y tomar el mínimo de las ejecuciones, pero eso es costoso.
OK, versión más larga de la pregunta con la motivación / fondo actual. A menudo me encuentro en la posición de tener que visualizar los datos con alguna propiedad discreta que quiero codificar en la visualización de datos utilizando el color. Hay un montón de paletas de colores discretos por ahí, por ejemplo, en los paquetes de RColorBrewer o wesanderson . A veces, sin embargo, quiero utilizar una paleta específica, pero tiene muy pocos colores -- por ejemplo, hay 9 colores incluidos en "Set1" en RColorBrewer, y necesito 12. Así que traté de escribir un pequeño script para encontrar nuevos colores para añadir a un espacio de color discreto existente que maximice la separación de los colores existentes. Pero parece que tiende a quedarse atascado en mínimos locales, a juzgar por el hecho de que las ejecuciones separadas de optimx()
devuelven valores diferentes, cada uno informando alegremente de la convergencia. Por ejemplo, aquí hay tres ejecuciones separadas de mi script con inicialización aleatoria de parámetros de color a partir de normales iid:
No es un problema de optimización ridículamente alta D - en esta aplicación, cada uno de mis seis "nuevos colores" vive en un reescalado y logit-transformado tono-saturación-luminosidad espacio de color, mi función objetivo es la media armónica distancia euclídea a todos los demás colores (tanto existentes como propuestos) en el espacio cartesiano (convertido de cilíndrica), Tengo una penalización doble exponencial débil centrada en 0 para ayudar a regularizar en caso de que un color realmente ocupe los valores límite para que la optimización no persiga el infinito sin límite, y estoy tomando el mínimo de múltiples ejecuciones de optimx
y explorar el rendimiento de los distintos métodos incluidos en él.
Algunas otras notas:
En los ejemplos anteriores, los círculos son colores existentes y los cuadrados son colores propuestos; el tamaño de esos puntos es proporcional a su luminosidad; y su ubicación viene dada por algún ángulo [matiz] y radio [saturación] en un círculo de luminosidad = 50%.
Existe un problema general de "no identificabilidad" entre los nuevos colores propuestos. Intenté resolverlo tomando mi vector de colores y exponenciando y sumando acumulativamente todos sus valores de luminosidad, excepto el primero, antes de aplicar el logaritmo inverso al espacio de color HSL, para que el primer color fuera el más oscuro y cada uno de los siguientes, más claro que el anterior.
Si se añade sólo un color en 3D, una búsqueda en cuadrícula podría funcionar bien, y supongo que podría haber garantías teóricas de cómo de pobre puede ser el rendimiento máximo de algún algoritmo codicioso, pero no creo que encontrar un óptimo en 18 (o las que sean) dimensiones sea mucho pedir.
Probé otros tipos de medias (geométricas, aritméticas) y otros tipos de funciones (por ejemplo, maximizar la distancia mínima a un punto), pero me pareció que la armónica era la más intuitivamente satisfactoria.
También tengo algunos otros botones que, por ejemplo, reducen y amplían la separación entre puntos en las dimensiones de luminosidad y saturación, ya que mi intuición es que el tono es más importante para separar los colores a simple vista, y otro que hace que la optimización prefiera puntos que sean más similares en luminosidad y saturación a los puntos existentes, ya que no serviría de nada tener una paleta agradable, tenue y terrosa y obtener una sugerencia de rosa neón, o un montón de pasteles que te digan oye, el azul oscuro quedaría muy contrastado aquí.
Si consigo que esta versión más sencilla funcione correctamente, también podría intentar ponderar el espectro de luz visible sobre el del ojo humano función de luminosidad fotópica para que la distancia angular se integre / transforme de acuerdo con esas curvas, o intente meter también algo de ponderación del daltonismo).
Gracias por su ayuda.