【问题标题】:Optim() function in RR 中的 Optim() 函数
【发布时间】:2022-01-12 08:43:45
【问题描述】:

我正在尝试使用 R 的 optim() 函数来优化函数的参数。这是功能:Function, because mathjax does not work 下面的代码sn-p是我对其Log-Likelihood函数的实现,即here

likelihood_levy <- function(params, x){
  mu <- params[1]
  sigma <- params[2]
  n <- length(x)

  ans <- ((1.5 * n) * log(sigma)) +
      sum(log(1 / (x - mu))) -
      (n * log(sqrt(2*pi) * sigma)) - 
      (0.5 * sigma * sum(1 / (x - mu)))
  }

  return(ans)
}

optim(c(-10, 2), likelihood_levy, x = sample1, method="L-BFGS-B",
      lower = c(min(sample1) - 0.001, 0))

如何在函数定义中添加参数边界?例如,第一个参数必须小于 x,第二个参数不能小于 0。

注意:如果我使用 optim() 函数的“L-BFGS-B”方法,我会收到一条错误消息,提示“L-BFGS-B 需要 'fn' 的有限值” 这个问题的任何解决方案都会很棒!

谢谢!

【问题讨论】:

  • Optim 只接受绝对边界,不接受相对边界,比如 x 必须小于 y,在这种情况下你需要一个不同的求解器。
  • 无论如何,错误似乎是您的函数在某处计算为无穷大或缺失值,从而破坏了优化。

标签: r function optimization parameters log-likelihood


【解决方案1】:

问题是函数likelihood_levy 要么返回一个大于.Machine$double.xmax 的值,要么在函数内部发生被零除。这条线可能是罪魁祸首:

sum(log(1 / (x - mu))) 

如果x 等于或非常接近mu,就会出现问题。您可以添加一些防御性代码来检查这一点。然而:

第一个参数必须小于x

我认为optim 没有办法做到这一点

【讨论】:

    【解决方案2】:

    有多个问题:

    1. 在 return 语句之前有一个多余的右括号。
    2. 即使 lower 确保 x - mu 为正,我们在计算数值梯度时仍然会遇到问题,因此请使用无导数方法(我们将在下面进行)或提供梯度函数进行优化。
    3. optim 计算最小值,但我们想要最大似然,而不是最小似然。告诉 optim 最大化(我们在下面这样做)或使用负对数似然而不是对数似然。
    4. 起始值应该是可行的,即它应该能够计算对数似然并产生一个有限值,同时满足 mu
    5. 我们需要处理 mu
    6. sample1 丢失,因此我们无法重现问题中的问题。

    修复我们拥有的所有这些

    likelihood_levy <- function(params, x){
      mu <- params[1]
      sigma <- params[2]
      n <- length(x)
      ans <- if (mu >= min(x)) -Inf
        else ((1.5 * n) * log(sigma)) +
          sum(log(1 / (x - mu))) -
          (n * log(sqrt(2*pi) * sigma)) - 
          (0.5 * sigma * sum(1 / (x - mu)))
      return(ans)
    }
    
    set.seed(123)
    sample1 <- rnorm(25)
    st <- c(min(sample1) - 0.001, 1)
    res <- optim(st, likelihood_levy, x = sample1, control = list(fnscale = -1))
    
    str(res)
    

    给予

    List of 5
     $ par        : num [1:2] -2.25 1.61
     $ value      : num -46.6
     $ counts     : Named int [1:2] 45 NA
      ..- attr(*, "names")= chr [1:2] "function" "gradient"
     $ convergence: int 0
     $ message    : NULL
    

    【讨论】:

    • 非常感谢!这完美!我还有另一个问题,如果你不介意的话,但是在函数中 ans min(x)) -Inf 为什么是 -inf?我之前试过这个,除了 0
    • 哦,哎呀没关系。我意识到 log(0) 将是未定义的,因此您使用了 -inf。
    猜你喜欢
    • 2013-12-21
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2014-08-28
    相关资源
    最近更新 更多