cvxpy .solve () с решателем OSQP завершается с ошибкой «достигнуто максимальное количество итераций» в учебном коде - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь использовать cvxpy. Я установил версию 1.1.0a1 в мою среду conda, используя pip, и клонировал репозиторий cvxpy github . При попытке запустить их пример SVN jupyter notebook , prob.solve() выдает следующее сообщение об ошибке:

SolverError: Ошибка решателя OSQP. Попробуйте другой решатель или решите с verbose = True для получения дополнительной информации.

Установка verbose=True и добавление некоторых операторов печати показывает, что решатель завершается с

status:               maximum iterations reached
number of iterations: 10000
run time:             1.07e+00s
optimal rho estimate: 2.03e-01

для параметра регуляризацииLambda = 0.010974987654930561, в то время как параметр Lambda = 0.010476157527896646 дает результат

status:               solved inaccurate
number of iterations: 10000
optimal objective:    0.8437
run time:             1.06e+00s
optimal rho estimate: 1.68e-01

Поскольку это "официальный" пример кода, я предполагаю, что моя проблема в какой-то форме неожиданного взаимодействия с другими пакетами, но я недаже не знаю, где начать искать.

1 Ответ

0 голосов
/ 14 ноября 2019

Я запустил пример SVM на своей машине и получил ту же ошибку, что и вы. Похоже, нам нужно обновить его.

В вашей установке все в порядке. Решатели (т. Е. Численные алгоритмы, которые решают проблемы, построенные с помощью CVXPY) могут иногда терпеть неудачу, даже когда проблема совместима с DCP. Часто решающие устройства терпят неудачу, когда числовые данные очень велики или очень малы, что может привести к так называемым плохо обусловленным проблемным данным. Некоторые решатели более надежны, чем другие.

В этом случае я могу успешно запустить пример с помощью решателя ECOS (prob.solve(solver=cp.ECOS)) (ECOS версии 2.0.4, CVXPY 1.0.25).

В более общем случае при сбое решателя можно попробовать выполнить следующие действия:

  1. Попробуйте другой решатель.
  2. Вызвать метод решения с помощью verbose=True (prob.solve(verbose=True)). Это должно вывести подробное сообщение об ошибке, помогающее определить причину сбоя решателя.
  3. Передать специфичные для решателя опции в решатель (например, увеличить максимальное число итераций).
...