首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >optim()中的错误:搜索单变量函数的全局最小值

optim()中的错误:搜索单变量函数的全局最小值
EN

Stack Overflow用户
提问于 2016-06-10 00:55:53
回答 2查看 1.5K关注 0票数 3

我试图在R中选择一个函数

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

需要改进的功能是:

代码语言:javascript
复制
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的负二项式变量的向量。

代码语言:javascript
复制
data <- rnegbin(10000, mu = 2, theta = 2)

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
x[which.max(z)]

但是优化并不适用于BFGS。

代码语言:javascript
复制
Error in optim(par = theta, fn = EMV, data = data, method = "BFGS") : 
non-finite finite-difference value [1]

如果使用SANN,则无法获得正确的值,例如:

代码语言:javascript
复制
$par
[1] 5.19767e-05

$value
[1] -211981.8

$counts
function gradient 
   10000       NA 

$convergence
[1] 0

$message
NULL

问题如下:

  1. 我做错了什么?
  2. 有没有办法告诉optim,param应该大于0?
  3. 有什么方法可以告诉optim我想要最大化函数吗?(恐怕optim正在尝试最小化,而且函数返回最小值的值非常小)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-10 01:29:06

最小化还是最大化?

虽然?optim说它可以进行最大化,但那是在一个括号中,所以最小化是默认的:

代码语言:javascript
复制
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没有约束。当我们希望约束多个参数为正时,情况也是如此。

如何更改您的代码?

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2016-06-10 01:26:34

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37738423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档