无梯度约束优化

时间:2019-12-11 19:40:39

标签: r optimization

这是一个更笼统的问题,在某种程度上与数据无关,所以我没有MWE。

我经常拥有函数fn(.),这些函数实现的算法不可区分,但我想对其进行优化。我通常使用optim(.)及其标准方法,该方法在速度和结果方面对我来说都很好。

但是,我现在遇到一个问题,要求我为fn的多个参数之一设置界限。据我了解,optim(method="L-BFGS-B",...)允许我设置参数限制,但也需要渐变。由于fn(.)不是数学函数而是算法,因此我怀疑它没有可以通过微分得出的梯度。这使我问,是否有一种方法可以在R中执行约束优化,而无需我给出梯度。

我看过一些资料,例如约翰·纳什(John C. Nash)关于该主题的文章,但据我了解,它们涉及可以提供梯度的大多数可微函数。

1 个答案:

答案 0 :(得分:0)

总结到目前为止的评论(所有这些我自己都会说):

  • 可以使用method="L-BFGS-B"而不提供明确的渐变(gr参数是可选的);在这种情况下,R将通过有限差分(@ G.Grothendieck)计算导数的近似值。这是最简单的解决方案,因为它“开箱即用”:您可以尝试一下,看看它是否适合您。然而:
    • L-BFGS-B可能是optim()提供的方法中最严格的方法(例如,它无法处理一组试验参数评估为NA的情况)
    • 有限差分近似值相对缓慢且数值不稳定(但是,对于简单问题而言很好)
  • 在简单情况下,您可以在转换后的尺度上拟合参数,例如如果b是必须为正的参数,则可以使用log_b作为参数(并在目标函数中通过b <- exp(log_b)对其进行转换)。 (@SamMason)但是:
    • 并不总是有一个简单的转换就能达到您想要的约束
    • 如果最优解在边界上,则转换会引起问题
  • 有多种带约束的无导数优化器(通常是“框约束”,即一个或多个参数的独立下限和/或上限)(@ ErwinKalvelagen):dfoptim有一些,我有nloptr也广泛使用了minqa包(及其BOBYQA优化器)。 这是我推荐的解决方案。