Старе питання, але оскільки я зіткнувся з тією ж проблемою, я подумав опублікувати 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
Ті ж результати, що і у Елвіса:
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 Щоб спробувати вирішити коментар Гунга, ось кілька пояснень. sqlincon імітує lsqlin matlab, який має гарну сторінку довідки. Ось відповідні біти з деякими (незначними) правками:
X
Матриця множника, задана як матриця парних. C являє собою множник розчину x у виразі C * x - Y. C - M-на-N, де M - кількість рівнянь, а N - кількість елементів x.
Y
Постійний вектор, вказаний як вектор подвійних. Y являє собою аддитивний константний член у виразі C * x - Y. Y є M-на-1, де M - кількість рівнянь.
Aeq
: Лінійна матриця обмеження рівності, задана як матриця парних. Aeq представляє лінійні коефіцієнти в обмеженнях Aeq * x = beq. Aeq має розмір Meq по-N, де Meq - кількість обмежень, а N - кількість елементів x
beq
Лінійний вектор обмеження рівності, вказаний як вектор парних. beq являє собою постійний вектор у обмеженнях Aeq * x = beq. beq має довжину Meq, де Aeq - Meq по-N.
lb
Нижні межі, зазначені як вектор подвійних. lb являє собою нижні межі елементарно в lb ≤ x ≤ ub.
ub
Верхні межі, вказані як вектор подвійних. ub являє собою верхні межі елементарно в фунтах ≤ x ≤ ub.