转换

变换提供了在原子函数之外操作CVXPY对象的额外方式。 虽然原子函数仅对表达式进行操作, 但变换也可以将问题、目标或约束对象作为输入。 变换不需要符合任何特定的API。

SuppFunc

SuppFunc 转换接受一个凸集的隐式表示,该表示基于某个 CVXPY 变量,并返回一个表示该凸集支持函数的函数句柄。当评估该函数句柄时,它会返回一个 SuppFuncAtom 对象。此类对象可以像任何其他 CVXPY 表达式一样用于凸优化建模。

class cvxpy.transforms.suppfunc.SuppFunc(x, constraints)[source]

给定一个包含实数CVXPY变量\(\texttt{x}\)的CVXPY约束对象列表\(\texttt{constraints}\),考虑凸集

\[S = \{ v : \text{it's possible to satisfy all } \texttt{constraints} \text{ when } \texttt{x.value} = v \}.\]

此对象表示\(S\)支持函数。 这是一个凸函数

\[y \mapsto \max\{ \langle y, v \rangle : v \in S \}.\]

支持函数是凸分析中的一个基本对象。 它在使用Fenchel对偶表达对偶问题时非常有用。

Parameters:
x : Variable

此变量不能有任何属性,例如 PSD=True, nonneg=True, symmetric=True 等。

constraints : list[Constraint]

通常,这些是\(\texttt{x}\)的约束,以及一些辅助的CVXPY变量。提供\(\texttt{constraints = []}\)是有效的。

示例

如果 \(\texttt{h = cp.SuppFunc(x, constraints)}\),那么你可以像使用 CVXPY 中的任何其他标量值原子一样使用 \(\texttt{h}\)。例如,如果 \(\texttt{x}\) 是一个 CVXPY 变量,并且 \(\texttt{x.ndim == 1}\),你可以执行以下操作:

z = cp.Variable(shape=(10,))
A = np.random.standard_normal((x.size, 10))
c = np.random.rand(10)
objective =  h(A @ z) - c @ z
prob = cp.Problem(cp.Minimize(objective), [])
prob.solve()

注释

你可以使用除了\(\texttt{x}\)之外的CVXPY变量来定义\(\texttt{constraints}\),但集合\(S\)仅包含与\(\texttt{x}\)形状相同的对象(向量或矩阵)。

支持函数可能对于固定向量 \(\texttt{y}\) 取值为 \(+\infty\)。这是一个重要的点,也是为什么支持函数实际上是用上确界“\(\sup\)”而不是最大值“\(\max\)”正式定义的原因之一。有关支持函数的更多信息,请查看此维基百科页面

__call__(y) SuppFuncAtom[source]

返回一个表示

最大值{ cvxpy.vec(y) @ cvxpy.vec(x) : x 在 S 中 }

其中 S 是与该 SuppFunc 对象关联的凸集。

标量化

scalarize 转换将一组目标转换为单个目标,例如加权和。所有标量化在每个目标上都是单调的,这意味着在标量化目标上进行优化时,总是会返回相对于原始目标列表的帕累托最优点。此外,除了边界点之外,帕累托曲线上的所有点都可以通过给定目标的某种加权来实现。

scalarize.weighted_sum(weights) Minimize | Maximize

将目标组合为加权和。

Parameters:
objectives

最小化/最大化目标的列表。

weights

一个权重向量。

Returns:

最小化/最大化目标。

scalarize.max(weights) Minimize

将目标组合为加权项的最大值。

Parameters:
objectives

最小化/最大化目标的列表。

weights

权重向量。

Returns:

最小化目标。

scalarize.log_sum_exp(weights, gamma: float = 1.0) Minimize

将目标组合为加权项的log_sum_exp。

The objective takes the form

log(sum_{i=1}^n exp(gamma*weights[i]*objectives[i]))/gamma

当 gamma 趋近于 0 时,log_sum_exp 接近 weighted_sum。当 gamma 趋近于无穷大时,log_sum_exp 接近 max。

Parameters:
objectives

最小化/最大化目标的列表。

weights

一个权重向量。

gamma: float = 1.0

参数在加权求和和最大值之间进行插值。

Returns:

最小化目标。

scalarize.targets_and_priorities(priorities, targets, limits=None, off_target: float = 1e-05) Minimize | Maximize

在目标和限制之间的范围内结合目标和惩罚。

对于非负优先级,每个最小化目标 i 的值为

当目标[i]小于目标[i]时,off_target*目标[i]

当 targets[i] <= objectives[i] <= limits[i] 时,(priorities[i]-off_target)*objectives[i]

当 objectives[i] > limits[i] 时,为 +infinity

并且每个最大化目标 i 的值为

当objectives[i]大于targets[i]时,off_target*objectives[i]

当targets[i] >= objectives[i] >= limits[i]时,(priorities[i]-off_target)*objectives[i]

当 objectives[i] < limits[i] 时为 -infinity

负优先级会翻转目标的意义,即我们使用 -objectives[i]、-targets[i] 和 -limits[i] 与 abs(priorities[i])。

Parameters:
objectives

最小化/最大化目标的列表。

priorities

范围内的权重。

targets

惩罚的开始(结束)用于最小化(最大化)

limits=None

最小化(最大化)惩罚的可选硬结束(开始)

off_target: float = 1e-05

目标之外的惩罚。

Returns:

最小化/最大化目标。

Raises:

ValueError – 如果标量化目标既不是凸的也不是凹的。

其他

这里我们列出了其他可用的转换。

class cvxpy.transforms.indicator(constraints: list[Constraint], err_tol: float = 0.001)[source]
An expression representing the convex function I(constraints) = 0

如果约束成立,则为 +infty,否则。

Parameters:
constraints : list

约束对象的列表。

err_tol: float = 0.001

用于确定约束是否成立的数值容差。

transforms.linearize()

返回在变量/参数值处计算的表达式的仿射近似。

为凸(凹)表达式提供元素级别的下(上)界,该界在当前变量/参数值处是紧的。对于非DCP表达式不提供保证。

如果 f 和 g 是凸函数,可以使用下面的凸凹方法实现来(启发式地)最小化目标函数 f - g:

for iters in range(N):
    Problem(Minimize(f - linearize(g))).solve()

如果无法线性化,则返回 None。

Parameters:
expr

一个表达式。

Returns:

一个仿射表达式或无。

partial_optimize.partial_optimize(opt_vars: list[Variable] | None = None, dont_opt_vars: list[Variable] | None = None, solver=None, **kwargs) PartialProblem

在指定的变量上部分优化给定的问题。

必须提供opt_vars或dont_opt_vars。 如果两者都提供,它们必须包含问题中的所有变量。

部分优化对于两阶段优化和图实现非常有用。 例如,我们可以编写

x = Variable(n)
t = Variable(n)
abs_x = partial_optimize(Problem(Minimize(sum(t)),
          [-t <= x, x <= t]), opt_vars=[t])

定义x的逐项绝对值。

Parameters:
prob : Problem

需要部分优化的问题。

opt_vars : list, optional

要优化的变量。

dont_opt_vars : list, optional

不进行优化的变量。

solver : str, optional

用于值和梯度的默认求解器。

kwargs : keywords, optional

额外的求解器特定关键字参数。

Returns:

表示部分优化的表达式。 对于最小化目标是凸的,对于最大化目标是凹的。

Return type:

Expression