Hi, I have been struggling for several days to figure out how to use NonLinearConjugateGradientOptimizer. My goal is to optimize a multivariate unconstrained function (for example f(x,y,z) = x^2 + y^2 + z^2) with conjugate gradient method. I have already managed to optimize my function with SimplexOptimizer and want to try Gradient Descent now.
For now, my code is (inspired by all the examples I could found): import java.util.Arrays; import org.apache.commons.math3.analysis.MultivariateFunction; import org.apache.commons.math3.analysis.MultivariateVectorFunction; import org.apache.commons.math3.analysis.differentiation.DerivativeStructure; import org.apache.commons.math3.analysis.differentiation.GradientFunction; import org.apache.commons.math3.analysis.differentiation.MultivariateDifferentiableFunction; import org.apache.commons.math3.optim.InitialGuess; import org.apache.commons.math3.optim.MaxEval; import org.apache.commons.math3.optim.PointValuePair; import org.apache.commons.math3.optim.SimpleValueChecker; import org.apache.commons.math3.optim.nonlinear.scalar.GoalType; import org.apache.commons.math3.optim.nonlinear.scalar.GradientMultivariateOptimizer; import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction; import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunctionGradient; import org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer; import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex; import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer; public class ApacheTest { public static void main(String[] args) { SimplexOptimizer simplexOptimizer = new SimplexOptimizer(1e-10, 1e-30); NonLinearConjugateGradientOptimizer gradientOptimizer = new NonLinearConjugateGradientOptimizer(NonLinearConjugateGradientOptimizer.Formula.POLAK_RIBIERE, new SimpleValueChecker(1e-13, 1e-13)); final MyFunction f = new MyFunction(); simplexOptimizerMethod(simplexOptimizer, f); conjugateGradientMethod(gradientOptimizer, f); } private static void conjugateGradientMethod(NonLinearConjugateGradientOptimizer optimizer, MyFunction f) { ObjectiveFunction objF = new ObjectiveFunction(f); final PointValuePair optimum = optimizer.optimize(new MaxEval(1000), objF, GoalType.MINIMIZE, new InitialGuess(new double[]{ 10, 10, 10 })); System.out.println(Arrays.toString(optimum.getPoint()) + " : " + optimum.getSecond()); } private static void simplexOptimizerMethod(SimplexOptimizer optimizer, final MyFunction f) { final PointValuePair optimum = optimizer.optimize( new MaxEval(10000), new ObjectiveFunction(f), GoalType.MINIMIZE, new InitialGuess(new double[]{ 100, 100, 60 }), new NelderMeadSimplex(new double[]{ 0.2, 0.2, 0.2 })); System.out.println(Arrays.toString(optimum.getPoint()) + " : " + optimum.getSecond()); } private static class MyFunction implements MultivariateFunction { public double value(double[] variables) { final double x = variables[0]; final double y = variables[1]; final double z = variables[2]; return x*x + y*y + z*z; } } } When I execute the code I get the following error: Exception in thread "main" java.lang.NullPointerException at org.apache.commons.math3.optim.nonlinear.scalar.GradientMultivariateOptimizer.computeObjectiveGradient(GradientMultivariateOptimizer.java:53) at org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer.doOptimize(NonLinearConjugateGradientOptimizer.java:254) at org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer.doOptimize(NonLinearConjugateGradientOptimizer.java:46) at org.apache.commons.math3.optim.BaseOptimizer.optimize(BaseOptimizer.java:153) at org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:65) at org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer.optimize(MultivariateOptimizer.java:63) at org.apache.commons.math3.optim.nonlinear.scalar.GradientMultivariateOptimizer.optimize(GradientMultivariateOptimizer.java:73) at org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer.optimize(NonLinearConjugateGradientOptimizer.java:244) at com.sri.ai.expresso.apache.ApacheTest.conjugateGradientMethod(ApacheTest.java:96) at com.sri.ai.expresso.apache.ApacheTest.main(ApacheTest.java:87) I think that maybe the problem is a missing argument of type ObjectiveFunctionGradient in the optimize method: final PointValuePair optimum = optimizer.optimize(new MaxEval(1000), objF, GoalType.MINIMIZE, new InitialGuess(new double[]{ 10, 10, 10 })); However, I don't know how to build it. Does anyone has an idea, or an example which looks like what I am looking for? Thank you very much -- Sent from: http://apache-commons.680414.n4.nabble.com/Commons-User-f735979.html --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@commons.apache.org For additional commands, e-mail: user-h...@commons.apache.org