Wie funktioniert der Levenberg-Marquardt-Algorithmus im Detail, aber auf verständliche Weise?

Lesezeit: 5 Minuten

Ich bin ein Programmierer, der lernen möchte, wie der Levenberg-Marquardt-Kurvenanpassungsalgorithmus funktioniert, damit ich ihn selbst implementieren kann. Gibt es irgendwo ein gutes Tutorial, das erklären kann, wie es im Detail funktioniert, wenn der Leser ein Programmierer und kein Mathematiker ist?

Mein Ziel ist es, diesen Algorithmus in OpenCL zu implementieren, damit er hardwarebeschleunigt ausgeführt werden kann.

  • Ist es Ihnen gelungen, diesen Algorithmus in OpenCL zu implementieren? Ich hätte auch großes Interesse.

    – Dan

    16. Februar 2011 um 12:50 Uhr

  • Ich bin gerade damit fertig, in hoffentlich verständlicher Weise darüber zu schreiben. Der Link unten enthält die gesamte evolutionäre Reihe von 5 Optimierungsalgorithmen, die in LAM enden. Um es verständlicher zu machen, habe ich einige Analogien aus dem Skisport verwendet. stackoverflow.com/a/22394465/457687

    – Vlad

    14. März 2014 um 5:39


Das Minimieren einer Funktion ähnelt dem Versuch, den tiefsten Punkt einer Oberfläche zu finden. Stellen Sie sich vor, Sie gehen auf einer hügeligen Fläche und versuchen, den tiefsten Punkt zu erreichen. Sie würden die Richtung finden, in der es bergab geht, und gehen, bis es nicht mehr bergab geht. Dann würden Sie eine neue Richtung wählen, die bergab geht, und in diese Richtung gehen, bis es nicht mehr bergab geht, und so weiter. Irgendwann (hoffentlich) würde man einen Punkt erreichen, an dem es keine Richtung mehr bergab gibt. Sie wären dann bei einem (lokalen) Minimum.

Der LM-Algorithmus und viele andere Minimierungsalgorithmen verwenden dieses Schema.

Angenommen, die zu minimierende Funktion ist F und wir befinden uns in unserer Iteration am Punkt x(n). Wir möchten die nächste Iteration x(n+1) finden, so dass F(x(n+1)) < F(x(n)) ist, dh der Funktionswert kleiner ist. Um x(n+1) auszuwählen, benötigen wir zwei Dinge, eine Richtung von x(n) und eine Schrittgröße (wie weit wir in diese Richtung gehen). Der LM-Algorithmus ermittelt diese Werte wie folgt:

Berechnen Sie zunächst eine lineare Näherung an F am Punkt x(n). Es ist einfach, die Abwärtsrichtung einer linearen Funktion herauszufinden, daher verwenden wir die lineare Näherungsfunktion, um die Abwärtsrichtung zu bestimmen. Als nächstes müssen wir wissen, wie weit wir in dieser gewählten Richtung gehen können. Wenn unsere approximierende lineare Funktion eine gute Näherung für F für einen großen Bereich um x(n) ist, können wir einen ziemlich großen Schritt machen. Wenn es eine gute Näherung ist, die nur sehr nahe an x(n) liegt, können wir nur einen sehr kleinen Schritt machen.

Dies ist, was LM tut: Es berechnet eine lineare Annäherung an F bei x(n) und gibt so die Abwärtsrichtung an. Anschließend ermittelt es, wie groß der Schritt sein muss, basierend darauf, wie gut die lineare Funktion F bei x(n) annähert. LM ermittelt, wie gut die Näherungsfunktion ist, indem es grundsätzlich einen Schritt in die so bestimmte Richtung macht und vergleicht, um wie viel die lineare Annäherung an F abgenommen hat, um wie viel die tatsächliche Funktion F abgenommen hat. Wenn sie nahe beieinander liegen, ist die Näherungsfunktion gut und wir können einen etwas größeren Schritt machen. Wenn sie nicht nahe beieinander liegen, ist die Näherungsfunktion nicht gut und wir sollten einen Schritt zurücktreten und einen kleineren Schritt machen.

  • Gibt es eine Möglichkeit, den Levenberg-Marquardt-Algorithmus mit dem stochastischen Gradientenabstieg zu kombinieren?

    – mertyildiran

    17. April 2017 um 4:47

  • Ja, der Wiki-Artikel ist gut und enthält Links zum Kapitel „Numerische Rezepte in C“. fizyka.umk.pl/nrbook/c15-5.pdf Um etwas Praktisches aus einer parallelen Version des Algorithmus herauszuholen, könnten Sie versuchen, mehrere parallele Läufe davon mit abgewickelten Schleifen durchzuführen, wobei Sie für jede parallele Berechnung einen eindeutigen zufälligen Startpunkt verwenden. Nehmen Sie dann am Ende das Minimum aller Ihrer Antworten.

    – Chad Brewbaker

    1. Juli 2010 um 16:37

Benutzeravatar von Joachim W
Joachim W

Die Grundideen des LM-Algorithmus lassen sich auf wenigen Seiten erklären – für eine schnelle und robuste Implementierung in Produktionsqualität sind jedoch viele subtile Optimierungen erforderlich. Stand der Technik ist nach wie vor die Minpack-Implementierung von Moré et al., ausführlich dokumentiert von Moré 1978 (http://link.springer.com/content/pdf/10.1007/BFb0067700.pdf) und im Minpack-Benutzerhandbuch (http://www.mcs.anl.gov/~more/ANL8074b.pdf). Um den Code zu studieren, meine C-Übersetzung (https://jugit.fz-juelich.de/mlz/lmfit) ist wahrscheinlich zugänglicher als der ursprüngliche Fortran-Code.

  • Das ist ein cooles C-Programm, das du gemacht hast! Ich brauchte auch so etwas (in meinem Fall LM in C++) und der Dokumentation zufolge sieht Ihre Version vielversprechend aus 🙂

    – tomsmeding

    2. August 2013 um 6:44

  • Danke schön! Da es sich bei lmfit um eine separat kompilierte C-Bibliothek handelt, funktioniert es sofort mit C++.

    – Joachim W

    2. August 2013 um 9:55

Benutzeravatar von Martin B
Martin B

Versuchen Numerische Rezepte (Levenberg-Marquardt steht in Abschnitt 15.5). Es ist online verfügbar und ich finde, dass sie Algorithmen detailliert erklären (sie haben den vollständigen Quellcode, wie viel detaillierter kann man noch sein …), aber dennoch zugänglich sind.

ich benutzte diese Notizen aus einem Kurs an der Purdue University einen generischen Levenberg-Marquardt-Kurvenanpassungsalgorithmus in MATLAB zu programmieren, der numerische Ableitungen berechnet und daher jede Funktion der Form akzeptiert f(x;p) Wo p ist ein Vektor von Anpassungsparametern.

1453090cookie-checkWie funktioniert der Levenberg-Marquardt-Algorithmus im Detail, aber auf verständliche Weise?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy