This is a direct Java port of liblbfgs, a library of Limited-memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS).
The L-BFGS optimization method is used to solve unconstrained minimization problem:
minimize f(x), where x = (x1, x2, ... xn)
f(x) and its gradient are computable.
This library also includes the implementation of the Orthant-Wise Limited-memory Quasi-Newton (OWL-QN) method which is used to minimize the function f(x) + C|x|, where C is a positive number.
Maven dependency
<dependency>
<groupId>com.github.vinhkhuc</groupId>
<artifactId>lbfgs4j</artifactId>
<version>0.2.1</version>
</dependency>
Usage example
Find the minimum value of the function f(x) = (x-5)^2 + 1.
import com.github.lbfgs4j.liblbfgs.Function;
import com.github.lbfgs4j.LbfgsMinimizer;
...
Function f = new Function() {
public int getDimension() {
return 1;
}
public double valueAt(double[] x) {
return Math.pow(x[0]-5, 2) + 1;
}
public double[] gradientAt(double[] x) {
return new double[] { 2*(x[0]-5) };
}
};
LbfgsMinimizer minimizer = new LbfgsMinimizer();
double[] x = minimizer.minimize(f); // x should be [5]
double min = f.valueAt(x); // min should be 1
The OWL-QN method will be used when initializing the minimizer with, for example, new LbfgsMinimizer(1.0)
, here 1.0 is the coefficient for |x|.
Other parameters such as memory size, maximum number of iterations, etc. can be set using the class LBFGS_Param
.
License
lbfgs4j is released under the MIT License (see the LICENSE file for details).
References
This library is used in several projects:
- Moment-Based Quantile Sketches for Efficient High Cardinality Aggregation Queries. Edward Gan, Jialin Ding, Kai Sheng Tai, Vatsal Sharan, Peter Bailis. VLDB 2018. (paper)
- Humio, Log Management at Scale. (acknowledgement)