Решить квадратичную оптимизацию с нелинейными ограничениями
Я пытаюсь решить следующую проблему квадратичного программирования:
min w w T Σ w,
st w T e = 1,
ул. ‖W ‖ 1 ≤ δ
куда A
является единичной матрицей, Sigma
ковариационная матрица и e
это вектор из них.
Первое ограничение гарантирует, что решение складывается в единицу.
Второе ограничение гарантирует, что сумма абсолютных значений (1-норма) решения будет меньше или равна некоторой константе.
Я попытался решить это следующим образом:
library(Rsolnp)
#Generate some sample data
N=100
sample.data <- replicate(N,rnorm(1000,0,1))
#specify optimization problem
fn<-function(x) {cov.Rt<-cov(sample.data); return(as.numeric(t(x)%*%cov.Rt%*%x))}
#specify equality constraint
eqn<-function(x){one.vec<-matrix(1,ncol=N,nrow=1);return(as.numeric(one.vec%*%x))}
constraints<-1
#specify inequality constraint
ineq<-function(x){one.vec<-matrix(1,ncol=N,nrow=1);
z1<-one.vec%*%abs(x)
return(as.numeric(z1))
}
#specify lower and upper bounds
uh<-2
lb<-1
#specify starting vector of "w"
x0<-matrix(1/N,N,1)
#solve quadratic optimization problem:
control <- list("trace"="0")
sol1<-solnp(pars=x0,fun=fn,eqfun=eqn,eqB=constraints, ineqfun=ineq,ineqUB=uh,ineqLB=lb,control=control)
Я бы хотел знать:
Это решение правильно?
Существуют ли альтернативные (более простые) способы ее решения? Решение с использованием
solnp()
берет навсегда для больших задач.