这是一个更笼统的问题,在某种程度上与数据无关,所以我没有MWE。
我经常拥有函数fn(.)
,这些函数实现的算法不可区分,但我想对其进行优化。我通常使用optim(.)
及其标准方法,该方法在速度和结果方面对我来说都很好。
但是,我现在遇到一个问题,要求我为fn
的多个参数之一设置界限。据我了解,optim(method="L-BFGS-B",...)
允许我设置参数限制,但也需要渐变。由于fn(.)
不是数学函数而是算法,因此我怀疑它没有可以通过微分得出的梯度。这使我问,是否有一种方法可以在R中执行约束优化,而无需我给出梯度。
我看过一些资料,例如约翰·纳什(John C. Nash)关于该主题的文章,但据我了解,它们涉及可以提供梯度的大多数可微函数。
答案 0 :(得分:0)
总结到目前为止的评论(所有这些我自己都会说):
method="L-BFGS-B"
而不提供明确的渐变(gr
参数是可选的);在这种情况下,R将通过有限差分(@ G.Grothendieck)计算导数的近似值。这是最简单的解决方案,因为它“开箱即用”:您可以尝试一下,看看它是否适合您。然而:
L-BFGS-B
可能是optim()
提供的方法中最严格的方法(例如,它无法处理一组试验参数评估为NA
的情况)b
是必须为正的参数,则可以使用log_b
作为参数(并在目标函数中通过b <- exp(log_b)
对其进行转换)。 (@SamMason)但是:
dfoptim
有一些,我有nloptr
也广泛使用了minqa
包(及其BOBYQA优化器)。 这是我推荐的解决方案。