【问题标题】:Error in optim(): searching for global minimum for a univariate functionoptim() 中的错误:搜索单变量函数的全局最小值
【发布时间】:2016-06-20 14:25:14
【问题描述】:

我正在尝试优化 R 中的函数

该函数是仅估计mu参数时负二项式的似然函数。这应该不是问题,因为该函数显然只有一个最大值。但是,我无法达到理想的结果。

要优化的功能是:

EMV <- function(data, par) {

    Mi  <- par
    Phi <- 2
    N   <- NROW(data)

    Resultado <- log(Mi/(Mi + Phi))*sum(data) + N*Phi*log(Phi/(Mi + Phi))
    return(Resultado)
}

数据是带有参数 2 和 2 的负二项式变量的向量

data <- rnegbin(10000, mu = 2, theta = 2)

当我使用以下代码绘制具有mu 作为变量的函数时:

x <- seq(0.1, 100, 0.02)
z <- EMV(data,0.1)
for (aux in x) {z <- rbind(z, EMV(data,aux))}
z <- z[2:NROW(z)]
plot(x,z)

我得到以下曲线:

并且z的最大值接近参数值 --> 2

x[which.max(z)]

但优化不适用于 BFGS

Error in optim(par = theta, fn = EMV, data = data, method = "BFGS") : 
non-finite finite-difference value [1]

并且不会使用 SANN 正确的值,例如:

$par
[1] 5.19767e-05

$value
[1] -211981.8

$counts
function gradient 
   10000       NA 

$convergence
[1] 0

$message
NULL

问题是:

  1. 我做错了什么?
  2. 有没有办法告诉optim 参数应该大于0?
  3. 有没有办法告诉optim我想最大化这个功能? (恐怕optim 正试图最小化,并且会达到一个非常小的值,函数返回最小值)

【问题讨论】:

  • 谢谢。我使用了optim(par = theta, fn = EMV, data = data, method = "Brent", lower = 0, upper = 1E5),结果得到了 1E5。看来,优化是最小化区间内的函数。
  • 请将您的评论表述为我很乐意接受的答案。非常感谢。
  • 当然...慢慢来。我的问题已经解决了。

标签: r optimization


【解决方案1】:

最小化还是最大化?

虽然?optim说可以做最大化,但是那是在括号里,所以默认是最小化:

fn: A function to be minimized (or maximized) ...

因此,如果我们想最大化一个目标函数,我们需要将-1 乘以它,然后将其最小化。这是很常见的情况。在统计中我们经常想找到最大的对数似然,所以使用optim(),我们别无选择,只能最小化负对数似然。

使用哪种方法?

如果我们只做一维最小化,我们应该使用方法"Brent"。该方法允许我们指定搜索区域的下限和上限。搜索将从一个边界开始,然后向另一个边界搜索,直到达到最小值或到达边界。这样的规范可以帮助你约束你的参数。例如,您不希望mu 小于0,则只需设置lower = 0

当我们移动到二维或更高维度时,我们应该求助于"BFGS"。在这种情况下,如果我们想约束我们的一个参数,比如a,使其为正,我们需要进行对数变换log_a = log(a),并使用log_a 重新参数化我们的目标函数。现在,log_a 不受约束。当我们希望将多个参数约束为正时也是如此。

如何更改您的代码?

EMV <- function(data, par) {

    Mi  <- par
    Phi <- 2
    N   <- NROW(data)

    Resultado <- log(Mi/(Mi + Phi))*sum(data) + N*Phi*log(Phi/(Mi + Phi))
    return(-1 * Resultado)
}

optim(par = theta, fn = EMV, data = data, method = "Brent", lower = 0, upper = 1E5)

【讨论】:

    【解决方案2】:

    optim 的帮助文件说:“默认情况下,optim 执行最小化,但如果 control$fnscale 为负数,它将最大化。”因此,如果您将函数输出乘以 -1 或更改控制对象输入,您应该会得到正确的答案。

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 2012-09-03
      • 2021-04-29
      • 1970-01-01
      • 2018-10-26
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多