Я пытаюсь решить следующую задачу квадратичного программирования:
minwwTw,
s.t.wTe = 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()
требует вечности для больших задач.
sum(i, w(i)^2) <= delta
не совсем то же самое, что требовать, чтобы сумма абсолютных значений была меньшеdelta
. Первая действительно нелинейна, вторая форма может быть линеаризована. - person Erwin Kalvelagen   schedule 12.12.2016sum(i, abs(w(i))<= delta
вы можете использовать (хороший) выпуклый решатель QP. Обычно такая модель решает очень быстро. - person Erwin Kalvelagen   schedule 12.12.2016