Я пытаюсь использовать пакет 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).
Вы знаете, как я могу решить эту проблему?
Спасибо.
Существует проблема, вызванная численной нестабильностью в решателе, используемом 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, попробуйте проверить, имеют ли какие-либо из ваших входных данных сложные значения или очень маленькие мнимые части, используйте unmpy.real для извлечения реальной части и numpy.imag для извлечения мнимая часть ваших матриц или векторов.
Хорошо! Мой отец зовет меня на ужин, я попробую сразу после!
ОМГ, это работает!!! Спасибо! Я потратил почти 3 дня на эту проблему :( Я так счастлив, что теперь это работает! Для протокола: я заменил Sigma_opt на cp.psd_wrap(np.real(Sigma_opt)), так как Sigma_opt представил значения типа "2,45 + 0,0j" вместо «2,45».
Добро пожаловать :) и поздравляю с решением вашей проблемы.
Пробовал оба солвера (МОСЕК и ЭКОС), но AssertionError почему-то остается :(. Может быть, можно было бы поделиться матрицей Sigma_opt и вектором rho_pair (не знаю как это сделать)?