Различные версии CVXPY дают разные результаты. - PullRequest
0 голосов
/ 16 ноября 2018

Из-за недостатка знаний о CVXPY у меня возникла проблема с согласованием результатов простой задачи оптимизации при использовании ее различных версий.

Когда я использую CVXPY с версией 0.4.5, я написал мою проблему как:

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]]

Однако, когда я используюCVXPY с версией 1.0.8, я набираю почти такие же коды, как указано ниже:

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])

Единственное отличие, которое я сделал при использовании версии 1.0.8CVXPY заключается в том, что я использую атрибут «nonneg = True» вместо «sign = positive», что, по-моему, является по сути одним и тем же.Может ли кто-нибудь помочь мне здесь?Каковы возможные причины того, что результаты настолько разные?

Большое спасибо

1 Ответ

0 голосов
/ 21 ноября 2018

CVXPY 1.0 использует решатель OSQP для подобных задач, в то время как CVXPY 0.4 использует ECOS. Вот почему результаты отличаются. Но в конечном счете числа, очень близкие к нулю, должны рассматриваться как ноль. Если ваша программа ведет себя иначе, если вывод -1e-12 против 1e-12, вы можете сделать программу менее чувствительной.

...