【问题标题】:Constraint Optimization with one parameter included in the constraint of the other一个参数包含在另一个参数的约束中的约束优化
【发布时间】:2016-08-10 20:13:21
【问题描述】:

我要计算以下内容

所以我想找到最大化函数的 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 的相对新手,如果有人能帮助我,我将不胜感激。谢谢!

【问题讨论】:

  • 这些是 3 个线性约束:
  • 我看不出这里的工作示例(使用constrOptim):stackoverflow.com/questions/5436630/… 不会满足任何原因。说Theta&gt;-Sigma和说Theta+Sigma &gt;0是一样的
  • 但是当我使用它时,参数保持不变。说最优参数总是起始值。

标签: r optimization constraints


【解决方案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。

【讨论】:

  • 谢谢!但是优化方法总是将起始参数作为最佳参数值返回。这不可能是正确的!有人知道我能做什么吗?
  • * 您是否如上所述在 x 上优化 EPPF,其中 x[1] 是 theta,x[2] 是 sigma? * EPPF() 当你用上面的参数喂它时,它会给你正确的结果吗? * 上面的等式中的下标 _{n-1} 和 _{n_j - 1} 是什么意思?请注意,常见的优化器未调整为处理 1e-15 之类的数字。考虑记录日志。
  • 完全正确。我想找到最大化 EPPF 函数的参数 x[1] 和 x[2]。带下标的概念是上升阶乘。我忘了提这个!我认为问题在于数量太少(1e-15)。但我尝试使用日志,但我总是得到 NaN 的产生。
  • 伙计,测试你的功能!显然,您得到 NaN,就像在 EPPF 定义中一样,您使用带减号的 z。我已经调整了答案。
  • 首先非常感谢。是的,当我使用 maxLik 时,我必须删除“-”。但是,如果我按照您在调整后的答案中建议的那样运行代码,我仍然会得到 NaN。我是编程和 R 的新手。对不起,但我不知道我的错误在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多