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
中心,这可以减少数值限制。
我想使用 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
中心,这可以减少数值限制。