Eski soru ama aynı sorunla karşı karşıya kaldığımdan beri, 2p'imi göndermeyi düşündüm ...
@Elvis önerdiği ancak kullanma gibi kuadratik programlama kullanın sqlincon gelen pracma paketinin. Bence avantaj quadrpog::solve.QP
, kısıtlamaları belirleyen daha basit bir kullanıcı arayüzü. (Aslında, lsqlincon
etrafındaki bir sarıcı solve.QP
).
Örnek:
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
Elvis ile aynı sonuçlar:
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
EDIT Gung'un yorumunu ele almaya çalışmak için işte bir açıklama. sqlincon matlab'ın hoş bir yardım sayfasına sahip olan lsqlin'ini taklit eder . İşte benim (küçük) düzenlemelerimin ilgili bölümleri:
X
Çarpan matrisi, çiftlerin matrisi olarak belirtilir. C, C * x - Y ifadesinde, x çözeltisinin çarpanını temsil eder. C, M ile by-N'dir; burada M, denklemlerin sayısıdır ve N, x'in elementlerinin sayısıdır.
Y
İkili bir vektör olarak belirtilen sabit vektör. Y, C * x - Y ifadesinde katkı sabit terimini temsil eder. Y, M-ile-1'dir; buradaki M, denklemlerin sayısıdır.
Aeq
: Çiftler için bir matris olarak belirtilen doğrusal eşitlik kısıtlama matrisi. Aeq, kısıtlardaki lineer katsayıları temsil eder Aeq * x = beq. Aeq'in Meq-by-N büyüklüğü vardır; burada Meq, kısıtlamaların sayısıdır ve N, x'in elemanlarının sayısıdır.
beq
Lineer eşitlik kısıtlama vektörü, çiftler vektörü olarak belirtilir. beq, kısıtlardaki sabit vektörü temsil eder Aeq * x = beq. beq'in uzunluğu Meq, burada Aeq Meq-by-N'dir.
lb
İkili bir vektör olarak belirtilen alt sınırlar. lb elementel olarak alt sınırları lb ≤ x element ub cinsinden gösterir.
ub
Üst sınırlar, çiftler vektörü olarak belirtilir. ub, lb ≤ x ≤ ub içindeki elementel olarak üst sınırları temsil eder.