scipy.optimize.fmin_l_bfgs_b gibt 'ABNORMAL_TERMINATION_IN_LNSRCH' zurück

7

Ich benutze scipy.optimize.fmin_l_bfgs_b, um ein Gaußsches Mischungsproblem zu lösen. Die Mittel der Gemischverteilungen werden durch Regressionen modelliert, deren Gewichte mit Hilfe des EM-Algorithmus optimiert werden müssen.

%Vor%

Aber manchmal habe ich eine Warnung 'ABNORMAL_TERMINATION_IN_LNSRCH' im Informationswörterbuch erhalten:

%Vor%

Ich bekomme diese Warnung nicht jedes Mal, aber manchmal. (Die meisten erhalten 'KONVERGENZ: NORM_OF_PROJECTED_GRADIENT_ & lt; = _ PGTOL' oder 'KONVERGENZ: REL_REDUCTION_OF_F_ & lt; = _ FACTR * EPSMCH').

Ich weiß, dass es bedeutet, dass das Minimum in dieser Iteration erreicht werden kann. Ich habe dieses Problem gegooglet. Jemand sagte, dass es häufig vorkommt, weil die Ziel- und Gradientenfunktionen nicht übereinstimmen. Aber hier stelle ich keine Gradientenfunktion zur Verfügung, weil ich 'approx_grad' verwende.

Was sind die möglichen Gründe, die ich untersuchen sollte? Was bedeutet es mit "Rundungsfehler dominieren Berechnung"?

======

Ich finde auch, dass die Log-Likelihood nicht monoton zunimmt:

%Vor%

Es beginnt in der Regel bei der zweiten oder dritten Iteration zu sinken, selbst wenn 'ABNORMAL_TERMINATION_IN_LNSRCH' nicht auftritt. Ich weiß nicht, ob dieses Problem mit dem vorherigen zusammenhängt.

    
Munichong 07.01.2016, 19:27
quelle

1 Antwort

31

Scipy ruft die ursprüngliche L-BFGS-B-Implementierung auf. Das ist etwas Fortran77 (alt, aber wunderschön und superschneller Code) und unser Problem ist, dass die Abstiegsrichtung tatsächlich steigt. Das Problem beginnt in Zeile 2533 (Link zum Code unten)

%Vor% Mit anderen Worten, Sie sagen ihm, dass er den Hügel hinuntergehen soll, indem er den Hügel hinaufgeht. Der Code versucht insgesamt 20 Mal in der von Ihnen angegebenen Abstiegsrichtung eine so genannte Liniensuche und stellt fest, dass Sie ihm NICHT sagen, dass er bergab fahren soll, sondern bergauf. Alle 20 mal.

Der Typ, der es geschrieben hat (Jorge Nocedal, der übrigens ein sehr schlauer Typ ist), hat 20 da gemacht, weil das ziemlich reicht. Maschine Epsilon ist 10E-16, ich denke, 20 ist eigentlich ein bisschen zu viel. Also, mein Geld für die meisten Leute mit diesem Problem ist, dass Ihr Farbverlauf nicht zu Ihrer Funktion passt.

Nun könnte es auch sein, dass "2. Rundungsfehler die Berechnung dominieren". Damit meint er, dass Ihre Funktion eine sehr flache Oberfläche ist, in der Zunahmen in der Größenordnung von Maschinen-Epsilon liegen (in diesem Fall könnten Sie vielleicht die Funktion neu skalieren), Nun, ich habe mir gedacht, dass es vielleicht eine dritte Option geben sollte, wenn deine Funktion zu komisch ist. Schwingungen? Ich könnte etwas wie $ \ sin ({\ frac {1} {x}}) $ sehen, das diese Art von Problem verursacht. Aber ich bin kein kluger Typ, also gehe nicht davon aus, dass es einen dritten Fall gibt.

Ich denke also, die Lösung des OP sollte sein, dass Ihre Funktion zu flach ist. Oder sieh dir den Fortran-Code an.

Ссылка

Hier ist die Zeilensuche für diejenigen, die es sehen wollen. Ссылка

Hinweis. Das ist 7 Monate zu spät. Ich lege es hier für die Zukunft.

    
Wilmer E. Henao 25.08.2016, 22:56
quelle