Как установить полуположительный параметр (матрицу) в CVXPY? - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу использовать теплый старт, чтобы проверить, есть ли выигрыш в производительности, установив параметр cvx.Parameter, в то время как я сталкиваюсь с этим:

cvxpy.error.DCPError: Problem does not follow DCP rules.

Мой код здесь:

import time 
import numpy as np
import cvxpy as cvx


m = 300
x = cvx.Variable((m, 1))
p_cov = cvx.Parameter((m, m))
prob = cvx.Problem(cvx.Maximize(-cvx.quad_form(x, p_cov)), [x>=0, cvx.sum(x)==1])

for _ in range(10):
    df_return = np.random.randn(m, m+1)
    cov = np.cov(df_return)
    p_cov.value = cov
    t1 = time.time()
    prob.solve(warm_start=True)
    t2 = time.time()
    print("Solve time:", round(t2-t1, 2))

Я думаю, дело в том, что p_cov должна быть полуположительной матрицей, но я просто не могу ее решить. С нетерпением ждем вашей помощи, спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Ты прав! Вам просто нужно сказать cvxpy, что p_cov является положительным полуопределенным.

p_cov = cvx.Parameter((m, m), PSD=True)

DCP теперь может вычислять правильную природу этого выражения:

cvx.quad_form(x, p_cov)

Что такое:

Expression(CONVEX, NONNEGATIVE, (1, 1))

Вместо:

Expression(UNKNOWN, UNKNOWN, (1, 1))

Дополнительную документацию можно найти в Расширенные функции .

...