我想优化一个函数,参数之和设置为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? 谢谢你的回答
答案 0 :(得分: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
)
答案 1 :(得分:0)
试试这个
proj <- function(x) x / sum(x)
varxyz <- function(param) {
param <- proj(param)
... rest of function as it is now ...
}
执行优化后,将proj
应用于optim
的解决方案以获得答案。
您可能还想查看BB包中的spg
函数,因为它本身支持投影。
答案 2 :(得分:0)
使用@baptiste的建议,并通过c
将最小值强加给ifelse
(0.1):
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))