不同版本的CVXPY产生不同的结果。

时间:2018-11-16 20:35:38

标签: quadratic-programming cvxpy

由于缺乏CVXPY的知识,当使用不同版本的CVXPY时,我在协调一个简单优化问题的结果时遇到问题。

当我使用0.4.5版的CVXPY时,我的问题写为:

import numpy as np
from cvxpy import * 

n = 5
np.random.seed(123)
g1 = np.random.rand(2*n, 1)
H1 = np.eye(2*n)
w = Variable(2*n)
gamma = Parameter(sign="positive")
ret = -g1.T*w
risk = quad_form(w, H1)
prob = Problem(Maximize(ret - gamma*risk), 
               [w >= 0])
gamma.value = 0.5
prob.solve()
res = w.value

和res等于:

 res = [[  2.86653834e-12],
    [  2.47912037e-11],
    [  3.73027873e-11],
    [  7.13532730e-12],
    [  2.31133274e-12],
    [  1.27710498e-11],
    [ -2.50944234e-12],
    [  3.15803733e-12],
    [  9.90353521e-12],
    [  1.46452182e-11]]

但是,当我在1.0.8版中使用CVXPY时,我键入的代码几乎相同,如下所示:

n = 5 
np.random.seed(123)
g1 = np.random.rand(2*n, 1)
H1 = np.eye(2*n)
w = Variable(2*n)
gamma = Parameter(nonneg=True)
ret = -g1.T*w
risk = quad_form(w, H1)
prob = Problem(Maximize(ret - gamma*risk), 
               [w >= 0])
gamma.value = 0.5
prob.solve()
res = w.value

结果是:

(Pdb) res
    array([6.66098380e-25, 2.73633363e-25, 2.16955532e-25, 5.27275998e-25,
   6.88070573e-25, 4.04646723e-25, 9.37904145e-25, 6.54954091e-25,
   4.60002892e-25, 3.75018828e-25])

使用CVXPY版本1.0.8时,我所做的唯一区别是我使用属性“ nonneg = True”而不是“ sign = positive”,我认为它们本质上是相同的。有人可以帮我吗?结果如此不同的可能原因是什么?

非常感谢

1 个答案:

答案 0 :(得分:1)

CVXPY 1.0使用OSQP解算器来解决像您这样的问题,而CVXPY 0.4使用ECOS。这就是为什么结果不同的原因。但是最终非常接近零的数字应视为零。如果输出为-1e-121e-12时,程序的行为有所不同,则您可能希望降低程序的敏感度。