R:一维优化

R: one-dimensional optimization

我想使用 optimize() 或类似的东西来搜索函数的最小值/最大值。但是我不确定应该优化函数的确切范围,这是函数 'optimze()'(例如 optimize(f=FUN,interval=c(lowerBound,upperBound)))的必需参数。

在这个优化问题中,我能够估计出 a 的值 "close" 到最优解,但 "closeness" 取决于情况。

R 中是否有一个函数可以使用初始值 a,而不需要预先指定优化函数的区间?

当你说你不确定下限时,我怀疑这意味着你试图估计的参数没有下限。

如果是这种情况,一个技巧是转换函数,使参数有一个下限。

这个简单的函数在 x=4 处有一个最小值:

fun <- function(x) -exp(-(x - 4)^2) + 8

我们可以通过以下方式找到:

optimize(f=fun,interval=c(0,8))
#> $minimum
#> [1] 4

但是让我们假装一下,我们不确定是否有下限,但我们知道上限是 8。如果我们尝试,R 会抛出一个错误:

optimize(f=fun,interval=c(-Inf,8))

因为边界必须是有限的。在这种情况下,我们可以使用映射的指数变换 (exp()) 实数到正数,像这样:

optimize(f=function(x)fun(log(x)),
         interval=exp(c(-Inf,8)))
#> $minimum
#> [1] 54.59815

然后要得到根,你只需要通过以下方式对上面的解决方案进行反向转换:

log(54.59815)
#> 4

如果您不知道基础参数的上限或下限,则可以使用对数比值转换代替 log()

function(x) log(x/(1-x))

它与exp()相反:

function(y) exp(y)/(1 + exp(y))

注意log-odds变换将实数映射到单位区间,所以区间参数变为0:1

这些解决方案确实有一些数值限制(例如,如果我们在第一个解决方案中设置了 interval=exp(c(-Inf,16)),我们就会得到一个错误)。提示,您可以重新缩放这些变换以围绕给定点 a 中心,这可以减少数值限制。