最小二乘 Levenburg Marquardt 与 Apache commons
Least squares Levenburg Marquardt with Apache commons
我在 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 中定义收敛标准以阻止它达到最大迭代次数?
我认为 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) 中的斜率 space ln(B)
是截距。有很多软件可以做到这一点。
我在 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 中定义收敛标准以阻止它达到最大迭代次数?
我认为 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) 中的斜率 space ln(B)
是截距。有很多软件可以做到这一点。