Ошибка TypeError в CVXPY: аргумент float () должен быть строкой или числом, а не «Неравенство»

1

Все еще играю с CVXPY. На этот раз я получаю интересную ошибку. Давайте посмотрим на этот минимальный код

import cvxpy as cp
import numpy as np

A = np.random.normal(0, 1, (64,6))
b = np.random.normal(0, 1, (64,1))
theta = cp.Variable(shape = (6,1))

prob = cp.Problem(
    cp.Minimize(cp.max(A*theta -b) <= 5),
    [-10 <= theta, theta <= 10])

После компиляции я получаю следующую ошибку:

~\Anaconda3\lib\site-packages\cvxpy\expressions\constants\constant.py in init(self, value) 42 self._sparse = True 43 else: ---> 44 self._value = intf.DEFAULT_INTF.const_to_matrix(value) 45 self._sparse = False 46 self._imag = None

~\Anaconda3\lib\site-packages\cvxpy\interface\numpy_interface\ndarray_interface.py in const_to_matrix(self, value, convert_scalars) 48 return result 49 else: ---> 50 return result.astype(numpy.float64) 51 52 # Return an identity matrix.

TypeError: float() argument must be a string or a number, not 'Inequality'

0
1

Я не знаю, что именно вы хотите смоделировать, но вот кое-что, что работает:

import cvxpy as cp
import numpy as np

A = np.random.normal(0, 1, (64,6))
b = np.random.normal(0, 1, (64,1))
theta = cp.Variable(shape = (6,1))

prob = cp.Problem(
            cp.Minimize(cp.sum(theta)),  # what do you want to minimize?
            [
                cp.max(A*theta -b) <= 5,
                -10 <= theta,
                theta <= 10
            ]
        )

работает и должен показать проблему.

Я бы предпочел более чистый вариант, например:

import cvxpy as cp
import numpy as np

A = np.random.normal(0, 1, (64,6))
b = np.random.normal(0, 1, (64,1))
theta = cp.Variable(shape = (6,1))

obj = cp.Minimize(cp.sum(theta))          # what do you want to minimize?
                                          # feasibility-problem? -> use hardcoded constant: cp.Minimize(0)
constraints = [
    cp.max(A*theta -b) <= 5,
    -10 <= theta,
    theta <= 10
]

prob = cp.Problem(obj, constraints)

Причина: легче прочитать, что именно происходит.

Ваша проблема: у вашей цели есть ограничение, что невозможно.

import cvxpy as cp
import numpy as np

A = np.random.normal(0, 1, (64,6))
b = np.random.normal(0, 1, (64,1))
theta = cp.Variable(shape = (6,1))

prob = cp.Problem(
cp.Minimize(cp.max(A*theta -b) <= 5),  # first argument = objective
                                       # -> minimize (constraint) : impossible!
    [-10 <= theta, theta <= 10])       # second argument = constraints
                                       # -> box-constraints

Короче говоря:

  • вы хотите минимизировать функцию
  • вы делаете минимизировать неравенство

К комментарию ниже:

редактировать

obj = cp.Minimize(cp.max(cp.abs(A*theta-b)))

Небольшой чек:

print((A*theta-b).shape)
(64, 1)
print((cp.abs(A*theta-b)).shape)
(64, 1)

Поэлементный пресс: хорошо

Конечный внешний maxрезультат дает одно значение, иначе cp.Minimizeего не примут. хороший

РЕДАКТИРОВАТЬ Или давайте сделаем cvxpy и нас более счастливыми:

obj = cp.Minimize(cp.norm(A*theta-b, "inf"))
5
  • Спасибо! На самом деле я хочу минимизировать максимумы модулей вектора $ A \ theta - b $. 18 дек '19 в 22:14
  • Я хочу минимизировать чебышевскую норму вектора. en.wikipedia.org/wiki/Chebyshev_distance 18 дек '19 в 22:17
  • ( тупой комментарий: -D, пожалуйста, проигнорируйте) Я должен признать, что я приближаюсь к некоторому пределу здесь, поскольку я не очень знаком с этой нормой. minimise the maxima of absolute values of the vectorименно для меня min l1-norm(vector). Или не?
    sascha
    18 дек '19 в 22:20
  • Это l_infty-норма (l1 - это сумма абсолютных значений). 18 дек '19 в 22:21
  • Ага, извини. Дай мне немного подумать о твоем.
    sascha
    18 дек '19 в 22:21