原子函数¶
本教程的这一部分描述了可以应用于CVXPY表达式的原子函数。CVXPY使用本节中的函数信息和DCP规则来标记表达式的符号和曲率。
操作符¶
中缀运算符 +, -, *, /, @ 被视为函数。运算符 + 和
- 始终是仿射函数。表达式 expr1*expr2 在
CVXPY 中当其中一个表达式是常数时是仿射的,而 expr1/expr2 是仿射的
当 expr2 是一个标量常数时。
历史上,CVXPY 使用 expr1 * expr2 来表示矩阵乘法。
现在这种做法已被弃用。从 Python 3.5 开始,用户可以写
expr1 @ expr2 来表示矩阵乘法和点积。
从 CVXPY 1.1 版本开始,我们采用了一个新的标准:
@应该用于矩阵-矩阵和矩阵-向量的乘法,*应该是矩阵-标量和向量-标量乘法
元素乘法可以使用multiply函数来应用。
索引和切片¶
CVXPY 中的索引遵循与 NumPy ndarrays 完全相同的语义。
例如,如果 expr 的形状为 (5,),那么 expr[1] 将给出第二个条目。
更一般地,expr[i:j:k] 选择 expr 的每第 k 个元素,从 i 开始,到 j-1 结束。
如果 expr 是一个矩阵,那么 expr[i:j:k] 选择行,
而 expr[i:j:k, r:s:t] 同时选择行和列。
索引会减少维度,而切片会保留维度。
例如,
x = cvxpy.Variable(5)
print("0 dimensional", x[0].shape)
print("1 dimensional", x[0:1].shape)
O dimensional: ()
1 dimensional: (1,)
转置¶
任何表达式的转置都可以使用语法
expr.T 获得。转置是一个仿射函数。
功率¶
对于任何CVXPY表达式expr,幂运算符expr**p等同于函数power(expr, p)。
标量函数¶
标量函数接受一个或多个标量、向量或矩阵作为参数,并返回一个标量。
函数 |
意义 |
领域 |
DCP 属性 |
曲率 |
|---|---|---|---|---|
平均值为 \((1-\beta)\) 在 \(x\) 中最大值的比例 |
\(x \in \mathbf{R}^m\) \(\beta \in (0,1)\) |
符号取决于 \(x\) |
||
|
常数 \(W \in \mathbf{R}^{o \times p}\) |
\(\text{点积}\) \(\operatorname{sort}\operatorname{vec}(X) \text{ 和}\) \(\operatorname{sort}\operatorname{vec}(W)\) |
\(X \in \mathbf{R}^{m \times n}\) |
符号取决于 \(X\) 和 \(W\) |
|
|
\(p \in \mathbf{R}^n_{+}\) \(p \neq 0\) |
\(x_1^{1/n} \cdots x_n^{1/n}\) \(\left(x_1^{p_1} \cdots x_n^{p_n}\right)^{\frac{1}{\mathbf{1}^T p}}\) |
\(x \in \mathbf{R}^n_{+}\) |
||
\(\frac{n}{\frac{1}{x_1} + \cdots + \frac{1}{x_n}}\) |
\(x \in \mathbf{R}^n_{+}\) |
|||
\((x_1\cdots x_n)^{-1}\) |
\(x \in \mathbf{R}^n_+\) |
|||
\(\lambda_{\max}(X)\) |
\(X \in \mathbf{S}^n\) |
|||
\(\lambda_{\min}(X)\) |
\(X \in \mathbf{S}^n\) |
|||
|
\(k = 1,\ldots, n\) |
\(\text{sum of $k$ largest}\) \(\text{eigenvalues of $X$}\) |
\(X \in\mathbf{S}^{n}\) |
||
|
\(k = 1,\ldots, n\) |
\(\text{sum of $k$ smallest}\) \(\text{eigenvalues of $X$}\) |
\(X \in\mathbf{S}^{n}\) |
||
\(\log \left(\det (X)\right)\) |
\(X \in \mathbf{S}^n_+\) |
|||
\(\log \left(\sum_{ij}e^{X_{ij}}\right)\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(x^T P^{-1} x\) |
\(x \in \mathbf{R}^n\) \(P \in\mathbf{S}^n_{++}\) |
|||
\(\max_{ij}\left\{ X_{ij}\right\}\) |
\(X \in\mathbf{R}^{m \times n}\) |
与X同号 |
||
\(\frac{1}{m n}\sum_{ij}\left\{ X_{ij}\right\}\) |
\(X \in\mathbf{R}^{m \times n}\) |
与X同号 |
||
\(\min_{ij}\left\{ X_{ij}\right\}\) |
\(X \in\mathbf{R}^{m \times n}\) |
与X同号 |
||
|
\(Y = \left(\sum_l\lvert x_{k,l}\rvert^p\right)\) |
\(\left(\sum_k Y^{q/p}\right)^{1/q}\) |
\(X \in\mathbf{R}^{n \times n}\) |
||
|
norm(x, 2) |
\(\sqrt{\sum_{i} \lvert x_{i} \rvert^2 }\) |
\(X \in\mathbf{R}^{n}\) |
||
\(\sum_{i}\lvert x_{i} \rvert\) |
\(x \in\mathbf{R}^{n}\) |
|||
\(\max_{i} \{\lvert x_{i} \rvert\}\) |
\(x \in\mathbf{R}^{n}\) |
|||
\(\sqrt{\sum_{ij}X_{ij}^2 }\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(\max_{j} \|X_{:,j}\|_1\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(\max_{i} \|X_{i,:}\|_1\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(\mathrm{tr}\left(\left(X^T X\right)^{1/2}\right)\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
|
norm(X, 2) |
\(\sqrt{\lambda_{\max}\left(X^T X\right)}\) |
\(X \in\mathbf{R}^{m \times n}\) |
||
\(sf(x/s)\) |
\(x \in \mathop{\bf dom} f\) \(s \geq 0\) |
与f同号 |
与 \(f\) 相同 |
|
|
\(p \geq 1\) 或 |
\(\left(\sum_{ij} |X_{ij}|^p \right)^{1/p}\) |
\(X \in \mathbf{R}^{m \times n}\) |
||
|
\(p < 1\), \(p \neq 0\) |
\(\left(\sum_{ij} X_{ij}^p \right)^{1/p}\) |
\(X \in \mathbf{R}^{m \times n}_+\) |
||
\(\max_{ij} X_{ij}\) \(- \min_{ij} X_{ij}\) |
\(X \in \mathbf{R}^{m \times n}\) |
|||
|
常数 \(P \in \mathbf{S}^n_+\) |
\(x^T P x\) |
\(x \in \mathbf{R}^n\) |
||
|
常数 \(P \in \mathbf{S}^n_-\) |
\(x^T P x\) |
\(x \in \mathbf{R}^n\) |
||
|
常数 \(c \in \mathbf{R}^n\) |
\(c^T X c\) |
\(X \in\mathbf{R}^{n \times n}\) |
符号取决于 c, X 单调性取决于c |
|
\(\left(\sum_{ij}X_{ij}^2\right)/y\) |
\(x \in \mathbf{R}^n\) \(y > 0\) |
|||
类似于 numpy.std |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(\sum_{ij}X_{ij}\) |
\(X \in\mathbf{R}^{m \times n}\) |
与X同号 |
||
|
\(k = 1,2,\ldots\) |
\(\text{sum of } k\text{ largest }X_{ij}\) |
\(X \in\mathbf{R}^{m \times n}\) |
与X同号 |
|
|
\(k = 1,2,\ldots\) |
\(\text{sum of } k\text{ smallest }X_{ij}\) |
\(X \in\mathbf{R}^{m \times n}\) |
与X同号 |
|
\(\sum_{ij}X_{ij}^2\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(\mathrm{tr}\left(X \right)\) |
\(X \in\mathbf{R}^{n \times n}\) |
与X同号 |
||
\(\mathrm{tr}\left(X^{-1} \right)\) |
\(X \in\mathbf{S}^n_{++}\) |
|||
\(\sum_{i}|x_{i+1} - x_i|\) |
\(x \in \mathbf{R}^n\) |
|||
tv(X) \(Y = \left[\begin{matrix} X_{i+1,j} - X_{ij} \\ X_{i,j+1} -X_{ij} \end{matrix}\right]\) |
\(\sum_{ij}\left\| Y \right\|_2\) |
\(X \in \mathbf{R}^{m \times n}\) |
||
tv([X1,…,Xk]) \(Y = \left[\begin{matrix} X_{i+1,j}^{(1)} - X_{ij}^{(1)} \\ X_{i,j+1}^{(1)} -X_{ij}^{(1)} \\ \vdots \\ X_{i+1,j}^{(k)} - X_{ij}^{(k)} \\ X_{i,j+1}^{(k)} -X_{ij}^{(k)} \end{matrix}\right]\) |
\(\sum_{ij}\left\| Y \right\|_2\) |
\(X^{(i)} \in\mathbf{R}^{m \times n}\) |
||
类似于 numpy.var |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(-\operatorname{tr}(X\operatorname{logm}(X))\) |
\(X \in \mathbf{S}^{n}_+\) |
标量函数的澄清¶
域 \(\mathbf{S}^n\) 指的是对称矩阵的集合。域 \(\mathbf{S}^n_+\) 和 \(\mathbf{S}^n_-\) 分别指的是半正定矩阵和半负定矩阵的集合。同样地,\(\mathbf{S}^n_{++}\) 和 \(\mathbf{S}^n_{--}\) 分别指的是正定矩阵和负定矩阵的集合。
对于一个向量表达式 x,norm(x) 和 norm(x, 2) 给出欧几里得范数。然而,对于一个矩阵表达式 X,norm(X) 和 norm(X, 2) 给出谱范数。
函数 norm(X, "fro") 被称为 Frobenius 范数,
而 norm(X, "nuc") 被称为 核范数。核范数也可以定义为 X 的奇异值之和。
函数 max 和 min 分别给出单个表达式中的最大和最小项。这些函数不应与 maximum 和 minimum 混淆(参见 Elementwise functions)。使用 maximum 和 minimum 来查找标量表达式列表的最大值或最小值。
CVXPY函数sum用于对单个表达式中的所有条目进行求和。内置的Python sum应该用于将表达式列表相加。例如,以下代码对三个表达式的列表进行求和:
expr_list = [expr1, expr2, expr3]
expr_sum = sum(expr_list)
沿轴函数¶
函数 sum, norm, max, min, mean, std, var, 和 ptp 可以沿着一个轴应用。
给定一个 m 乘 n 的表达式 expr,语法 func(expr, axis=0, keepdims=True) 将 func 应用于每一列,返回一个 1 乘 n 的表达式。
语法 func(expr, axis=1, keepdims=True) 将 func 应用于每一行,返回一个 m 乘 1 的表达式。
默认情况下 keepdims=False,这意味着长度为 1 的维度会被丢弃。
例如,以下代码对矩阵变量的列和行进行求和:
X = cvxpy.Variable((5, 4))
col_sums = cvxpy.sum(X, axis=0, keepdims=True) # Has size (1, 4)
col_sums = cvxpy.sum(X, axis=0) # Has size (4,)
row_sums = cvxpy.sum(X, axis=1) # Has size (5,)
逐元素函数¶
这些函数对其参数的每个元素进行操作。例如,如果X是一个5行4列的矩阵变量,
那么abs(X)就是一个5行4列的矩阵表达式。abs(X)[1, 2]等同于abs(X[1, 2])。
接受多个参数的逐元素函数,例如maximum和multiply,对每个参数的相应元素进行操作。
例如,如果X和Y都是3乘3的矩阵变量,那么maximum(X, Y)是一个3乘3的矩阵表达式。
maximum(X, Y)[2, 0]等同于maximum(X[2, 0], Y[2, 0])。这意味着所有参数必须具有相同的维度或者是标量,标量会被提升。
函数 |
意义 |
领域 |
DCP 属性 |
曲率 |
|---|---|---|---|---|
\(\lvert x \rvert\) |
\(x \in \mathbf{C}\) |
|||
复共轭 |
\(x \in \mathbf{C}\) |
|||
\(-x \log (x)\) |
\(x > 0\) |
|||
\(e^x\) |
\(x \in \mathbf{R}\) |
|||
|
\(M \geq 0\) |
\(\begin{cases}x^2 &|x| \leq M \\2M|x| - M^2&|x| >M\end{cases}\) |
\(x \in \mathbf{R}\) |
||
复数的虚部 |
\(x \in \mathbf{C}\) |
|||
\(1/x\) |
\(x > 0\) |
|||
\(x \log(x/y) - x + y\) |
\(x > 0\) \(y > 0\) |
|||
\(\log(x)\) |
\(x > 0\) |
|||
approximate 标准正态CDF的对数 |
\(x \in \mathbf{R}\) |
|||
\(\log(x+1)\) |
\(x > -1\) |
与x同号 |
||
\(x > 0\) |
||||
\(\log(1 + e^{x})\) |
\(x \in \mathbf{R}\) |
|||
\(\max \left\{x, y\right\}\) |
\(x,y \in \mathbf{R}\) |
符号取决于x,y |
||
\(\min \left\{x, y\right\}\) |
\(x, y \in \mathbf{R}\) |
符号取决于x,y |
||
|
\(c \in \mathbf{R}\) |
c*x |
\(x \in\mathbf{R}\) |
\(\mathrm{sign}(cx)\) 单调性取决于c |
|
\(\max \left\{-x, 0 \right\}\) |
\(x \in \mathbf{R}\) |
|||
\(\max \left\{x, 0 \right\}\) |
\(x \in \mathbf{R}\) |
|||
\(1\) |
\(x \in \mathbf{R}\) |
常量 |
||
\(x\) |
\(x \in \mathbf{R}\) |
与x同号 |
||
|
\(p = 2, 4, 8, \ldots\) |
\(x^p\) |
\(x \in \mathbf{R}\) |
||
|
\(p < 0\) |
\(x^p\) |
\(x > 0\) |
||
|
\(0 < p < 1\) |
\(x^p\) |
\(x \geq 0\) |
||
|
\(p > 1,\ p \neq 2, 4, 8, \ldots\) |
\(x^p\) |
\(x \geq 0\) |
||
复数的实部 |
\(x \in \mathbf{C}\) |
|||
\(x \log(x/y)\) |
\(x > 0\) \(y > 0\) |
|||
|
\(\text{alpha} \geq 0\) \(\text{beta} \geq 0\) |
\(\alpha\mathrm{pos}(x)+ \beta\mathrm{neg}(x)\) |
\(x \in \mathbf{R}\) |
||
\(\sqrt x\) |
\(x \geq 0\) |
|||
\(x^2\) |
\(x \in \mathbf{R}\) |
|||
\(x e^x\) |
\(x \geq 0\) |
关于逐元素函数的说明¶
函数 log_normcdf 和 loggamma 是通过近似定义的。log_normcdf 在 -4 到 4 的范围内具有最高的精度,
而 loggamma 在所有正实数上具有相似的精度。
有关近似的详细信息,请参见 CVXPY GitHub PR #1224
和 CVXPY GitHub Issue #228。
向量/矩阵函数¶
向量/矩阵函数接受一个或多个标量、向量或矩阵作为参数,并返回一个向量或矩阵。
CVXPY 在确定由这些函数返回的表达式的符号时是保守的。 如果这些函数的任何参数具有未知符号,则返回的表达式也将具有未知符号。 如果所有参数都具有已知符号,但 CVXPY 可以确定返回的表达式在不同条目中会有不同的符号(例如,当堆叠一个正表达式和一个负表达式时),则返回的表达式将具有未知符号。
函数 |
意义 |
领域 |
曲率 |
单调性 |
|---|---|---|---|---|
\(\left[\begin{matrix} X^{(1,1)} & \cdots & X^{(1,q)} \\ \vdots & & \vdots \\ X^{(p,1)} & \cdots & X^{(p,q)} \end{matrix}\right]\) |
\(X^{(i,j)} \in\mathbf{R}^{m_i \times n_j}\) |
|||
|
\(c\in\mathbf{R}^m\) |
\(c*x\) |
\(x\in \mathbf{R}^n\) |
依赖于c |
|
沿给定轴的累积和。 |
\(X \in \mathbf{R}^{m \times n}\) |
|||
\(\left[\begin{matrix}x_1 & & \\& \ddots & \\& & x_n\end{matrix}\right]\) |
\(x \in\mathbf{R}^{n}\) |
|||
\(\left[\begin{matrix}X_{11} \\\vdots \\X_{nn}\end{matrix}\right]\) |
\(X \in\mathbf{R}^{n \times n}\) |
|||
|
\(k \in 0,1,2,\ldots\) |
沿给定轴的第k阶差分 |
\(X \in\mathbf{R}^{m \times n}\) |
||
\(\left[\begin{matrix}X^{(1)} \cdots X^{(k)}\end{matrix}\right]\) |
\(X^{(i)} \in\mathbf{R}^{m \times n_i}\) |
|||
|
常数 \(X\in\mathbf{R}^{p \times q}\) |
\(\left[\begin{matrix}X_{11}Y & \cdots & X_{1q}Y \\ \vdots & & \vdots \\ X_{p1}Y & \cdots & X_{pq}Y \end{matrix}\right]\) |
\(Y \in \mathbf{R}^{m \times n}\) |
依赖于 \(X\) |
|
|
常数 \(Y\in\mathbf{R}^{m \times n}\) |
\(\left[\begin{matrix}X_{11}Y & \cdots & X_{1q}Y \\ \vdots & & \vdots \\ X_{p1}Y & \cdots & X_{pq}Y \end{matrix}\right]\) |
\(X \in \mathbf{R}^{p \times q}\) |
取决于 \(Y\) |
|
|
常数 \(y \in \mathbf{R}^m\) |
\(x y^T\) |
\(x \in \mathbf{R}^n\) |
取决于 \(y\) |
|
部分追踪 |
\(X \in\mathbf{R}^{n \times n}\) |
|||
部分转置 |
\(X \in\mathbf{R}^{n \times n}\) |
|||
\(X' \in\mathbf{R}^{m' \times n'}\) |
\(X \in\mathbf{R}^{m \times n}\) \(m'n' = mn\) |
|||
展平\(X\)的严格上三角部分 |
\(X \in \mathbf{R}^{n \times n}\) |
|||
\(x' \in\mathbf{R}^{mn}\) |
\(X \in\mathbf{R}^{m \times n}\) |
|||
\(x' \in\mathbf{R}^{n(n-1)/2}\) 当 \(x' \in\mathbf{R}^{n(n+1)/2}\) 对于 |
\(X \in\mathbf{R}^{n \times n}\) |
|||
\(\left[\begin{matrix}X^{(1)} \\ \vdots \\X^{(k)}\end{matrix}\right]\) |
\(X^{(i)} \in\mathbf{R}^{m_i \times n}\) |
关于向量和矩阵函数的说明¶
输入到 \(\texttt{bmat}\) 的是一个CVXPY表达式的列表的列表。 它构造了一个块矩阵。 每个内部列表的元素水平堆叠,然后生成的块矩阵垂直堆叠。
输出 \(y = \texttt{convolve}(c, x)\) 的大小为 \(n+m-1\),并定义为 \(y_k =\sum_{j=0}^{k} c[j]x[k-j]\)。
输出 \(y = \texttt{vec}(X)\) 是将矩阵 \(X\) 按列主序展平为一个向量。 形式上,\(y_i = X_{i \bmod{m}, \left \lfloor{i/m}\right \rfloor }\)。
输出 \(Y = \texttt{reshape}(X, (m', n'), \text{order='F'})\) 是将矩阵 \(X\) 转换为一个 \(m' \times n'\) 矩阵。 元素按列优先顺序从 \(X\) 中取出,并按列优先顺序存储在 \(Y\) 中。 形式上,\(Y_{ij} = \texttt{vec}(X)_{m'j + i}\)。 如果 order=’C’,则 \(X\) 将按行优先顺序读取,并且 \(Y\) 将按行优先顺序写入。
输出 \(y = \texttt{upper_tri}(X)\) 是通过连接 \(X\) 的部分行形成的。 即,\(y = (X[0,1{:}],\, X[1, 2{:}],\, \ldots, X[n-1, n])\)。