Bozo is a Clojure wrapper for the L-BFGS optimization algorithm.
Limited-memory BFGS (L-BFGS or LM-BFGS) is an optimization algorithm in the family of quasi-Newton methods that approximates the Broyden- Fletcher-Goldfarb-Shanno (BFGS) algorithm using a limited amount of computer memory. It is a popular algorithm for parameter estimation in machine learning. -- Wikipedia Limited-memory BFGS
Add the following to your :dependencies in project.clj:
[bozo/bozo "0.1.1"]
Then, you can call the optimizer as follows:
(lbfgs f x0)
Assuming f is the function to minimize, starting with an initial estimate x0.
f should take a parameter x (double array) as argument, and return a pair including:
- the value of f at
x(double value) - the value of the derivative of f wrt each component of x at
x(double array of same size asx)
There are several optional parameters:
:maxitthe maximum number of iterations (default 200).:mthe number of corrections used in the BFGS update (default 5).- values of
mless than 3 are not recommended; - large values of
mwill result in excessive computing time. 3 <= m <= 7is recommended. Restriction:m > 0.
- values of
:epsaccuracy with which the solution is to be found (default 1.0e-5).:xtolestimate of the machine precision (default 1.0e-16).:iprintpair[i1 i2]to specify the output generated bylbfgs(default [-1 0]).i1specifies the frequency of the output:i1 < 0: no output is generated,i1 = 0: output only at first and last iteration,i1 > 0: output everyi1iterations.
i2specifies the type of output generated:i2 = 0: iteration count, number of function evaluations, function value, norm of the gradient, and steplength,i2 = 1: same asi2 = 0, plus vector of variables and gradient vector at the initial point,i2 = 2: same asi2 = 1, plus vector of variables,i2 = 3: same asi2 = 2, plus gradient vector.
Override the defaults like this:
(lbfgs f x0 {:m 3})
The original LBFGS also has other options, such as allowing to specify ones own Hk0 (Hessian diagonal elements), but they are not (yet) exposed in bozo.
If you want to learn more about the algorithm, you could check the Java source code, which contains a lot of comments (including original comments from the Fortran code).
Recommended reading:
D. C. Liu and J. Nocedal, ''On the limited memory BFGS method for large scale optimization methods'' Mathematical Programming 45 (1989), pp. 503-528. (Postscript file of this paper is available via anonymous ftp to eecs.nwu.edu in the directory pub/lbfgs/lbfgs_um.)
Let "Bozo" Find a Good Solution to your optimization problem...
Authors:
- Jorge Nocedal: original Fortran version (including comments), July 1990.
- Robert Dodier: Java translation, August 1997.
- Antoine Choppin: Clojure wrapper, May 2014.
Licensed under the Apache License, Version 2.0