Ich versuche, ein Optimierungsverfahren in Python mit BFGS und L-BFGS in Python zu implementieren, und erhalte in beiden Fällen überraschend unterschiedliche Ergebnisse. L-BFGS konvergiert superschnell zum richtigen Minimum, während BFGS sehr langsam konvergiert, und das auch zu einem unsinnigen Minimum.
FRAGE: Aus meinen Messwerten geht hervor, dass BFGS und L-BFGS im Grunde genommen der Algorithmus sind (Quasi-Newton-Methoden), außer dass letzterer weniger Speicher benötigt und daher schneller ist. Ist das wahr? Ansonsten, wenn sie unterschiedlicher sind, wie dann?
Letztendlich möchte ich herausfinden, ob der Leistungsunterschied auf einige Unterschiede in den tatsächlichen Algorithmen oder auf deren Implementierung in den Python-SciPy-Modulen zurückzuführen ist.
BEARBEITEN: Ich füge einige Daten hinzu, um meine Behauptungen zu unterstützen, dass sich das Verhalten von den beiden Algorithmen unterscheidet.
RUNNING THE L-BFGS-B CODE
* * *
Machine precision = 2.220D-16
N = 147 M = 10
This problem is unconstrained.
At X0 0 variables are exactly at the bounds
At iterate 0 f= 2.56421D+04 |proj g|= 1.19078D+03
At iterate 1 f= 2.12904D+04 |proj g|= 1.04402D+03
At iterate 2 f= 1.49651D+03 |proj g|= 2.13394D+02
At iterate 3 f= 6.08288D+02 |proj g|= 9.85720D+01
At iterate 4 f= 2.91810D+02 |proj g|= 6.23062D+01
...
At iterate 142 f= 3.27609D+00 |proj g|= 8.80170D-04
Time taken for minimisation: 36.3749790192
*** BFGS code ***
At iterate 1, f= 21249.561722
At iterate 2, f= 15710.435098
At iterate 3, f= 15443.836262
At iterate 4, f= 15386.035398
At iterate 5, f= 15311.242917
At iterate 6, f= 15211.986938
At iterate 7, f= 15022.632266
...
At iterate 524, f= 67.898495
...
Warning: Desired error not necessarily achieved due to precision loss.
Iterations: 1239
Time taken: 340.728140116