【问题标题】:How to take the square root of quad_form output in CVXPY?如何在 CVXPY 中取 quad_form 输出的平方根?
【发布时间】:2018-11-05 11:40:25
【问题描述】:

我正在尝试解决目标函数中涉及\sqrt{w^t \Sigma w} 的问题。为了计算w^t \Sigma w,我使用quad_form 函数。我如何取它的平方根?

在代码中我尝试编写

risk = sqrt(quad_form(w, E))

我收到了 DCP 规则错误,但考虑到我拥有的其他约束,我很确定它是凸的。所以问题不是关于数学,而是凸程序的实际实现。

我要解决的问题是

ret = mu.T*w 
risk = sqrt(quad_form(w, E))
gamma.value = distr.pdf(distr.ppf(alpha)) / (1 - alpha)
minimizer = Minimize(-ret + risk * gamma) #cvxpy.sqrt(risk) * gamma) 
constraints = [w >= 0, 
               b.T * log(w) >= k] 
prob = Problem(minimizer, constraints)
prob.solve(solver='ECOS_BB',verbose=True)

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为它与编程没有直接关系,而是与数学思维方式有关。
  • 是的,目前的问题有点模糊。我增加了一些清晰度

标签: python square-root cvxpy


【解决方案1】:

为了取二次形式的平方根,矩阵Sigma 必须是半正定的。计算一个Cholesky decompositionSigma = Q.T * Q,然后在您的目标函数中包含术语norm(Q*w,2)

【讨论】:

  • 谢谢。我的问题有点含糊。我添加了更多细节。
  • 我在尝试编写 sqrtquad_form 时收到相同的错误消息。我只会使用 Cholesky 分解。
  • 除非我遗漏了一些东西 $w^t Q w$ 与 $\sqrt(w^t \Sigma w)$ 不同。后者甚至在某个区域之外都不是凸的 - 我相信这就是我遇到问题的地方。
  • 请注意,norm(Q*w,2) 只是 2 范数,而不是 2 范数 平方
  • 知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多