В задаче cvxpy нет строгих неравенств, но все равно возникает ошибка. Строгие неравенства не допускаются.

Я использовал библиотеку CVXPY в Python, пытаясь решить конкретную проблему оптимизации.

import cvxpy as cp
import numpy as np
from scipy.stats import norm

(...)

a = cp.Variable([10, 1])

obj = cp.Maximize(sum(norm.logcdf(A @ a, scale=sigma)))
constraints = [a >= np.zeros([10, 1]), a <= np.ones([10, 1])]

prob = cp.Problem(objective=obj, constraints=constraints)

prob.solve()

Здесь A - это конкретная матрица numpy, а сигма - это конкретный скаляр. Когда я пытаюсь решить вопрос, пакет выдает ошибку, указанную ниже.

Traceback (most recent call last):
  File "~\anaconda3/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-23-c554382c1c69>", line 19, in <module>
    obj = cp.Maximize(sum(norm.logcdf(A @ a, scale=sigma)))
  File "~\anaconda3/lib/python3.7/site-packages/scipy/stats/_distn_infrastructure.py", line 1848, in logcdf
    cond1 = self._open_support_mask(x, *args) & (scale > 0)
  File "~\anaconda3/lib/python3.7/site-packages/scipy/stats/_distn_infrastructure.py", line 901, in _open_support_mask
    return (a < x) & (x < b)
  File "~\anaconda3/lib/python3.7/site-packages/cvxpy/expressions/expression.py", line 597, in __gt__
    raise NotImplementedError("Strict inequalities are not allowed.")
NotImplementedError: Strict inequalities are not allowed.

Но сама проблема не содержит строгого неравенства ... Похоже, пакет SCIPY конфликтует с CVXPY, но понятия не имею, как решить ...


person JackAu    schedule 30.05.2020    source источник
comment
Выражения CVXPY, такие как переменная a, нельзя использовать в функциях NumPy или SciPy. Вы должны построить свою функцию цели и ограничения, используя атомы CVXPY.   -  person Akshay Agrawal    schedule 30.05.2020
comment
@AkshayAgrawal Спасибо за вашу помощь. Я понимаю проблему, но не уверен, есть ли в CVXPY атом для функции CDF стандартного нормального распределения.   -  person JackAu    schedule 31.05.2020
comment
CVXPY не имеет атома для CDF стандартного нормального распределения.   -  person steven    schedule 07.06.2020


Ответы (1)


В cvxpy есть norm. Поэтому, пожалуйста, измените, как показано ниже, код:

from scipy.stats import stats
obj = cp.Maximize(sum(stats.logcdf(A @ a, scale=sigma)))

функции

person Mahsa Hassankashi    schedule 30.05.2020
comment
Спасибо за вашу помощь. Я попробовал функцию cp.norm.logcdf, но обнаружил, что logcdf недоступен в cvxpy. В основном я пытался вызвать функцию CDF нормального распределения. - person JackAu; 30.05.2020
comment
Поскольку в cp. Не могли бы вы изменить from scipy.stats import norm на что-нибудь вроде: from scipy.stats import stats? и obj = cp.Maximize(sum(stats.logcdf(A @ a, scale=sigma))) - person Mahsa Hassankashi; 30.05.2020
comment
Привет, Махса, я изменил код, как вы упомянули. Возникает другая ошибка AttributeError: module 'scipy.stats.stats' has no attribute 'logcdf'. - person JackAu; 31.05.2020
comment
Когда у вас есть from scipy.stats import stats, вам просто нужно написать stats.logcdf - person Mahsa Hassankashi; 31.05.2020