如何在 java apache 数学中使用 SimplexSolver 或 SimplexOptimizer?
How to use SimplexSolver or SimplexOptimizer in java apache math?
我正在尝试使用 apache commons 数学库版本 3.5+ 来解决优化问题。基本上,我试图将(伽玛)分布拟合到某些数据点。我似乎找不到任何简单的例子来说明如何使用新的(3.5 版)优化工具,例如 SimplexSolver、SimplexOptimizer 或 OptimizationData,来解决一个微不足道的优化问题。
以前在这里问过类似的问题,但所有答案似乎都是针对旧版本的 apache 数学的 - 在 3.5 中,我可以找到示例代码的结构和 none。
有没有人有如何使用新的优化器或求解器的工作示例?我对 SimplexOptimizer 最感兴趣,但此时任何东西都会有用。
实际上,优化器可能很难使用:很多参数,不同类型的优化器需要不同的组合,并且它们都隐藏在它们接收的通用 OptimizationData
数组中。除非你开始将代码与他们引用的论文进行匹配,否则你几乎无法从中得到任何结果。
我也想偶尔使用其中的一些solvers/optimizers,对我来说可靠、有效的“"examples"”的主要来源原来是单元测试 个 类,通常非常详尽,涵盖了很多案例。例如,关于 SimplexOptimizer
,您可能想看看 org/apache/commons/math4/optim/nonlinear/scalar/noderiv/
测试用例,其中包含测试 类 SimplexOptimizerMultiDirectionalTest.java
和 SimplexOptimizerNelderMeadTest.java
.
(抱歉,也许这不是您所期望或希望的,但是......当我试图找出 OptimizationData
这些优化器实际需要哪些时,我发现这些测试非常有用...)
EDIT
仅供参考,完整示例,摘自基本单元测试之一:
import java.util.Arrays;
import org.apache.commons.math3.analysis.MultivariateFunction;
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.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import org.apache.commons.math3.util.FastMath;
public class SimplexOptimizerExample
{
public static void main(String[] args)
{
SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-30);
final FourExtrema fourExtrema = new FourExtrema();
final PointValuePair optimum =
optimizer.optimize(
new MaxEval(100),
new ObjectiveFunction(fourExtrema),
GoalType.MINIMIZE,
new InitialGuess(new double[]{ -3, 0 }),
new NelderMeadSimplex(new double[]{ 0.2, 0.2 }));
System.out.println(Arrays.toString(optimum.getPoint()) + " : "
+ optimum.getSecond());
}
private static class FourExtrema implements MultivariateFunction
{
// The following function has 4 local extrema.
final double xM = -3.841947088256863675365;
final double yM = -1.391745200270734924416;
final double xP = 0.2286682237349059125691;
final double yP = -yM;
final double valueXmYm = 0.2373295333134216789769; // Local maximum.
final double valueXmYp = -valueXmYm; // Local minimum.
final double valueXpYm = -0.7290400707055187115322; // Global minimum.
final double valueXpYp = -valueXpYm; // Global maximum.
public double value(double[] variables)
{
final double x = variables[0];
final double y = variables[1];
return (x == 0 || y == 0) ? 0 : FastMath.atan(x)
* FastMath.atan(x + 2) * FastMath.atan(y) * FastMath.atan(y)
/ (x * y);
}
}
}
我正在尝试使用 apache commons 数学库版本 3.5+ 来解决优化问题。基本上,我试图将(伽玛)分布拟合到某些数据点。我似乎找不到任何简单的例子来说明如何使用新的(3.5 版)优化工具,例如 SimplexSolver、SimplexOptimizer 或 OptimizationData,来解决一个微不足道的优化问题。
以前在这里问过类似的问题,但所有答案似乎都是针对旧版本的 apache 数学的 - 在 3.5 中,我可以找到示例代码的结构和 none。
有没有人有如何使用新的优化器或求解器的工作示例?我对 SimplexOptimizer 最感兴趣,但此时任何东西都会有用。
实际上,优化器可能很难使用:很多参数,不同类型的优化器需要不同的组合,并且它们都隐藏在它们接收的通用 OptimizationData
数组中。除非你开始将代码与他们引用的论文进行匹配,否则你几乎无法从中得到任何结果。
我也想偶尔使用其中的一些solvers/optimizers,对我来说可靠、有效的“"examples"”的主要来源原来是单元测试 个 类,通常非常详尽,涵盖了很多案例。例如,关于 SimplexOptimizer
,您可能想看看 org/apache/commons/math4/optim/nonlinear/scalar/noderiv/
测试用例,其中包含测试 类 SimplexOptimizerMultiDirectionalTest.java
和 SimplexOptimizerNelderMeadTest.java
.
(抱歉,也许这不是您所期望或希望的,但是......当我试图找出 OptimizationData
这些优化器实际需要哪些时,我发现这些测试非常有用...)
EDIT
仅供参考,完整示例,摘自基本单元测试之一:
import java.util.Arrays;
import org.apache.commons.math3.analysis.MultivariateFunction;
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.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import org.apache.commons.math3.util.FastMath;
public class SimplexOptimizerExample
{
public static void main(String[] args)
{
SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-30);
final FourExtrema fourExtrema = new FourExtrema();
final PointValuePair optimum =
optimizer.optimize(
new MaxEval(100),
new ObjectiveFunction(fourExtrema),
GoalType.MINIMIZE,
new InitialGuess(new double[]{ -3, 0 }),
new NelderMeadSimplex(new double[]{ 0.2, 0.2 }));
System.out.println(Arrays.toString(optimum.getPoint()) + " : "
+ optimum.getSecond());
}
private static class FourExtrema implements MultivariateFunction
{
// The following function has 4 local extrema.
final double xM = -3.841947088256863675365;
final double yM = -1.391745200270734924416;
final double xP = 0.2286682237349059125691;
final double yP = -yM;
final double valueXmYm = 0.2373295333134216789769; // Local maximum.
final double valueXmYp = -valueXmYm; // Local minimum.
final double valueXpYm = -0.7290400707055187115322; // Global minimum.
final double valueXpYp = -valueXpYm; // Global maximum.
public double value(double[] variables)
{
final double x = variables[0];
final double y = variables[1];
return (x == 0 || y == 0) ? 0 : FastMath.atan(x)
* FastMath.atan(x + 2) * FastMath.atan(y) * FastMath.atan(y)
/ (x * y);
}
}
}