我需要在我的 Java 程序中解决非线性最小化(N 个未知数的最小残差平方)问题。解决这些问题的常用方法是Levenberg-Marquardt算法。我有一些问题
有人对可用的不同 LM 实现有经验吗?LM 的风格略有不同,我听说该算法的确切实现对其数值稳定性有重大影响。我的功能表现得非常好,所以这可能不是问题,但我当然想选择一个更好的选择。以下是我发现的一些替代方案:
FPL 统计组的非线性优化 Java 包。这包括经典 Fortran MINPACK 例程的 Java 翻译。
JLAPACK,另一个 Fortran 翻译。
一些 Python 实现。纯 Python 就可以了,因为它可以用 jythonc 编译成 Java。
是否有任何常用的启发式方法来进行 LM 所需的初始猜测?
在我的应用程序中,我需要对解决方案设置一些约束,但幸运的是它们很简单:我只要求解决方案(为了成为物理解决方案)是非负的。稍微负的解决方案是数据测量不准确的结果,显然应该为零。我正在考虑使用“常规”LM,但会进行迭代,以便如果某些未知数变为负数,我将其设置为零并从中解决其余的问题。真正的数学家可能会嘲笑我,但你认为这可行吗?
感谢您的任何意见!
更新:这不是火箭科学,要解决的参数数量(N)最多为 5 个,数据集几乎不足以解决问题,所以我相信 Java 足够有效地解决这个问题。而且我相信这个问题已经被聪明的应用数学家解决了无数次,所以我只是在寻找一些现成的解决方案,而不是自己做饭。例如,如果它是纯 Python,Scipy.optimize.minpack.leastsq 可能会很好。