Java 中的非线性(双曲线)曲线拟合

Nonlinear (hyperbola) curve fitting in Java

我的算法可以在 运行 时间内生成数据。可以保证该值在一段时间内呈下降趋势,在理想条件下它会类似于双曲线(或至少具有双曲线形状)。基本绘制图(x 轴是时间,y 轴是值)如下所示:

现在,我想预测 运行 时间段内 n 时间步后的值会是什么样子。我尝试使用 org.apache.commons.math3 中的线性或多项式回归,但显然,预测效果不佳,因为曲线既不是线性的也不是多项式的。此外,这两个预测都提供了没有向下趋势的曲线。

为了解决这个问题,我尝试使用 odinsbane's least squares,但我无法提供正确的第一参数假设,因此无法正确拟合曲线。

所以我的问题是:是否有任何 kotlin/java 库可以在我不提供第一个参数估计的情况下正确地拟合我的数据?

我的最终解决方案是使用 this,它是 Levenberg–Marquardt 求解器。 我将通用双曲线函数 a + b/(x + c) 分解为 a * c + a * x + b - y * c = xy - 因此:

  • setTargetValues 收到 x*y 数据
  • setValues 提供了 a * c + a * x + b - y * c 个值
  • setDerivatives 提供了 [c + x, 1, a - y] 个值

这让我能够适应 "hyperbolic like" 数据。