Pertanyaan lama tapi karena saya menghadapi masalah yang sama saya pikir untuk memposting 2p ...
Gunakan pemrograman kuadrat seperti yang disarankan oleh @Elvis tetapi menggunakan sqlincon dari paket pracma . Saya pikir kelebihannya quadrpog::solve.QP
adalah antarmuka pengguna yang lebih sederhana untuk menentukan kendala. (Bahkan, lsqlincon
adalah pembungkus di sekitar solve.QP
).
Contoh:
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
Hasil yang sama dengan Elvis:
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 Untuk mencoba menanggapi komentar gung, inilah beberapa penjelasan. sqlincon mengemulasi matlab ini lsqlin yang memiliki halaman bantuan yang bagus. Inilah bit yang relevan dengan beberapa suntingan (minor) saya:
X
Matriks pengali, ditentukan sebagai matriks ganda. C mewakili pengali dari solusi x dalam ekspresi C * x - Y. C adalah M-by-N, di mana M adalah jumlah persamaan, dan N adalah jumlah elemen x.
Y
Vektor konstan, ditetapkan sebagai vektor ganda. Y mewakili istilah konstanta aditif dalam ekspresi C * x - Y. Y adalah M-by-1, di mana M adalah jumlah persamaan.
Aeq
: Matriks kendala kesetaraan linier, ditetapkan sebagai matriks ganda. Aeq mewakili koefisien linier dalam batasan Aeq * x = beq. Aeq memiliki ukuran Meq-by-N, di mana Meq adalah jumlah kendala dan N adalah jumlah elemen x
beq
Vektor kendala kesetaraan linier, ditetapkan sebagai vektor ganda. beq mewakili vektor konstan dalam batasan Aeq * x = beq. beq memiliki panjang Meq, di mana Aeq adalah Meq-by-N.
lb
Batas bawah, ditentukan sebagai vektor ganda. lb mewakili batas bawah elementwise dalam lb ≤ x ≤ ub.
ub
Batas atas, ditentukan sebagai vektor ganda. ub mewakili batas atas secara elemental dalam lb ≤ x ≤ ub.