Câu hỏi cũ nhưng vì tôi đang đối mặt với cùng một vấn đề nên tôi nghĩ sẽ đăng 2p của mình ...
Sử dụng lập trình bậc hai theo đề xuất của @Elvis nhưng sử dụng sqlincon từ gói pracma . Tôi nghĩ rằng lợi thế hơn quadrpog::solve.QP
là một giao diện người dùng đơn giản hơn để xác định các ràng buộc. (Trong thực tế, lsqlincon
là một bao bọc xung quanh solve.QP
).
Thí dụ:
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
Kết quả tương tự như của 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 Để cố gắng giải quyết bình luận của gung đây là một số lời giải thích. sqlincon mô phỏng matlab của lsqlin trong đó có một trang trợ giúp tốt đẹp. Đây là các bit có liên quan với một số chỉnh sửa (nhỏ) của tôi:
X
Ma trận số nhân, được chỉ định là ma trận nhân đôi. C đại diện cho cấp số nhân của nghiệm x trong biểu thức C * x - Y. C là M-by-N, trong đó M là số phương trình và N là số phần tử của x.
Y
Vectơ không đổi, được chỉ định là một vectơ nhân đôi. Y đại diện cho thuật ngữ hằng số cộng trong biểu thức C * x - Y. Y là M-by-1, trong đó M là số phương trình.
Aeq
: Ma trận ràng buộc đẳng thức tuyến tính, được chỉ định là ma trận nhân đôi. Aeq đại diện cho các hệ số tuyến tính trong các ràng buộc Aeq * x = beq. Aeq có kích thước Meq-by-N, trong đó Meq là số lượng ràng buộc và N là số phần tử của x
beq
Vectơ ràng buộc tuyến tính, được chỉ định là một vectơ nhân đôi. beq đại diện cho vectơ không đổi trong các ràng buộc Aeq * x = beq. beq có chiều dài Meq, trong đó Aeq là Meq-by-N.
lb
Giới hạn dưới, được chỉ định là một vectơ tăng gấp đôi. lb đại diện cho giới hạn dưới theo phần tử theo lb ≤ x ≤ ub.
ub
Giới hạn trên, được chỉ định là một vectơ đôi. ub đại diện cho giới hạn trên theo phần tử theo lb ≤ x ≤ ub.