R:一维优化

时间:2015-03-17 22:50:13

标签: r optimization

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

在此优化问题中,我能够估算出一个值a,即" close"最佳解决方案,但"亲近"取决于具体情况。

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

1 个答案:

答案 0 :(得分:5)

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

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

这个简单的函数在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

然后要获得root,你只需要通过以下方法对上面的解决方案进行转换:

log(54.59815)
#> 4

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

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

并且它代替exp()

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

请注意,log-odds转换将实数映射到单位间隔,因此interval参数变为0:1

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