Нелинейная библиотека оптимизации наименьших квадратов для C

Я ищу библиотеку на C, которая будет оптимизировать целевую функцию (предпочтительнее алгоритм Левенберга-Марквардта) и будет поддерживать ограничения ящиков, ограничения линейного неравенства и ограничения нелинейного неравенства.

Я уже пробовал несколько библиотек, но ни один из них не использует необходимые типы ограничений для моего приложения:

  • GNU GSL (не поддерживает ограничений вообще)
  • cMPFIT (поддерживается только ограничение по ящикам)
  • levmar (вообще не поддерживает нелинейные ограничения)

В настоящее время я изучаю NLopt, но я не уверен, могу ли я достичь подхода наименьших квадратов с любым из поставленных алгоритмы.

Мне трудно поверить, что нет ни одной библиотеки, поддерживающей полный диапазон ограничений в этой проблеме, поэтому я предполагаю, что я ошибся где-то во время поиска.

Недавно я обнаружил, что я могу вызывать функции Matlab из C. Хотя это довольно легко решает проблему, я не хочу, чтобы мне приходилось вызывать функции Matlab из C. Это не быстро в моем опыте.

Любая помощь будет принята с благодарностью.

Ответ 1

Подход, который я наконец последовал, следующий:

  • Я использовал NLopt для оптимизации, а целевая функция была построена для вычисления квадратичной ошибки проблемы.

  • Алгоритм, который показал наиболее перспективные результаты, был COBYLA (локальная бездефектная оптимизация). Он поддерживает ограничения ящиков и нелинейные ограничения. Ограничения линейной несправедливости были введены как нелинейные ограничения, что должно быть в целом выполнимо.

Простой бенчмаркинг показывает, что он сходится немного медленнее, чем подход Лев-Мар, но скорость приносится в жертву из-за необходимости ограничений.

Ответ 2

Некоторое время назад я изучал состояние библиотек подмножества наименьших квадратов C/С++. Я отметил несколько ссылок, в том числе те, которые вы дали, а также:

  • ALGLIB/оптимизация - Лев-Мар с граничными ограничениями.

  • WNLIB/wnnlp - ограниченный пакет нелинейной оптимизации в C (общая оптимизация, а не наименьшие квадраты). Ограничения обрабатываются добавлением функции штрафа.

Я еще не использовал ни одну из библиотек, но NLopt кажется мне наиболее перспективным. Было бы здорово, если бы он имел специализированный интерфейс и алгоритмы для (взвешенных) финалистов наименьших квадратов.

Кстати, ваша заметка о Matlab означает, что у него есть Lev-Mar с нелинейными ограничениями?

Ответ 3

MPFIT: библиотека для установки наименьших квадратов MINPACK-1 в C

MPFIT использует метод Левенберга-Марквардта для решения проблемы наименьших квадратов. При его типичном использовании MPFIT будет использоваться для установки предоставляемой пользователем функции ( "модели" ) в предоставленные пользователем точки данных ( "данные" ) путем настройки набора параметров. MPFIT основан на MINPACK-1 (LMDIF.F) от More 'и соавторов.

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

Ответ 4

OPTIF9 можно преобразовать в C (из Fortran) и, возможно, уже кем-то.

Если то, что вы подразумеваете под ограничениями окна, заключается в том, что оно поддерживает верхние и нижние пределы значений параметров, я считаю, что есть версия, которая делает это.

Это сложная проблема, поскольку она означает, что всякий раз, когда параметр попадает на границу, он эффективно уменьшает степень свободы на 1. Он может "застрять на стене", когда вы этого не хотели.

Мы обнаружили, что лучше использовать неограниченный минимизатор и параметры преобразования с помощью чего-то вроде преобразования log или logit, так что в пространстве поиска они не ограничены, но в пространстве модели они ограничены.

Что касается других типов ограничений, я не знаю, хотя один из вариантов, как часть вашей целевой функции, делает его очень плохим, когда ограничения нарушаются, поэтому оптимизатор избегает этих областей.

Я нашел, когда у меня есть действительно гибкий набор ограничений, если я хочу хороший безотказный алгоритм, я использую Metropolis-Hastings. Если я ошибаюсь, если он генерирует образец, который нарушает ограничения, вы можете просто отказаться от образца. Это занимает больше времени, но это просто и всегда работает.