Как алгоритм Левенберга – Марквардта работает подробно, но понятным образом? - PullRequest
14 голосов
/ 16 июля 2009

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

Моя цель - реализовать этот алгоритм в opencl, чтобы он мог работать с аппаратным ускорением.

Ответы [ 5 ]

27 голосов
/ 30 октября 2009

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

Алгоритм LM и многие другие алгоритмы минимизации используют эту схему.

Предположим, что минимизируемая функция - это F, и мы находимся в точке x (n) в нашей итерации. Мы хотим найти следующую итерацию x (n + 1) такую, что F (x (n + 1))

Сначала вычислите линейное приближение к F в точке x (n). Легко определить направление спуска линейной функции, поэтому мы используем линейную аппроксимирующую функцию для определения направления спуска. Далее нам нужно знать, как далеко мы можем пойти в этом выбранном направлении. Если наша аппроксимирующая линейная функция является хорошим приближением для F для большой области вокруг x (n), то мы можем сделать довольно большой шаг. Если это хорошее приближение только очень близко к x (n), то мы можем сделать только очень маленький шаг.

Это то, что делает LM - вычисляет линейное приближение к F при x (n), давая тем самым направление спуска, а затем вычисляет, какой шаг нужно сделать, основываясь на том, насколько хорошо линейная функция приближается к F при x (n). ). LM выясняет, насколько хороша аппроксимирующая функция, в основном делая шаг в определенном таким образом направлении и сравнивая, насколько линейное приближение к F уменьшилось с тем, насколько уменьшилась фактическая функция F. Если они близки, аппроксимирующая функция хороша, и мы можем сделать шаг побольше. Если они не близки, то функция приближения не годится, и мы должны отступить и сделать меньший шаг.

13 голосов
/ 16 июля 2009
4 голосов
/ 01 августа 2013

Основные идеи алгоритма LM могут быть объяснены на нескольких страницах, но для быстрой и надежной реализации промышленного уровня необходимы многие тонкие оптимизации. Современное состояние - это реализация Minpack, выполненная Moré et al., Подробно описанная Moré 1978 (http://link.springer.com/content/pdf/10.1007/BFb0067700.pdf) и в руководстве пользователя Minpack (http://www.mcs.anl.gov/~more/ANL8074b.pdf). Для изучения кода, мой перевод на C ( http: apps.jcns.fz-juelich.de/lmfit), вероятно, более доступен, чем исходный код на Фортране.

3 голосов
/ 16 июля 2009

Попробуйте Числовые рецепты (Левенберг-Марквардт находится в разделе 15.5). Он доступен онлайн, и я обнаружил, что они объясняют алгоритмы подробным способом (у них есть полный исходный код, насколько подробнее вы можете получить ...), но при этом доступны.

1 голос
/ 31 октября 2009

Я использовал эти заметки из курса в Университете Пердью , чтобы закодировать общий алгоритм подбора кривой Левенберга-Марквардта в MATLAB, который вычисляет числовые производные и поэтому принимает любую функцию вида f(x;p), где p - вектор подгоночных параметров.

...