c optimization least-squares levenberg-marquardt

Biblioteca de optimización de mínimos cuadrados no lineales para C



optimization least-squares (4)

Estoy buscando una biblioteca en C que haga la optimización de una función objetivo (preferiblemente el algoritmo de Levenberg-Marquardt) y que admita restricciones de cuadro, restricciones de desigualdad lineal y restricciones de desigualdad no lineal.

Ya he probado varias bibliotecas, pero ninguna de ellas emplea los tipos de restricción necesarios para mi aplicación:

  • GNU GSL (no soporta restricciones en absoluto)
  • cMPFIT (solo admite restricciones de caja)
  • levmar (no admite restricciones no lineales en absoluto)

Actualmente estoy explorando NLopt , pero no estoy seguro de si puedo lograr un enfoque de mínimos cuadrados con cualquiera de los algoritmos suministrados.

Me resulta difícil creer que no hay una sola biblioteca que admita toda la gama de restricciones en este problema, así que supongo que cometí un error en algún lugar mientras buscaba en Google.

Recientemente descubrí que puedo llamar a las funciones de Matlab desde C. Aunque eso solucionaría el problema con bastante facilidad, no quiero tener que llamar a las funciones de Matlab desde C. No es rápido en mi experiencia.

Cualquier ayuda será apreciada.


MPFIT: Una biblioteca de adaptación de mínimos cuadrados de MINPACK-1 en C

MPFIT utiliza la técnica de Levenberg-Marquardt para resolver el problema de los mínimos cuadrados. En su uso típico, MPFIT se utilizará para ajustar una función suministrada por el usuario (el "modelo") a los puntos de datos proporcionados por el usuario (los "datos") mediante el ajuste de un conjunto de parámetros. MPFIT se basa en MINPACK-1 (LMDIF.F) de More ''y sus colaboradores.

http://cow.physics.wisc.edu/~craigm/idl/cmpfit.html


El enfoque que finalmente seguí es el siguiente:

  • Utilicé NLopt para la optimización y la función objetivo se construyó para calcular el error cuadrado del problema.

  • El algoritmo que mostró los resultados más prometedores fue COBYLA ( optimización local libre de derivados). Es compatible con restricciones de cuadro y restricciones no lineales. Las restricciones de inequidad lineales se introdujeron como restricciones no lineales, que en general deberían ser factibles.

La simple evaluación comparativa muestra que converge un poco más lento que un enfoque de Lev-Mar, pero la velocidad se sacrifica debido a la necesidad de restricciones.


Hace algún tiempo estaba investigando el estado de las bibliotecas de ajuste de mínimos cuadrados C / C ++. Anoté algunos enlaces, incluidos los que usted dio y también:

  • ALGLIB/optimization - Lev-Mar con restricciones de límite.

  • WNLIB / wnnlp: un paquete de optimización no lineal restringido en C (optimización general, no cuadrados mínimos). Las restricciones se manejan agregando una función de penalización.

No he usado ninguna de las bibliotecas todavía, pero NLopt parece ser lo más prometedor para mí. Sería genial si tuviera una interfaz y algoritmos especializados para el ajuste de mínimos cuadrados (ponderados).

Por cierto, ¿su nota sobre Matlab significa que tiene Lev-Mar con restricciones no lineales?


OPTIF9 se puede convertir a C (desde Fortran) y puede que ya lo haya hecho alguien.

Si lo que quiere decir con restricciones de recuadro es que admite límites superiores e inferiores en los valores de los parámetros, creo que hay una versión que lo hace.

Ese es un problema complicado, porque significa que cada vez que un parámetro llega a un límite, reduce efectivamente los grados de libertad en 1. Puede "atascarse en una pared" cuando realmente no lo desea.

Lo que hemos descubierto es que es mejor usar un minimizador sin restricciones y parámetros de transformación, a través de algo como una transformación log o logit, de modo que en el espacio de búsqueda no estén restringidos, pero en el espacio modelo estén restringidos.

En cuanto a los otros tipos de restricciones, no sé, aunque una opción es, como parte de su función objetivo, hacer que se vuelva realmente malo cuando se violan las restricciones, por lo que el optimizador evita esas áreas.

Descubrí que cuando tengo un conjunto de restricciones realmente flexible, si quiero un buen algoritmo sin problemas, uso Metropolis-Hastings . A menos que esté equivocado, si genera una muestra que viola las restricciones, simplemente puede descartar la muestra. Lleva más tiempo, pero es simple y siempre funciona.