คำถามเก่า แต่เนื่องจากฉันประสบปัญหาเดียวกันฉันคิดว่าจะโพสต์ 2p ของฉัน ...
ใช้การเขียนโปรแกรมสมการกำลังสองตามที่ @Elvis แนะนำ แต่ใช้sqlinconจากแพ็คเกจpracma ฉันคิดว่าข้อดีเหนือกว่าquadrpog::solve.QP
คืออินเทอร์เฟซผู้ใช้ที่ง่ายกว่าเพื่อระบุข้อ จำกัด (อันที่จริงแล้วlsqlincon
เป็นเสื้อคลุมรอบsolve.QP
)
ตัวอย่าง:
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:
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
แก้ไขเพื่อพยายามที่จะแก้ไขความคิดเห็นของ gung ต่อไปนี้เป็นคำอธิบายบางอย่าง sqlincon เลียนแบบ lsqlin ของmatlabซึ่งมีหน้าช่วยเหลือที่ดี นี่คือบิตที่เกี่ยวข้องกับการแก้ไขบางส่วน (เล็กน้อย) ของฉัน:
X
ตัวคูณเมทริกซ์ระบุเป็นเมทริกซ์คู่ C แทนตัวคูณของโซลูชัน x ในนิพจน์ C * x - Y. C คือ M-by-N โดยที่ M คือจำนวนของสมการและ N คือจำนวนองค์ประกอบของ x
Y
เวกเตอร์คงที่ที่ระบุเป็นเวกเตอร์ของคู่ Y แทนคำว่าค่าคงที่แบบเพิ่มเติมในนิพจน์ C * x - Y. Y คือ M-by-1 โดยที่ M คือจำนวนของสมการ
Aeq
: เมทริกซ์จำกัดความเท่าเทียมกันเชิงเส้นระบุเป็นเมทริกซ์ของคู่ Aeq แสดงถึงสัมประสิทธิ์เชิงเส้นในข้อ จำกัด Aeq * x = beq Aeq มีขนาด Meq-by-N โดยที่ Meq คือจำนวนข้อ จำกัด และ N คือจำนวนองค์ประกอบของ x
beq
เวกเตอร์ จำกัด ความเท่าเทียมกันเชิงเส้นที่ระบุเป็นเวกเตอร์ของคู่ beq แสดงถึงเวกเตอร์คงที่ในข้อ จำกัด Aeq * x = beq beq มีความยาว Meq โดยที่ Aeq คือ Meq-by-N
lb
ขอบเขตที่ต่ำกว่าซึ่งระบุเป็นเวกเตอร์ของคู่ lb หมายถึงขอบเขตที่ต่ำกว่าตามเข็มนาฬิกาในหน่วยปอนด์≤ x ≤ ub
ub
ขอบเขตบนระบุเป็นเวกเตอร์ของคู่ ub แสดงถึงขอบเขตบนทวนเข็มนาฬิกาในหน่วย lb ≤ x ≤ ub