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
への引数内solve.QP
) は、右側に 1 ベクトルと -1 ベクトルが追加された恒等行列であり、右側 b0 (bvec
への引数内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
}
いくつかの単純な 2 次元の問題でテストできます。
# 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