Bibliothèque d’optimisation des moindres carrés non linéaires pour C

Je cherche une bibliothèque en C qui optimise une fonction objective (de préférence l’algorithme de Levenberg-Marquardt) et supporte les contraintes de boîte, les contraintes d’inégalité linéaires et les contraintes d’inégalité non linéaires.

J’ai déjà essayé plusieurs bibliothèques, mais aucune d’entre elles n’utilise les types de contrainte nécessaires pour mon application:

  • GNU GSL (ne supporte pas les contraintes)
  • cMPFIT (prend en charge uniquement les contraintes de boîte)
  • levmar (ne supporte pas du tout les contraintes non linéaires)

J’explore actuellement NLopt , mais je ne suis pas sûr de pouvoir obtenir une approche des moindres carrés avec l’un des algorithmes fournis.

J’ai du mal à croire qu’il n’y ait pas une seule bibliothèque supportant toutes les contraintes de ce problème, alors j’imagine que j’ai commis une erreur quelque part pendant la recherche sur Google.

J’ai récemment découvert que je pouvais appeler les fonctions Matlab depuis C. Bien que cela résoudrait le problème assez facilement, je ne voudrais pas avoir à appeler les fonctions Matlab depuis C. Ce n’est pas rapide dans mon expérience.

Toute aide est la bienvenue.

Il y a quelque temps, je recherchais l’état des bibliothèques d’ajustement des moindres carrés C / C ++. J’ai noté quelques liens, y compris ceux que vous avez donnés et aussi:

  • ALGLIB / optimisation – Lev-Mar avec des contraintes de limites.

  • WNLIB / wnnlp – un package d’optimisation non linéaire sous contrainte en C (optimisation générale, pas des moindres carrés). Les contraintes sont gérées en ajoutant une fonction de pénalité.

Je n’ai encore utilisé aucune des bibliothèques, mais NLopt semble le plus prometteur pour moi. Ce serait génial s’il avait une interface et des algorithmes spécialisés pour l’ajustement des moindres carrés (pondéré).

BTW, votre note à propos de Matlab signifie-t-elle qu’elle a Lev-Mar avec des contraintes non linéaires?

La démarche que j’ai finalement suivie est la suivante:

  • J’ai utilisé NLopt pour l’optimisation et la fonction objective a été construite pour calculer l’erreur au carré du problème.

  • L’algorithme qui a donné les résultats les plus prometteurs était COBYLA ( optimisation locale sans dérivée). Il supporte les contraintes de boîte et les contraintes non linéaires. Les contraintes d’inégalité linéaires ont été introduites sous forme de contraintes non linéaires, ce qui devrait être généralement faisable.

Une simple parsing comparative montre qu’elle converge un peu plus lentement qu’une approche Lev-Mar, mais que la vitesse est sacrifiée en raison de la nécessité de contraintes.

MPFIT: une bibliothèque d’ajustements pour moindres carrés MINPACK-1 en C

MPFIT utilise la technique de Levenberg-Marquardt pour résoudre le problème des moindres carrés. Dans son utilisation typique, MPFIT sera utilisé pour adapter une fonction fournie par l’utilisateur (le “modèle”) aux points de données fournis par l’utilisateur (les “données”) en ajustant un jeu de parameters. MPFIT est basé sur MINPACK-1 (LMDIF.F) de More ‘et ses collaborateurs.

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

OPTIF9 peut être converti en C (à partir de Fortran) et l’a peut-être déjà été par quelqu’un.

Si ce que vous entendez par contraintes de boîte, c’est qu’il prend en charge les limites supérieure et inférieure des valeurs de paramètre, je pense qu’il existe une version qui le fait.

C’est un problème délicat, car cela signifie que chaque fois qu’un paramètre arrive à une limite, il réduit effectivement les degrés de liberté de 1. Il peut restr “bloqué sur un mur” quand vous ne le souhaitiez pas vraiment.

Nous avons constaté qu’il était préférable d’utiliser un minimiseur et des parameters de transformation sans contrainte, via quelque chose qui ressemble à une transformation log ou logit, de sorte que dans l’espace de recherche, ils ne soient pas contraints, mais qu’ils soient contraints dans l’espace du modèle.

En ce qui concerne les autres types de contraintes, je ne le sais pas, bien que l’une des options consiste, en tant que partie de votre fonction d’objective, à le rendre vraiment mauvais lorsque les contraintes sont violées, afin que l’optimiseur évite ces zones.

J’ai trouvé que lorsque j’ai un ensemble de contraintes très flexible, si je veux un bon algorithme, j’utilise Metropolis-Hastings . À moins que je ne me trompe, s’il génère un échantillon qui ne respecte pas les contraintes, vous pouvez simplement le supprimer. Cela prend plus de temps, mais c’est simple et ça marche toujours.