Главная       Коммерческая поддержка       FAQ       Forum       Контакты       Английская версия

Метод Левенберга-Марквардта

Метод Левенберга-Марквардта – хороший выбор, если вам требуется минимизировать функцию вида F=f 2(x,...,x)+ ... +f 2(x,...,x). Алгоритм удачно сочетает в себе метод наискорейшего спуска (т.е. минимизации вдоль градиента) и метод Ньютона (т.е. использование квадратичной модели для ускорения поиска минимума функции). От метода наискорейшего спуска алгоритм позаимствовал стабильность работы, от метода Ньютона – ускоренную сходимость в окрестностях минимума. Ниже приведено обсуждение стандартной реализации алгоритма Левенберга-Марквардта, её недостатков, и улучшенной версии алгоритма, входящей в пакет ALGLIB. Перед чтением этого раздела рекомендуется ознакомиться с описанием алгоритма в Википедии или в Numerical Recipes. Далее мы предполагаем, что читающий понимает общие принципы работы алгоритма Левенберга-Марквардта.

Реализация метода Левенберга-Марквардта в ALGLIB

Традиционный вариант алгоритма Левенберга-Марквардта предполагает использование матрицы Якоби для построения квадратичной модели, осуществление одного шага в соответствии с моделью, затем – построение новой модели. У такого подхода есть ряд недостатков – общая неэффективность алгоритма, высокие требования к машинным ресурсам, ухудшение сходимости к минимуму на определенном классе задач. Рассмотрим их подробнее:

С учетом вышеизложенных замечаний в пакете ALGLIB реализован улучшенный вариант алгоритма.Новый алгоритм может использовать более полную информацию о задаче: значения функций f, матрицу Якоби, градиент функции F, гессиан функции F. В зависимости от того, какая информация доступна, алгоритм может использоваться в следующих вариантах:

Использование алгоритма и обратная коммуникация

Алгоритм оптимизации в ходе своей работы должен получать значения функции/градиента/... в выбранных им точках. В большинстве программных пакетов эта проблема решается путем передачи указателя на функцию (C++, Delphi) или делегата (C#), который осуществляет эту операцию.

Пакет ALGLIB, в отличие от других библиотек, использует для решения этой задачи обратную коммуникацию. Когда требуется вычислить значение функции (или её производных), состояние алгоритма сохраняется в специальной структуре, после чего управление возвращается в вызвавшую программу, которая осуществляет все вычисления и снова вызывает вычислительную подпрограмму.

Таким образом, работа с алгоритмом оптимизации осуществляется в следующей последовательности:

  1. Подготовка структуры данных LMState при помощи одной из подпрограмм инициализации алгоритма (MinLMFJ, MinLMFGJ, MinLMFGH).
  2. Установка дополнительных параметров алгоритма оптимизации при помощи подпрограмм MinLMSetXXXXX.
  3. Вызов подпрограммы MinLMIteration.
  4. Если подпрограмма вернула False, работа алгоритма завершена и минимум найден (сам минимум может быть получен при помощи подпрограммы MinLMResults).
  5. Если подпрограмма вернула True, подпрограмма требует информацию о функции. В зависимости от того, какие поля структуры LMState установлены в True (ниже этот вопрос рассмотрен более подробно), вычислите функцию/градиент/якобиан/гессиан.
  6. После того, как вся требуемая информация загружена в структуру LMState, требуется повторно вызвать подпрограмму MinLMIteration.

Для обмена информацией с пользователем используются следующие поля структуры LMState:

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

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

         NeedF   NeedFG  NeedFiJ NeedFGH XUpdated
MinLMFJ     X               X               X
MinLMFGJ    X       X       X               X
MinLMFGH    X       X               X       X

Manual entries

C++ minlm.h   
C# minlm.cs   
MPFR minlm.h   
Delphi minlm.pas   
FreePascal minlm.pas   
VBA minlm.bas   

This article is intended for personal use only.

Скачать ALGLIB

C#

Исходный код на C#

Downloads page

 

C++

Исходный код на C++

Downloads page

 

C++, арифметика высокой точности

Исходный код на C++, использующий библиотеки MPFR/GMP.

Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.

Downloads page

 

FreePascal

Исходный код на Free Pascal.

Downloads page

 

Delphi

Исходный код на Delphi.

Downloads page

 

Visual Basic

Исходный код на VBA.

Downloads page

 

 

ALGLIB project, 1999-2010