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

时间:2019-03-27 13:11:02

标签: java optimization curve-fitting data-fitting

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

value of algorithm over time

现在,我想预测一下,在运行期间经过n个时间步长后,值将如何变化。我尝试使用来自org.apache.commons.math3的线性或多项式回归,但是显然,由于曲线既不是线性的也不是多项式的,因此预测也不是很好。同样,两种预测都提供了没有下降趋势的曲线。

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

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

1 个答案:

答案 0 :(得分:0)

我的最终解决方案是使用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]个值

这使我能够拟合“双曲线型”数据。