您可以使用solve.QP
quadprog 中的函数执行此操作。从?solve.QP
,我们读到solve.QP
解表系统min_b {-d'b + 0.5 b'Db | A'b >= b0}
。您正在解决形式的问题min_w {-A'w + pw'Cw | w >= 0, 1'w = 1}
。因此,表格之间的映射:
d = A
(这dvec
在 的参数中被调用solve.QP
)
D = 2pC
(这Dmat
在 的参数中被调用solve.QP
)
- 对于第一组约束,您有
I'w >= 0
. 最终的约束可以重新表述为1'w >= 1
和-1'w >= -1
。因此,您的 A 约束矩阵(Amat
在 to 的参数中solve.QP
)是在右侧附加一个 1 向量和一个 -1 向量的单位矩阵,而右侧 b0 (bvec
在 to 的参数中solve.QP
)是具有 1 的 0 向量和 -1 附加。
你可以很容易地将它们放在 R 中:
library(quadprog)
solve.my.QP <- function(A, p, C) {
solve.QP(Dmat=2*p*C,
dvec=A,
Amat=cbind(diag(1, length(A)), rep(1, length(A)), rep(-1, length(A))),
bvec=c(rep(0, length(A)), 1, -1))$solution
}
您可以在一些简单的二维问题上对其进行测试:
# Even penalty
solve.my.QP(c(0, 0), 1, diag(1, 2))
# [1] 0.5 0.5
# Encourage inclusion of first variable
solve.my.QP(c(0.1, 0), 1, diag(1, 2))
# [1] 0.525 0.475