CVXPY求解标准SVM对偶问题时出现目标函数非DCP错误
解决SVM对偶问题的DCP规则不符合问题
错误原因分析
出现DCPError的核心原因是目标函数的二次项写法不符合CVXPY的DCP规则:CVXPY要求二次型必须通过cp.quad_form明确声明为变量的二次形式,直接用链式矩阵乘法(w.T @ X @ X.T @ w)会导致工具无法正确识别该项的凸性/凹性,从而违反DCP规范。
修正后的代码
先预计算线性核对应的二次型矩阵,再用cp.quad_form重构目标函数:
import cvxpy as cp import numpy as np import pandas as pd # 假设df已加载,n为样本数量 n = len(df) # 预计算y_i*x_i的矩阵 X_mat = np.einsum("j,jk->jk", df["y"].to_numpy(), df[["x1", "x2"]].to_numpy()) # 计算二次型矩阵Q(线性核下为X_mat @ X_mat.T) Q = X_mat @ X_mat.T # 定义变量与参数 w = cp.Variable(n) ones = cp.Parameter(n, value=np.ones(n)) y = cp.Parameter(n, value=df["y"].to_numpy()) # 用cp.quad_form重构符合DCP规则的目标函数 obj = cp.Maximize(-0.5 * cp.quad_form(w, Q) + ones.T @ w) constraints = [ w >= 0, w <= ones, cp.sum(cp.multiply(w, y)) == 0 ] prob = cp.Problem(obj, constraints) prob.solve()
关键修正说明
- 提前计算对称矩阵
Q = X_mat @ X_mat.T,通过cp.quad_form(w, Q)声明二次项,这是CVXPY识别合法二次型的标准方式,完全符合DCP规则。 - 约束中的
cp.sum(cp.multiply(w, y)) == 0与原w.T @ y ==0等价,写法更直观,也能避免潜在的矩阵维度识别问题。 - 线性核下的
Q天然对称,满足cp.quad_form对矩阵的要求,确保二次项的凹性能被CVXPY验证(目标是最大化,二次项需为凹函数)。
内容的提问来源于stack exchange,提问作者Light
相关产品推荐
相关产品推荐

