2

A長さのベクトルがありNます。また、私はN*Nマトリックスを持っていCます。次の方程式を最大化したい:

minimize (- (w_transpose * A) + p * w_transpose * C * w)

ここwで、 は length のベクトルで、それぞれが非負であり、すべての合計が 1 でNあるという制約があります。ww

というパッケージを見たことがありますquadProg。そこで指定する必要があります:

Dmat = Cdvec = A、およびbvec = w

しかし、上記の制約をそこに適用する方法がわかりません。

私は、すべての非負Amatを維持する恒等行列を提供できると思います。wしかし、正規化を維持する方法がわかりませんw(合計がゼロに等しい)。実際、後で正規化することもできますが、ここでそれを行うことができるかどうかはまだ疑問です.

4

1 に答える 1

2

solve.QPquadprogの関数を使用してこれを行うことができます。から、次の形式のシステムを解く?solve.QPことが読み取れます。という形の問題を解いています。したがって、フォーム間のマッピング:solve.QPmin_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 >= 01'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
于 2015-06-15T19:15:02.143 に答える