【问题标题】:Least squares Levenburg Marquardt with Apache commons最小二乘 Levenberg Marquardt 与 Apache commons
【发布时间】:2016-02-24 10:04:00
【问题描述】:

我在 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 技术帮助!

标签: java apache-commons least-squares


【解决方案1】:

我不认为 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) 是截距。有很多软件可以做到这一点。

【讨论】:

  • 很好的提示,但是 A 对我正在寻找的东西非常重要,你如何从转换中取回它?
  • 我认为这是拟合曲线在 y 轴上向上或向下的平移以匹配数据。该常数应该是数据 x = 0 处的 y 值吗?渐近值?平均?也许使用 B 和 C 值来确定 A 的第二次拟合?我不知道。为什么不试试这种方法,看看你会得到什么?
  • 感谢您的帮助 - 我会全力以赴!
  • 如果不出意外,它将为您对原始方程的非线性优化提供更好的初始猜测。也许您可以从中获得最好的结果,并将其塞入迭代解决方案中作为您的初始猜测。如果您碰巧猜到离真正解不远的起点,非线性方法会更快收敛。
猜你喜欢
  • 1970-01-01
  • 2020-02-14
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多