Почему я получаю ошибку "дисциплинированного выпуклого программирования" при использовании cvxpy? - PullRequest
0 голосов
/ 18 марта 2020
import cvxpy as cp
import numpy as np

n = 3
PP = cp.Variable((n,n),"PP")
KK = [[2,1,3],[1,2,1],[3,1,2]]
s = np.array([[.1, .4, .5]]).T
t = np.array([[.4, .2, .4]]).T
e = np.ones((n,1))
x = PP.T@e - s
y = PP@e - t
for b in range(1,21):
    obj = (1/4/b) * (cp.quad_form(x,KK) + cp.quad_form(y,KK)) - cp.trace(KK@PP) 
    prob = cp.Problem(cp.Minimize(obj),[PP>=0,cp.sum(PP)==1])
    obj=prob.solve()
    print("status:",prob.status)
    print("obj:",obj)
    print(PP.value)

Когда я запускаю это, я получаю

cvxpy.error.DCPError: Problem does not follow DCP rules. Specifically:
The objective is not DCP. Its following subexpressions are not:
QuadForm(PP.T * [[1.]
 [1.]
 [1.]] + -[[0.1]
 [0.4]
 [0.5]], [[2. 1. 3.]
 [1. 2. 1.]
 [3. 1. 2.]])

Я не понимаю, почему я получаю эту ошибку, когда моя матрица KK явно PSD. Почему это происходит?

Дублируйте здесь на https://scicomp.stackexchange.com/q/34657/34383

1 Ответ

1 голос
/ 19 марта 2020

РЕДАКТИРОВАТЬ: я говорил слишком рано. Ваша матрица KK не является PSD (имеет собственное значение -1). Для людей, которые видят эту проблему с матрицей, которая математически должна быть PSD, я оставил свой первоначальный ответ ниже.

Ваша матрица, скорее всего, численно, не совсем PSD, хотя математически это так. Это ограничение для квадроформного атома CVXPY (к которому мы можем обратиться позже).

На данный момент вы можете взять (матричный) квадрат root sqrt_K из K (используя, например, scipy.linalg.sqrtm ) и замените атом quad_form на cp.sum_squares(sqrt_K @ y).

...