使用CVXPY求解二次规划遇ArpackNoConvergence及AssertionError求助
问题描述
尝试用Python的CVXPY库求解带L1正则的二次规划问题时持续报错,代码如下:
p = lasso.p # 数值类型 Sigma_opt = lasso.Sigma_opt # 形状为(p,p)的半正定矩阵 rho_pair = lasso.rho_pair # 形状为(p,)的向量 mu = lasso.mu # 正标量 def solve_2nd_problem(p, Sigma_opt, rho_pair, mu): beta = cp.Variable(p) # 待优化变量 obj = cp.Minimize(0.5 * cp.quad_form(beta, Sigma_opt) - rho_pair.T @ beta + mu * cp.norm1(beta)) # 最小化目标函数 constraints = [] # 约束条件 # 求解优化问题 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.]
尝试用cp.psd_wrap(Sigma_opt)替换原矩阵,并设置cp.settings.EIGVAL_TOL = 1e-06后,出现AssertionError。
已确认Sigma_opt是正定对称矩阵(np.all(np.linalg.eigvals(Sigma_opt) > 0)和(Sigma_opt.T == Sigma_opt).all()均返回True),维度为(946,946),rho_pair维度为(946,)。
解决方案
指定适配的求解器:CVXPY默认求解器在处理大规模正定矩阵时易出现收敛问题,建议切换到
ECOS或OSQP——这两个求解器对L1正则二次规划的兼容性更强。修改求解代码:# 使用ECOS求解器 prob.solve(solver=cp.ECOS) # 或使用OSQP,可调整最大迭代次数 prob.solve(solver=cp.OSQP, max_iter=100000)修正矩阵数值精度问题:尽管已确认矩阵正定,但浮点误差可能导致极小的负特征值,手动添加小扰动确保严格正定:
epsilon = 1e-8 Sigma_reg = Sigma_opt + epsilon * np.eye(p)之后在目标函数中用
Sigma_reg替代原Sigma_opt,规避CVXPY的正定性校验报错。精准设置特征值校验阈值:不要修改全局
cp.settings.EIGVAL_TOL,而是在二次型构造或求解时局部指定:# 在quad_form中指定阈值 obj = cp.Minimize(0.5 * cp.quad_form(beta, Sigma_opt, eigval_tol=1e-6) - rho_pair.T @ beta + mu * cp.norm1(beta)) # 或在求解时传递参数 prob.solve(eigval_tol=1e-6)预处理矩阵降低计算负担:对正则化后的矩阵做Cholesky分解,将二次型转换为范数形式,减少求解器计算压力:
L = np.linalg.cholesky(Sigma_reg) obj = cp.Minimize(0.5 * cp.norm(L @ beta, 2)**2 - rho_pair.T @ beta + mu * cp.norm1(beta))
内容的提问来源于stack exchange,提问作者Noomkwah
相关产品推荐
相关产品推荐

