오래된 질문이지만 동일한 문제에 직면 한 이후 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은 멋진 도움말 페이지가있는 matlab의 lsqlin 을 에뮬레이트 합니다. 여기에 약간의 사소한 편집 내용이있는 관련 비트가 있습니다.
X
승수 행렬로, double의 행렬로 지정됩니다. C는 C * x-Y 표현식에서 솔루션 x의 승수를 나타냅니다. C는 MxN이며, 여기서 M은 방정식의 수이고 N은 x의 요소 수입니다.
Y
상수 벡터로, double의 벡터로 지정됩니다. Y는 표현식 C * x-Y에서 가산 상수 항을 나타냅니다. Y는 Mx1이며, 여기서 M은 방정식의 수입니다.
Aeq
: 선형 등식 제약 조건 행렬로, double의 행렬로 지정됩니다. Aeq는 제약 조건 Aeq * x = beq의 선형 계수를 나타냅니다. Aeq의 크기는 Meq-by-N입니다. 여기서 Meq는 제약 조건의 수이고 N은 x의 요소 수입니다.
beq
선형 항등 구속 조건 벡터로, double의 벡터로 지정됩니다. beq는 제약 조건 Aeq * x = beq의 상수 벡터를 나타냅니다. beq는 길이 Meq를 가지며, 여기서 Aeq는 Meq-by-N입니다.
lb
하한으로, double의 벡터로 지정됩니다. lb는 하한을 lb ≤ x ≤ ub로 요소 단위로 나타냅니다.
ub
상한으로, double의 벡터로 지정됩니다. ub는 상한을 lb ≤ x ≤ ub로 요소 단위로 나타냅니다.