Stare pytanie, ale ponieważ mam ten sam problem, postanowiłem opublikować moje 2p ...
Użyj programowania kwadratowego, jak sugeruje @Elvis, ale używając sqlincon z pakietu pracma . Myślę, że zaletą quadrpog::solve.QP
jest prostszy interfejs użytkownika do określania ograniczeń. (W rzeczywistości lsqlincon
jest to opakowanie solve.QP
).
Przykład:
library(pracma)
set.seed(1234)
# Test data
X <- matrix(runif(300), ncol=3)
Y <- X %*% c(0.2, 0.3, 0.5) + rnorm(100, sd=0.2)
# Equality constraint: We want the sum of the coefficients to be 1.
# I.e. Aeq x == beq
Aeq <- matrix(rep(1, ncol(X)), nrow= 1)
beq <- c(1)
# Lower and upper bounds of the parameters, i.e [0, 1]
lb <- rep(0, ncol(X))
ub <- rep(1, ncol(X))
# And solve:
lsqlincon(X, Y, Aeq= Aeq, beq= beq, lb= lb, ub= ub)
[1] 0.1583139 0.3304708 0.5112153
Te same wyniki, co Elvisa:
library(quadprog)
Rinv <- solve(chol(t(X) %*% X));
C <- cbind(rep(1,3), diag(3))
b <- c(1,rep(0,3))
d <- t(Y) %*% X
solve.QP(Dmat = Rinv, factorized = TRUE, dvec = d, Amat = C, bvec = b, meq = 1)$solution
EDYCJA Aby spróbować odnieść się do komentarza Gunga, oto wyjaśnienie. sqlincon emuluje Matlab na lsqlin który ma ładny stronę pomocy. Oto odpowiednie bity z niektórymi (mniejszymi) modyfikacjami:
X
Macierz mnożnika, określona jako macierz podwójnych. C reprezentuje mnożnik rozwiązania x w wyrażeniu C * x - Y. C jest M-na-N, gdzie M jest liczbą równań, a N jest liczbą elementów x.
Y
Stały wektor, określony jako wektor podwójnych. Y oznacza addytywny stały składnik w wyrażeniu C * x - Y. Y oznacza M-1, gdzie M jest liczbą równań.
Aeq
: Liniowa macierz ograniczeń równości, określona jako macierz podwójnych. Aeq reprezentuje współczynniki liniowe w ograniczeniach Aeq * x = beq. Aeq ma rozmiar Meq-by-N, gdzie Meq to liczba ograniczeń, a N to liczba elementów x
beq
Wektor ograniczenia liniowej równości, określony jako wektor podwójnych. beq reprezentuje wektor stały w ograniczeniach Aeq * x = beq. beq ma długość Meq, gdzie Aeq to Meq-by-N.
lb
Dolne granice określone jako wektor podwójnych. lb reprezentuje elementarne dolne granice w lb ≤ x ≤ ub.
ub
Górne granice, określone jako wektor podwójnych. ub reprezentuje górne granice elementarnie w lb ≤ x ≤ ub.