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" 数据。
我的算法可以在 运行 时间内生成数据。可以保证该值在一段时间内呈下降趋势,在理想条件下它会类似于双曲线(或至少具有双曲线形状)。基本绘制图(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" 数据。