首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除库CVXR中的DCP错误?

如何消除库CVXR中的DCP错误?
EN

Stack Overflow用户
提问于 2021-03-15 08:49:15
回答 1查看 164关注 0票数 0

我试着用CVXR软件包建立简单的短期销售投资组合模型。下面是众所周知的目标函数(预期收益减去预期收益的sd与已知的teta).但R返回如下:“construct_intermediate_chain中的错误(object,candidate_solvers,gp = gp):问题不遵循DCP规则。”我试图在下面的代码中修复这个问题,但是没有什么有用的。同样,这种类型的obj函数是凹形的。同时,还可以方便地生成凸函数和求最小值。错误在这种情况下也不会消失。请您解释一下错误在哪里,可能的解决方案是什么。

代码语言:javascript
复制
library(CVXR)
n = 3
w = Variable(n)
c = matrix(1, nrow = 3, ncol = 3)
mu = matrix(1, ncol = 3, nrow = 1)

m1 = rnorm(100)
m2 = rnorm(100)
m3 = rnorm(100)
mu[1, 1] = mean(m1)
mu[1, 2] = mean(m2)
mu[1, 3] = mean(m3)

c[1, 2] = cov(m1, m2)
c[1, 3] = cov(m1, m3)
c[2, 1] = cov(m1, m2)
c[2, 3] = cov(m2, m3)
c[3, 1] = cov(m1, m3)
c[3, 2] = cov(m2, m3)
c[1, 1] = cov(m1, m1)
c[2, 2] = cov(m2, m2)
c[3, 3] = cov(m3, m3)

teta = 0.5
obj1 =  mu %*% w - teta * sqrt(quad_form(w, c))
constr <- list(sum(w) == 1)
pro <- Problem(Maximize((obj)), constr)
sol <- solve(pro)
sol$w
EN

回答 1

Stack Overflow用户

发布于 2021-10-06 22:42:18

问题是sqrt(quad_form(w, c)):CVXR并不认为它是凸的,尽管它是凸的。您需要计算矩阵c的Cholesky分解,并使用Frobenius范数中的上三角。它相当于sqrt(quad_form(w, c))

我是说,所以

u = chol(c)

  • In

  • 计算c的Cholesky分解并得到上三角:norm(u %*% w, "2")

obj1将四边形的平方根替换为norm(u %*% w, "2")

要获得优化后的解决方案,必须使用sol$getValue(w)

您的代码已更新:

代码语言:javascript
复制
> library(CVXR)
> n = 3
> w = Variable(n)
> c = matrix(1, nrow = 3, ncol = 3)
> mu = matrix(1, ncol = 3, nrow = 1)
> 
> m1 = rnorm(100)
> m2 = rnorm(100)
> m3 = rnorm(100)
> mu[1, 1] = mean(m1)
> mu[1, 2] = mean(m2)
> mu[1, 3] = mean(m3)
> 
> c[1, 2] = cov(m1, m2)
> c[1, 3] = cov(m1, m3)
> c[2, 1] = cov(m1, m2)
> c[2, 3] = cov(m2, m3)
> c[3, 1] = cov(m1, m3)
> c[3, 2] = cov(m2, m3)
> c[1, 1] = cov(m1, m1)
> c[2, 2] = cov(m2, m2)
> c[3, 3] = cov(m3, m3)
> 
> teta = 0.5
> u = chol(c)
> obj1 =  mu %*% w - teta * norm(u %*% w, "2")
> constr <- list(sum(w) == 1)
> pro <- Problem(Maximize((obj1)), constr)
> sol <- solve(pro)
> sol$getValue(w)

这就是我查到的:

代码语言:javascript
复制
 > sol$getValue(w)
            [,1]
[1,] -0.07160006
[2,]  0.44897448
[3,]  0.62261508
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66634862

复制
相关文章

相似问题

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