首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带quadProg库的约束二次优化

带quadProg库的约束二次优化
EN

Stack Overflow用户
提问于 2015-06-15 09:24:29
回答 1查看 2.6K关注 0票数 2

我有一个长度为A的向量N。另外,我还有N*N矩阵C。我想最大限度地利用以下公式:

代码语言:javascript
复制
minimize (- (w_transpose * A) + p * w_transpose * C * w)

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

我见过一个叫quadProg的包裹。在此,我需要具体说明:

Dmat = Cdvec = Abvec = w

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

我想我可以提供Amat作为一个恒等矩阵,它将使所有的w保持非负。但不确定如何使w规范化(和等于零)。事实上,我以后也可以将它们正常化,但我仍然在想,我是否可以在这里自己做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 19:15:02

您可以使用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。因此,约束的A矩阵(Amatsolve.QP的参数中)是一个恒等矩阵,右边附加了一个向量和一个-1向量,右边的b0 (solve.QP参数中的bvec)是一个附加了1和-1的0向量。

你可以很容易地把它们放在R中:

代码语言:javascript
复制
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
}

您可以在一些简单的二维问题上测试它:

代码语言:javascript
复制
# 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30841622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档