5

Suppose my constraint is the product of the first column and third column of the matrix variable is greater than one. How can I implement in CVXPY? Example:

w = Variable(4,3) 

In Matlab, my constraint would be:

w(:,1)'*w(:,3)>1

How can I implement it in CVXPY? Or can we perform dot product under CVXPY? numpy.dot is not supported by CVXPY.

4

3 回答 3

4

如果两个变量都是正的,那么这个集合{x * y > 1}实际上是凸的,而函数x*y既不是凸的也不是凹的。这可以通过查看二阶导数矩阵的特征值来检查

(x*y)'' = 
[[0, 1],
 [1, 0]]

{-1, 1}。矩阵不是正定的,也不是负定的。

有时你可以将问题转化为凸的。在这种情况下,这可以通过取两边的对数来实现:

log(x) + log(y) >= 0

这是一个有效的限制,因为 log(x) 和 log(y) 都是凹函数并且不等式大于或等于。此约束将通过“有纪律的凸规划”规则。祝你好运。

于 2017-07-20T10:58:48.107 回答
3

不可能将两个变量相乘,所有约束都必须是线性的(通常是DCP)。

如果您尝试执行禁止操作,CVXPY 会引发 DCPError。

import cvxpy
x = cvxpy.Variable()
y = cvxpy.Variable()
constraints = [x*y > 1]

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\cvxpy\expressions\expression.py", line 43, in cast_op
    return binary_op(self, other)
  File "C:\Python27\lib\site-packages\cvxpy\expressions\expression.py", line 226, in __mul__
    raise DCPError("Cannot multiply two non-constants.")
cvxpy.error.DCPError: Cannot multiply two non-constants.

如果至少一个变量是整数/布尔值,您可以使用 slack 变量来避免这种情况。否则,您可以使用任何非线性求解器,例如 IPOPT。

同样的问题在这里得到了回答。

于 2017-05-24T12:42:37.697 回答
0

您对 Gram 矩阵 的东北项有严格的不等式约束Q := W.T * W,它是对称的和半正定的。因此,请改为使用 Gram 矩阵Q,然后引入严格的不等式约束Q[0,2] > 1

例如,这是一个零目标的半定规划(SDP):

>>> from cvxpy import *
>>> Q = Semidef(3)
>>> objective = Minimize(0)
>>> constraints = [ Q[0,2] > 1 ]
>>> prob = Problem(objective,constraints)
>>> prob.solve()
0.0
>>> Q.value
matrix([[  2.33101529e+00,   2.57980002e-30,   1.76709537e+00],
        [  2.57980002e-30,   2.57740598e-15,  -2.00304682e-30],
        [  1.76709537e+00,  -2.00304682e-30,   2.33101529e+00]])

请注意,东北入口是1.76709537e+00 > 1. W要从Gram 矩阵恢复矩阵Q,请使用 Cholesky 分解并附加一行零以获得 4 x 3 矩阵,如下所示:

>>> import numpy as np
>>> L = np.linalg.cholesky(Q.value)
>>> W = (np.insert(L, 3, np.array([0,0,0]), axis=1)).T
>>> W
matrix([[  1.52676628e+00,   1.68971508e-30,   1.15741053e+00],
        [  0.00000000e+00,   5.07681591e-08,  -7.79768444e-23],
        [  0.00000000e+00,   0.00000000e+00,   9.95698832e-01],
        [  0.00000000e+00,   0.00000000e+00,   0.00000000e+00]])

让我们验证一下:

>>> W.T * W - Q.value
matrix([[  0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
        [  0.00000000e+00,   0.00000000e+00,   7.00649232e-46],
        [  0.00000000e+00,   7.00649232e-46,   0.00000000e+00]])
于 2018-01-25T13:25:35.677 回答