You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:56