使用CVXPY编写凸优化代码报DCP规则不匹配错误如何解决
CVXPY DCP报错解决方案
错误原因
你遇到的Problem does not follow DCP rules报错,核心原因是二次型表达式写法不符合CVXPY的凸性识别规范:
即使A为半正定矩阵,CVXPY也无法自动识别手动拼接的cp.matmul(z.T,cp.matmul(A, z))的凸性,必须使用CVXPY内置的二次型构造函数cp.quad_form(),它会自动根据参数矩阵的正定性判断表达式的凸凹性,符合DCP规则要求。
修正后的代码
只需要修改目标函数中的二次型部分即可,完整可运行代码如下:
import numpy as np import cvxpy as cp d = 10 # 生成半正定矩阵,你的构造方法正确 A = np.random.rand(d, d) A = np.dot(A.transpose(),A) lmbd = 0.1 z = cp.Variable(d) s = np.random.randn(d) # 仅修改二次型写法为cp.quad_form objective = cp.Minimize(lmbd**2 * cp.quad_form(z, A) - lmbd*cp.matmul(z.T, s)) constraint = [cp.sum(z) == 1, z >= 0] prob = cp.Problem(objective, constraint) print("Optimal value", prob.solve()) print("Optimal var", z.value)
补充说明
cp.quad_form(x, P)是CVXPY专门用来构造x^T P x表达式的API,当P为半正定时,该表达式会被识别为凸函数,满足极小化问题的DCP要求- 你当前构造半正定矩阵A的方法是正确的,不需要额外修改
内容的提问来源于stack exchange,提问作者faruk
相关产品推荐
相关产品推荐

