约束优化,其中一个参数包含在另一个参数的约束中

时间:2016-08-10 20:13:22

标签: r optimization constraints

我想计算以下

Optimization Problem

所以我想找到最大化功能的Theta和Sigma。 约束是:

> Theta>-Sigma
> -1<Sigma<1

所以我的一个问题是我不知道如何处理一个参数包含在另一个参数的约束中的事实,我希望优化它。

我尝试使用optim(),constrOptim和dfoptim!

使用 optim():

k=8
i=1:(k-1)
x=c(5,0.2)
n=24
nj=c(3,4,8,1,1,4,2,1)


EPPF <- function(x,n,nj) {
  y=(x[1]+1):(x[1]+1+(n-1)-1)
  z=-(prod(x[1]+i*x[2])/(prod(y))*prod(sapply(nj, hfun)))
  return(z)}

hfun <- function(p){
  h=(1-x[2]):((1-x[2])+p-1)
  hfun=prod(h)
  return(hfun)
}

> optim(c(6,0.3), fn=EPPF,method = "L-BFGS-B", n=n,nj=nj, lower = c(-x[1],-1), upper = c(Inf,1))
$par
[1] 6.0 0.3

$value
[1] -1.258458e-15

$counts
function gradient 
       2        2 

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

我也尝试过使用构造函数:

make.EPPF <- function(n,nj,fixed=c(FALSE,FALSE)){
  params <-fixed
  function(p) {
    hfun <- function(y){
      h=(1-sigma):((1-sigma)+y-1)
      hfun=prod(h)
      return(hfun)
    }

    params[!fixed] <- p
    theta <- params[1]
    sigma <- params[2]
    y=(theta+1):(theta+1+(n-1)-1)
    z=(prod(theta+i*sigma)/(prod(y))*prod(sapply(nj, hfun)))
    z
  }
}

EPPF <-make.EPPF (n,nj)

> optim(c(theta=6, sigma=0.5), fn=EPPF,method = "L-BFGS-B",lower = c(-sigma,-1), upper = c(Inf,1))
Error in optim(c(theta = 6, sigma = 0.5), fn = EPPF, method = "L-BFGS-B",  : 
  object 'sigma' not found

使用 constrOptim():

> A <- matrix(c(1,1,0,1,0,-1),3,2,byrow=T)
> b <- c(0,-1,-1)
> 
> constrOptim(c(3,0.3),EPPF,NULL,A,b, control=list(fnscale=-1))
$par
[1] 3.0 0.3

$value
[1] 9.712117e-16

$counts
[1] 0

$convergence
[1] 0

$message
NULL

$outer.iterations
[1] 1

$barrier.value
[1] 7.313452e-05

使用包 dfoptim

> library(dfoptim)
> nmkb(x=c(6,0.3), EPPF, lower=c(-x[2],-1), upper=c(Inf, 1 ))
Error in par < lower : 
  comparison (3) is possible only for atomic and list types

由于某些原因,没有收敛或其他错误。

我是编程和R的新手,如果有人可以帮助我,我会非常感激。谢谢!

1 个答案:

答案 0 :(得分:1)

这是3个线性不等式约束:

sigma + theta > 0
sigma + 1 > 0
-sigma + 1 > 0

您可以在maxLik中执行此操作。但请注意,maxLik 最大化函数,因此删除z前面的' - '。这是适合我的代码(使用Rscript):

k=8
i=1:(k-1)
x=c(5,0.2)
n=24
nj=c(3,4,8,1,1,4,2,1)

EPPF <- function(x,n,nj) {
   theta <- x[1]
   sigma <- x[2]
  y=(x[1]+1):(x[1]+1+(n-1)-1)
   z <- prod(x[1]+i*x[2])/(prod(y))*prod(sapply(nj, hfun))
   z <- log(z)
   return(z)
}

hfun <- function(p){
  h=(1-x[2]):((1-x[2])+p-1)
  hfun=prod(h)
  return(hfun)
}

library(maxLik)
constraints <- list(ineqA=matrix(c(1,0,0,1,1,-1),3,2), ineqB=c(0,1,1))
m <- maxBFGS(EPPF, start=c(6,0.3), constraints=constraints, n=n, nj=nj)
print(summary(m))

我也取结果的对数,因为这会导致更多“人”数。否则你必须重新调整停止条件。答案似乎是-1,1。