2

我有一个A长度向量N。我也有N*N矩阵C。我想最大化以下方程:

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

其中w是一个长度为 的向量N,约束条件是每个w都是非负的,并且所有的总和w为 1。

我见过一个叫quadProg. 那里我需要指定:

Dmat = C, dvec = A, 和bvec = w

但不确定如何在那里应用上述约束。

我想我可以提供Amat一个单位矩阵,它将保持所有w非负数。但不确定如何保持w标准化(总和为零)。实际上我也可以稍后将它们标准化,但我仍然想知道我是否可以在这里自己做。

4

1 回答 1

2

您可以使用solve.QPquadprog 中的函数执行此操作。从?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
于 2015-06-15T19:15:02.143 回答