我正在寻找势函数的最小值,其中。我正准备使用 Levenberg-Marquardt 作为快速起点,因为它已经在我使用的 Eigen 中实现了。由于我不明白的原因,它要求解决方案的维度()高于或等于搜索空间的维度()。
这些函数表现良好,具有一个全局最小值,具有连续导数(目前将通过数值计算),并提供了良好的初始起始解。
对于最初的惰性实现,这里推荐的算法是什么?只是具有数值计算梯度的 Newton-Raphson?
我正在寻找势函数的最小值,其中。我正准备使用 Levenberg-Marquardt 作为快速起点,因为它已经在我使用的 Eigen 中实现了。由于我不明白的原因,它要求解决方案的维度()高于或等于搜索空间的维度()。
这些函数表现良好,具有一个全局最小值,具有连续导数(目前将通过数值计算),并提供了良好的初始起始解。
对于最初的惰性实现,这里推荐的算法是什么?只是具有数值计算梯度的 Newton-Raphson?
Levenberg-Marquardt 用于(欠定)方程组的非线性最小二乘解(即,求解为 ,),而不是用于最小化函数(即,标量值函数 - 如果函数不是标量值,则不能最小化它,因为在上没有合理的顺序)。
从您的标签中,我假设“行为良好”意味着(严格)凸,因此标准方法应该有效:
如果您有足够准确的二阶导数(明确地或作为在给定点和方向的情况下评估它们的程序),Newton-Raphson 将是我的选择(可能与 la Steihaug的信任区域全球化)。
否则(即,您需要通过取有限差分来近似导数),尝试使用 BFGS 等准牛顿方法(结合 Armijo 线搜索);有一个基于 Eigen的非常轻量级的C++ 实现(但没有行搜索)。
需要注意的一件事是,使用函数值进行全球化(信任区域或回溯线搜索)的方法可能对导数中的错误相当敏感,因为它们假设梯度(或牛顿方向)实际上是下降方向,这可能不是近似梯度(或牛顿方向)的情况。
TL;DR:如果可行的话,计算一个精确的梯度总是值得的(即使是惰性实现)。对于 Hessian 而言,它并不是那么重要,但如果您没有精确的二阶导数,请使用 BFGS 而不是计算二阶有限差分近似。
嗯,我最喜欢用于优化函数的算法之一是Nelder-Mead 方法。它是一种用于非线性优化的无导数方法。根据您的功能,它可能不是优化的最佳方法,但它应该可以完成这项工作。
如果您可以访问 matlab,它会以“fminsearch”的名称在那里实现。
还有一点需要注意的是,你说你的两个函数都有一个全局最小值——小心,因为它们的总和可能没有一个。