如何在优化中避免 NaN?

计算科学 r 优化
2021-11-26 15:12:23

假设,我有一个功能并想优化它。但如果我使用optim()which 给出warnings(). 我怎样才能避免这些警告NaN

    myfun<-function(par, x){

    f<- sum(x)*length(x)+sum(log(gamma(par))*x)+1
    return(-f)
    }
    optim(0.1, myfun, x=c(1,5,4,7,8,5,6,5,45,8))

$par
[1] 4.203895e-46

$value
    [1] -10762.39
    $counts
function gradient 
     502       NA 
$convergence
    [1] 1
    $message
NULL

There were 50 or more warnings (use warnings() to see the first 50)


warnings()

2: In log(gamma(par)) : NaNs produced
3: In log(gamma(par)) : NaNs produced
4: In log(gamma(par)) : NaNs produced
3个回答

正如 AdamO 所说,您对非正值有疑问。纯粹出于优化目的,求幂以确保事物是非负的并添加一些盐以避免零通常可以解决问题。所以......像:

myfun<-function(par, x){
 par <- exp(par) + 10^-10
 f<- sum(x)*length(x)+sum(log(gamma(par))*x)+1
 return(-f)
}

那么这两个优化器都不会给您带来任何麻烦。

optim( log(0.1), myfun, x=c(1,5,4,7,8,5,6,5,45,8), method="BFGS")
optim( log(0.1), myfun, x=c(1,5,4,7,8,5,6,5,45,8), method="CG")
# I logged because I exponentiate in the function.

基本上,您有一个受约束的优化问题,并且您想将其表示为无约束的优化问题。因此,你对你的解决方案空间求幂以确保它是非负的。

请注意:如果您测试非常大的值,求幂有时会导致问题,例如。标准杆=113;会导致评估“gamma(exp(113))”,这实际上是一个很大的数字。:)

par问题是您的最佳解决方案是一个边界值(为 0,并且不允许为负值)。myfun的给定值进行绘图来验证这一点我认为一般优化器没有很好地配置来处理此类问题。x

使用 lgamma(par) 代替 log(gamma(par))。