2

我想优化一个函数,参数总和设置为 1 这里有函数

varxyz<-function(param){
a<-param[1]
b<-param[2]
c<-param[3]
a^2*matcov[1,1]+b^2*matcov[2,2]+c^2*matcov[3,3]+2*a*b*matcov[1,2]+2*a*c*matcov[1,3]+2*b*c*matcov[2,3]   
}  


parammv <- optim(c(0.3,0.3,0.4),varxyz,method="L-BFGS-B",lower=c(0.1,0.1,0.1))

其中 matcov 是协方差矩阵

如何将三个参数的总和设置为 1?感谢您的回答

4

3 回答 3

2

由于它是二次优化问题,您可以使用quadprog.

# Sample data
n <- 3
matcov <- var(matrix(rnorm(2*n^2),2*n,n))

library(quadprog)
solve.QP(matcov, rep(0,n), matrix(1,nc=1,nr=n), 1, meq=1)

# With lower- and upper-bound constraints:
solve.QP(
  matcov, rep(0,n), 
  cbind( 
    rep(1,n),  # Equality constraint
    diag(n),   # Lower bound constraint
    -diag(n)   # Upper bound constraint
  ),
  c(
    1,         # Equality constraint RHS
    rep(.1,n), # Lower bound
    rep(-1,n)  # - Upper bound
  ),
  meq = 1      # The first constraint is an equality
)
于 2013-04-16T12:46:04.497 回答
0

使用@baptiste 的建议并通过以下方式将最小值施加到c(0.1)ifelse

matcov <- var(matrix(rnorm(12),4,3))
varxyz<-function(param){
 a<-param[1]
 b<-param[2]
 c<-1-(a+b)
 ifelse(c >= 0.1,a^2*matcov[1,1]+b^2*matcov[2,2]+c^2*matcov[3,3]+2*a*b*matcov[1,2]+2*a*c*matcov[1,3]+2*b*c*matcov[2,3],-Inf)
}  


parammv <- optim(c(0.3,0.3),varxyz,method="L-BFGS-B",lower=c(0.1,0.1))
于 2013-04-16T14:33:41.997 回答
0

尝试这个

proj <- function(x) x / sum(x)

varxyz <- function(param) {
   param <- proj(param)
   ... rest of function as it is now ...
}

执行优化后应用于proj解决方案optim以得到答案。

您可能还想查看spgBB 包中的函数,因为它本机支持投影。

于 2013-04-16T13:41:41.923 回答