Квадратичное программирование CVXPY — ошибка ArpackNoConvergence и AssertionError

Я пытаюсь использовать пакет Python CVXPY для решения квадратичной задачи, но продолжаю получать ошибки. Не могли бы вы помочь мне?

Вот мой код:

p = lasso.p # This is a number
Sigma_opt = lasso.Sigma_opt # This is a positive semi-definite matrix of shape (p,p)
rho_pair = lasso.rho_pair # Vector of shape (p,)
mu = lasso.mu # Positive scalar number.

def solve_2nd_problem(p, Sigma_opt, rho_pair, mu):
  beta = cp.Variable(p) # Variable to optimize
  obj = cp.Minimize(0.5 * cp.quad_form(beta, Sigma_opt) - rho_pair.T @ beta + mu * cp.norm1(beta)) # Objective to minimize
  constraints = [] # Constraints

  # Solve the optimization problem
  prob = cp.Problem(obj, constraints)
  prob.solve()

  return beta.value

beta_opt = solve_2nd_problem(p, Sigma_opt, rho_pair, mu)

Я получаю ArpackNoConvergence: ARPACK error -1: No convergence (11281 iterations, 0/1 eigenvectors converged) [ARPACK error -14: ZNAUPD did not find any eigenvalues to sufficient accuracy.]

Прочитав то, что обсуждалось здесь, я попытался изменить Sigma_opt на cp.psd_wrap(Sigma_opt) и установить cp.settings.EIGVAL_TOL = 1e-06, но при этом теперь получаю эту ошибку:

AssertionError                            Traceback (most recent call last)
<ipython-input-34-1fbde9ad6b58> in <cell line: 19>()
     17   return beta.value
     18 
---> 19 beta_opt = solve_2nd_problem(p, Sigma_opt, rho_pair, mu)

11 frames
/usr/local/lib/python3.9/dist-packages/cvxpy/reductions/complex2real/complex2real.py in canonicalize_expr(self, expr, real_args, imag_args, real2imag, leaf_map)
    179             return result
    180         else:
--> 181             assert all(v is None for v in imag_args)
    182             real_out = expr.copy(real_args)
    183             return real_out, None

AssertionError: 

Я не уверен, хорошо ли я понял, что здесь происходит, но теперь я точно знаю, что моя матрица Sigma_opt — это PSD (поскольку np.all(np.linalg.eigvals(Sigma_opt) > 0) и (Sigma_opt.T == Sigma_opt).all() оба возвращают True).

Матрица Sigma_opt имеет форму (p = 946, p = 946), а rho_pair имеет форму (p = 946).

Вы знаете, как я могу решить эту проблему?

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует проблема, вызванная численной нестабильностью в решателе, используемом CVXPY, он использует решатель SCS, у которого могут быть проблемы с большими или плохо обусловленными задачами, давайте попробуем другой, например, MOSEK или ECOS, который может быть более надежным. .

Сначала установите его

!pip install mosek
!pip install ecos

тогда мы можем изменить solver_2nd_problem вот код:

def solve_2nd_problem(p, Sigma_opt, rho_pair, mu):
    beta = cp.Variable(p) # Variable to optimize
    obj = cp.Minimize(0.5 * cp.quad_form(beta, Sigma_opt) - rho_pair.T @ beta + mu * cp.norm1(beta)) # Objective to minimize
    constraints = [] # Constraints

    # Solve the optimization problem
    prob = cp.Problem(obj, constraints)
    prob.solve(solver=cp.MOSEK, verbose=True)  # Change this to cp.ECOS if you prefer ECOS solver

    return beta.value

Пробовал оба солвера (МОСЕК и ЭКОС), но AssertionError почему-то остается :(. Может быть, можно было бы поделиться матрицей Sigma_opt и вектором rho_pair (не знаю как это сделать)?

Noomkwah 09.04.2023 19:47

В вашей проблеме может быть проблема со сложными значениями, которая вызывает AssertionError, попробуйте проверить, имеют ли какие-либо из ваших входных данных сложные значения или очень маленькие мнимые части, используйте unmpy.real для извлечения реальной части и numpy.imag для извлечения мнимая часть ваших матриц или векторов.

Saxtheowl 09.04.2023 19:59

Хорошо! Мой отец зовет меня на ужин, я попробую сразу после!

Noomkwah 09.04.2023 20:02

ОМГ, это работает!!! Спасибо! Я потратил почти 3 дня на эту проблему :( Я так счастлив, что теперь это работает! Для протокола: я заменил Sigma_opt на cp.psd_wrap(np.real(Sigma_opt)), так как Sigma_opt представил значения типа "2,45 + 0,0j" вместо «2,45».

Noomkwah 09.04.2023 21:13

Добро пожаловать :) и поздравляю с решением вашей проблемы.

Saxtheowl 09.04.2023 21:19

Другие вопросы по теме