Answers:
添加平方罚分项以摆脱约束是一种简单的方法,仅给出1级/罚因子的精度。因此,除非您在计算过程中让损失达到无穷大,否则不建议您以较高的精度使用。但是高的罚分因子使Hessian病情严重,这限制了可达到的总精度,而没有明确考虑约束条件。
请注意,约束约束比常规约束要容易得多,因为约束约束实际上从不转换为惩罚。
求解器L-BFGS-B(使用大约5维的历史)通常在两个低的高维中都非常可靠且快速地解决约束问题。例外是问题的收敛性,这些问题在解决方案之外变得很平坦,在解决方案中很容易陷入下降方法。
我们在许多不同的维度上对非常不同的函数进行了许多实验,并提供了许多不同的求解器,因为我们需要一个非常强大的边界约束求解器作为全局优化软件的一部分。L-BFGS-B显然是通用方法,尽管当然在其他问题上,其他求解器的性能要好得多。因此,我建议将L-BFGS-B作为首选,并在L-BFGS-B无法很好地处理您的特殊问题的情况下尝试其他技术。
我只会使用通用NLP求解器 IPOPT。它是我尝试过的最强大的求解器。
除非您有一些非常特殊的要求,否则没有理由坚持使用特定于问题的求解器,该求解器仅适用于具有框约束的NLS。
需求的变化(例如,添加非线性约束)将导致特定问题的求解器严重头痛。如果使用通用IPOPT,则不会有此类问题。
解决方案的速度可以更快,但会损害IPOPT的出色鲁棒性。我认为,请使用精确的导数(如果可用)。只有在我已经证明性能问题的情况下,我才会开始使用近似值(例如L-BFGS)。
所述řminpack.lm CRAN包提供列文伯格-马夸尔特执行与框约束。
通常,对于最小二乘问题,Levenberg-Marquardt比L-BFGS-B更适合。在具有挑战性的问题上,它将更好地融合。由于它是针对非线性最小二乘问题量身定制的,因此它也将比通用IPOPT快得多。
R包选择了一种非常简单的投影方法来强制执行约束(请参见源代码)。根据您使用的LM实现,可能很容易包含它。
现在,注释中使用转换的建议(例如,在scipy中使用正弦转换)也是将不受约束的LM算法转换为受限算法的一种好方法。如果Jacobian是分析型的,则还需要将转换包括在Jacobian中。
(几年后)两个处理盒约束的求解器:
Scipy minimum_squares 有3种方法,并提供大量文档: