You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by spx15 <sa...@hotmail.fr> on 2018/05/08 18:44:17 UTC
How to use NonLinearConjugateGradientOptimizer
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-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org
Re: How to use NonLinearConjugateGradientOptimizer
Posted by Gilles <gi...@harfang.homelinux.org>.
On Tue, 8 May 2018 11:44:17 -0700 (MST), spx15 wrote:
> 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
>
See "parseOptimizationData" method here:
http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizer.html
It is called by "optimize" and the list of arguments to the latter must
contain one argument of type "ObjectiveFunctionGradient".
The unit tests classes show examples:
https://git1-us-west.apache.org/repos/asf?p=commons-math.git;a=blob;f=src/test/java/org/apache/commons/math4/optim/nonlinear/scalar/gradient/NonLinearConjugateGradientOptimizerTest.java;h=df10e649cdf6d10f0f9b1c89a3a433aa23aedcd9;hb=HEAD
HTH,
Gilles
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org