R中为什么optimx不能给出正确的解决方案,这个简单的非参数可能性最大化?(Why does op

2019-07-30 20:30发布

被optimx()提供不正确的解决方案还是我失去了一个简单点的? 谢谢!

我试图最大化一个非常简单的可能性。 这是在不参指定F的分布的意义上的非参数似然性。 相反,对于每个观测到的xif(xi)=pi ,从而log(Likelihood)=Sum(log(f(xi)))=Sum(log(pi))

我试图最大化的功能是: sum(log(pi))+lamda(sum(pi-1))其中sum(pi)=1 (即,这是受约束的最大化问题可使用拉格朗日乘数来解决)。

这个问题的答案的问题是pi=1/n ,其中n是数据点的数量。 然而,optimx似乎并没有给这个解决方案。 没有任何人有任何想法。 如果n=2 ,我最大化函数是log(p1)+log(p2)+lamda(p1+p2-1)

这里是我的代码,并输出R:

n=2
log.like=function(p)
{
  lamda=p[n+1]
  ll=0
  for(i in 1:n){
    temp = log(p[i])+lamda*p[i]-lamda/(n)
    ll=ll+temp
  }
  return(-ll)
}


mle = optimx(c(0.48,.52,-1.5),
             log.like,
             lower=c(rep(0.1,2),-3),
             upper=c(rep(.9,2),-1),
             method = "L-BFGS-B")

> mle
             par  fvalues   method fns grs itns conv  KKT1 KKT2 xtimes
1 0.9, 0.9, -1.0 1.010721 L-BFGS-B   8   8 NULL    0 FALSE   NA      0

公式当溶液n=2p1=p2=1/2lamda=-2 。 但是,使用optimx当我不明白这一点。 任何的想法?

Answer 1:

没有错optimx 。 退后一步,看看你想最大化的功能: log(p1) + log(p2) + lamda*(p1+p2-1) 这是很直观的,最佳的解决方案是让所有的变量尽可能的大,不是吗? 看到optimx理应退还您所指定的上限。

那么,什么是错的方法呢? 当使用拉格朗日乘子,关键点是你的函数的鞍点以上,而不是像局部极小optimx会帮你找。 所以,你需要修改以这样一种方式,这些鞍点成为局部极小您的问题。 这可以通过在梯度,这是很容易计算分析你的问题的规范优化来完成。 有一个很好的例子(有图片)在这里:

http://en.wikipedia.org/wiki/Lagrange_multiplier#Example:_numerical_optimization 。

对于您的问题:

grad.norm <- function(x) {
  lambda <- tail(x, 1)
  p <- head(x, -1)
  h2 <- sum((1/p + lambda)^2) + (sum(p) - 1)^2
}

optimx(c(.48, .52, -1.5),
       grad.norm,
       lower = c(rep(.1, 2), -3),
       upper = c(rep(.9, 2), -1),
       method = "L-BFGS-B")

#                               par      fvalues   method  fns grs [...]
# 1 0.5000161, 0.5000161, -1.9999356 1.038786e-09 L-BFGS-B  13  13 [...]

追问 :如果你不想或者不能自行计算梯度,可以假设R计算数值逼近,例如:

log.like <- function(x) {
  lambda <- tail(x, 1)
  p <- head(x, -1)
  return(sum(log(p)) + lambda*(sum(p) - 1))
}

grad.norm <- function(x) {
  require(numDeriv)
  return(sum(grad(log.like, x)^2))
}

optimx(c(.48, .52, -1.5),
       grad.norm,
       lower = c(rep(.1, 2), -3),
       upper = c(rep(.9, 2), -1),
       method = "L-BFGS-B")

#                                par      fvalues   method fns grs [...]
# 1 0.5000161, 0.5000161, -1.9999356 1.038784e-09 L-BFGS-B  13  13 [...]


文章来源: Why does optimx in R not give the correct solution to this simple nonparametric likelihood maximization?