文章目录
- 介绍
- 使用步骤
- 示例1
- 示例2
- 官方文档
介绍
它是一个基于 Python 的凸优化建模工具,专门用于定义和求解 凸优化问题(Convex Optimization Problems)。CVXPY 提供了一种直观的方式来表达优化问题,并通过高效的求解器来解决这些问题。
CVXPY 的设计灵感来源于 MATLAB 的凸优化工具包 CVX,但它是专门为 Python 开发的,具有更强的灵活性和扩展性。
使用步骤
CVXPY 的核心是以下几个步骤:
- 定义变量:使用 cvxpy.Variable 定义优化变量。
- 定义目标函数:用数学表达式定义目标函数。
- 定义约束条件:用数学表达式定义约束条件。
- 求解问题:使用 problem.solve() 方法求解问题。
1. 变量类型
标量变量:x = cp.Variable()
向量变量:x = cp.Variable(n)
矩阵变量:X = cp.Variable((m, n))
带约束的变量:x = cp.Variable(nonneg=True)(非负变量)
2.目标函数
最大化:cp.Maximize(expression)
最小化:cp.Minimize(expression)
3.约束条件
使用 Python 的逻辑表达式定义,例如:x + y <= 4,x >= 0。
4.求解器
默认情况下,CVXPY 会自动选择合适的求解器。
可以指定求解器,例如:problem.solve(solver=cp.SCS)
。
常用求解器包括:
- SCS(默认)
- ECOS
- OSQP
- GUROBI(需要安装 Gurobi)
5. 高级功能
- 二次规划(QP)
- 半定规划(SDP)
- 混合整数规划(MIP)
- 参数化优化问题
示例1
import cvxpy as cp
# 定义变量
x = cp.Variable()
y = cp.Variable()
# 定义目标函数
objective = cp.Maximize(3 * x + 2 * y)
# 定义约束条件
constraints = [
x + y <= 4,
x - y >= 1,
x >= 0,
y >= 0
]
# 定义优化问题
problem = cp.Problem(objective, constraints)
# 求解问题
result = problem.solve()
# 输出结果
print("Optimal value:", result)
print("Optimal x:", x.value)
print("Optimal y:", y.value)
#Optimal value: 11.999999998820272
#Optimal x: 4.0000000000334826
#Optimal y: -6.400876322454488e-10
示例2
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
# Problem data.
n = 15
m = 10
np.random.seed(1)
A = np.random.randn(n, m)
b = np.random.randn(n)
# gamma must be nonnegative due to DCP rules.
gamma = cp.Parameter(nonneg=True)
# Construct the problem.
x = cp.Variable(m)
error = cp.sum_squares(A @ x - b)
obj = cp.Minimize(error + gamma*cp.norm(x, 1))
prob = cp.Problem(obj)
# Construct a trade-off curve of ||Ax-b||^2 vs. ||x||_1
sq_penalty = []
l1_penalty = []
x_values = []
gamma_vals = np.logspace(-4, 6)
for val in gamma_vals:
gamma.value = val
prob.solve()
# Use expr.value to get the numerical value of
# an expression in the problem.
sq_penalty.append(error.value)
l1_penalty.append(cp.norm(x, 1).value)
x_values.append(x.value)
plt.rc('text', usetex=True)
plt.rc('font', family='serif')
plt.figure(figsize=(6,10))
# Plot trade-off curve.
plt.subplot(211)
plt.plot(l1_penalty, sq_penalty)
plt.xlabel(r'$\|x\|_1$', fontsize=16)
plt.ylabel(r'$\|Ax-b\|^2$', fontsize=16)
plt.title('Trade-Off Curve for LASSO', fontsize=16)
# Plot entries of x vs. gamma.
plt.subplot(212)
for i in range(m):
plt.plot(gamma_vals, [xi[i] for xi in x_values])
plt.xlabel(r'$\gamma$', fontsize=16)
plt.ylabel(r'$x_{i}$', fontsize=16)
plt.xscale('log')
plt.title(r'Entries of x vs. $\gamma$', fontsize=16)
plt.tight_layout()
plt.show()
官方文档
https://www.cvxpy.org/