我需要解决 Java 程序中的非线性最小化(N 个未知数的最小残差平方)问题。解决这些问题的常用方法是莱文伯格-马夸特 http://en.wikipedia.org/wiki/Levenberg-Marquardt_algorithm算法。我有一些问题
-
有人对不同的 LM 实现有经验吗? LM 的风格略有不同,我听说算法的精确实现对其数值稳定性有重大影响。我的函数表现得非常好,所以这可能不会成为问题,但我当然想选择更好的替代方案之一。以下是我发现的一些替代方案:
FPL 统计组的非线性优化 Java 包 http://www1.fpl.fs.fed.us/optimization.html。这包括经典 Fortran MINPACK 例程的 Java 翻译。
JLAPACK http://icl.cs.utk.edu/f2j/,另一个 Fortran 翻译。
优化算法工具包 http://optalgtoolkit.sourceforge.net/.
Java数值 http://scribblethink.org/Computer/Javanumeric/index.html.
一些Python实现。纯Python 就可以了,因为它可以用jythonc 编译为Java。
是否有任何常用的启发式方法来进行 LM 所需的初始猜测?
在我的应用程序中,我需要对解决方案设置一些约束,但幸运的是它们很简单:我只要求解决方案(为了成为物理解决方案)是非负的。轻微负解是数据测量不准确的结果,显然应该为零。我正在考虑使用“常规”LM,但进行迭代,以便如果某些未知数变为负值,我将其设置为零并从中解决其余问题。真正的数学家可能会嘲笑我,但你认为这可行吗?
感谢您的任何意见!
Update:这不是火箭科学,要求解的参数数量 (N) 最多为 5 个,而且数据集勉强大到足以使求解成为可能,所以我相信 Java 足以高效地解决这个问题。我相信聪明的应用数学家已经多次解决了这个问题,所以我只是在寻找一些现成的解决方案,而不是自己解决。例如。如果它是纯Python,Scipy.optimize.minpack.leastsq 可能会没问题。
您的初始猜测越接近解决方案,收敛的速度就越快。
你说这是一个非线性问题。您可以进行线性化的最小二乘解。也许您可以使用该解决方案作为第一个猜测。一些非线性迭代会告诉您假设的好坏。
另一个想法是尝试另一种优化算法。如果遗传算法和蚁群算法可以在许多 CPU 上运行,那么它们可能是一个不错的选择。它们也不需要连续导数,因此如果您有离散、不连续的数据,它们就很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)