最小二乘Levenburg Marquardt与Apache公共

时间:2016-02-24 10:04:01

标签: java apache-commons least-squares

我在java中使用非线性最小二乘Levenburg Marquardt算法来拟合多条指数曲线(A + Bexp(Cx))。尽管数据非常干净并且与模型具有良好的近似,但即使迭代次数过多(5000-6000),算法也无法对其中的大多数进行建模。对于它可以建模的曲线,它在大约150次迭代中这样做。

LeastSquaresProblem problem = new LeastSquaresBuilder()
        .start(start).model(jac).target(dTarget)
        .lazyEvaluation(false).maxEvaluations(5000)
        .maxIterations(6000).build();

LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
LeastSquaresOptimizer.Optimum optimum = optimizer.optimize(problem);}

我的问题是如何在apache commons中定义收敛标准,以阻止它达到最大迭代次数?

1 个答案:

答案 0 :(得分:0)

我不相信Java是你的问题。让我们来解决数学问题。

如果更改功能,此问题更容易解决。

您假设的等式是:

y = A + B*exp(C*x)

如果你能做到这一点会更容易:

y-A = B*exp(C*x)

现在A只是一个常数,可以是零或任何值,可以向上或向下移动曲线。我们称之为变量z:

z = B*exp(C*x)

采取双方的自然记录:

ln(z) = ln(B*exp(C*x))

我们可以简化右侧以获得最终结果:

ln(z) = ln(B) + C*x

将您的(x,y)数据转换为(x,z),您可以使用直线的最小二乘拟合,其中C是(x,z)空间中的斜率,ln(B)是截距。有很多软件可以做到这一点。