r - 使用quadProg库进行约束二次优化

标签 r mathematical-optimization quadprog quadratic-programming

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

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

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

我看到了一个名为quadProg的包。我需要指定:

Dmat = Cdvec = Abvec = w

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

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

最佳答案

您可以使用quadprog 中的solve.QP 函数来完成此操作。从 ?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(在 solve.QP 的参数中称为 dvec)
  • D = 2pC(在 solve.QP 的参数中称为 Dmat)
  • 对于第一组约束,您有 I'w >= 0。最终约束可以重新表述为 1'w >= 1-1'w >= -1。因此,您的约束矩阵(solve.QP 的参数中的 Amat)是单位矩阵,右侧附加一个 1 向量和一个 -1 向量,并且右侧 b0(solve.QP 参数中的 bvec)是附加了 1 和 -1 的 0 向量。

你可以很容易地将它们放在 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

关于r - 使用quadProg库进行约束二次优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841622/

相关文章:

r - 使用 R 中的 Quadprog 包进行投资组合优化中的权重约束

r - 绘制轴和数据框之间的日期不一致

r - 绘制变量随时间的分布 - 累积加法

c++ - 为什么 Cplex 提供了一个松弛约束的解决方案?

numpy - 如何并行化函数 "leastsq"或/和 "curve_fit"

matlab - 如何使用 Matlab 的 quadprog 实现 soft-margin SVM 模型?

ruby - Heroku Rails 应用程序的数据挖掘/统计分析选项?

r - 如何在 R 中使用公式对象

r - Quadprog优化

r - 如何使用R包Quadprog求解SVM?