【问题标题】:Apache Commons Math: restricting optimization domainApache Commons Math:限制优化域
【发布时间】:2014-05-01 18:37:06
【问题描述】:

我想将二次函数 y = a + bx + cx^2 拟合到某些数据中,以使 c 在最终结果中始终大于或等于 0。也就是说,我想将 c 上的搜索域限制在特定范围内([0,Double.MAX_VALUE])。目前,我有以下代码sn-p:

final CurveFitter<Parametric> fitter = new CurveFitter<Parametric>(new LevenbergMarquardtOptimizer());

fitter.addObservedPoint(0, 0);
fitter.addObservedPoint(1, -1);
fitter.addObservedPoint(-1, -1);
fitter.addObservedPoint(2, -4);
fitter.addObservedPoint(-2, -4);

final double[] init = { 1, 2, 3 };
final double[] best = fitter.fit(new PositivePolynomialFunctionParametric(), init);
final PolynomialFunction fitted = new PolynomialFunction(best); 
System.out.println(Arrays.toString(fitted.getCoefficients()));

在哪里:

private static class PositivePolynomialFunctionParametric extends PolynomialFunction.Parametric {
    @Override
    public double value(double x, double... parameters) {
        parameters[parameters.length - 1] = Math.abs(parameters[parameters.length - 1]);
        return super.value(x, parameters);
    }

    @Override
    public double[] gradient(double x, double... parameters) {
        parameters[parameters.length - 1] = Math.abs(parameters[parameters.length - 1]);
        return super.gradient(x, parameters);
    }
}

输出有意义:

[-1.4286835350284688, -8.489786562989103E-17, 1.0300498244514197E-11]

这似乎在这个特定的应用程序中有效,但对于限制搜索域的一般情况来说,它并不是一个非常优雅的解决方案。有一个更好的方法吗?

【问题讨论】:

    标签: java math apache-commons mathematical-optimization


    【解决方案1】:

    您应该使用实现/扩展 *BoundsOptimizer 类型或在其 OptimizationData 中支持 SimpleBounds 的优化器之一。 the user guide on optimization 的第 12.4 节还提到了一种调整正在优化的函数的方法,但建议改用其中一种边界支持算法。

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 2013-02-24
      • 2013-06-01
      • 1970-01-01
      • 2014-08-06
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多