提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
本文总结了cvx中常见的一些替换函数,因为在cvx编程过程中会出现很多表达式的错误,平时编程没有问题的语句,放到cvx中就会各种报错,很大一部分原因是cvx中有一些专有的、特殊的函数,使用这些函数来替换表达式会解决很多cvx编程错误。
如果是cvx初学者,想要掌握一般cvx语法和编程方法,可以看这篇文章:
MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、cvx编程错误及解决方法
如果在编程中遇到了很多意想不到的错误,出现cvx报错可以看这篇文章:
MATLAB cvx错误汇总,cvx错误解决,cvx知识点总结,cvx编程技巧
函数 | 含义 |
---|---|
abs(x) | 绝对值函数,返回输入x的绝对值 |
square(x) | 平方函数,返回输入x的平方,即x^2 |
norm(x,p) | 范数函数,返回x的p范数,p可以是’inf’(无穷范数) |
max(x,y) | 返回x和y中较大的那个值 |
min(x,y) | 返回x和y中较小的那个值 |
exp(x) | 指数函数,返回e的x次方值 |
log(x) | 自然对数函数,返回x的自然对数值(以e为底) |
sum(x) | 求和函数,返回向量x中所有元素之和 |
prod(x) | 乘积函数,返回向量x中所有元素之积 |
该部分总结的函数都是一些不常见的,但是却很有用,也很容易被疏忽的函数。用这些函数可以解决很多问题。
inv_pos(x)是一个原子函数,用于求一个正数x的倒数,即1/x。但是,在定义该函数的时候,需要加上一个前缀“inv_pos”来表示参数x必须是正数,否则会产生未定义的结果。
在优化问题中,经常需要对矩阵或向量的逆进行求解。但是,如果涉及到非正定或奇异矩阵,逆运算是无法进行的。因此,为了确保矩阵或向量是正定的,可以使用CVX中的inv_pos函数,它会自动判断变量的正定性并求解其逆。当变量不是正定的时候,inv_pos函数会返回inf(无穷大)或NaN(非数值)。
代码如下(示例):
要求求解一个变量x,使得1/x最小,且x要大于等于0.5。
cvx_begin
variable x
minimize(inv_pos(x) - 1)
subject to
x >= 0.5;
cvx_end
norm_inv_pos(x, p)是一个原子函数,用于计算变量x的p-范数的倒数,其中p可以是任何实数,但必须大于0。该函数返回一个正数。
该函数常用于求解Lp范数规划问题,其中Lp范数的逆被用作惩罚项,目的是让解向稀疏性更高的方向推进。
代码如下(示例):
cvx_begin
variable x(n);
minimize( norm(x, p) );
subject to
norm_inv_pos(x, q) <= t;
cvx_end
其中,x是一个列向量,p和q是正数,t是另一个正数。优化问题最小化变量x的Lp范数,同时满足x的Lq范数的倒数小于或等于t。该约束限制了x向稀疏方向的推进程度。
pow_p(x, p)是一个原子函数,用于计算变量x的p次方。其中p可以是任何实数,但必须大于等于1。该函数返回一个数值。
该函数常用于优化问题中,当目标函数或约束中包含关于变量的幂函数时,可以使用pow_p函数来简化表达式
代码如下(示例):
根据稀疏能量模型计算最优的信号估计值:
cvx_begin
variable x(n);
minimize( norm(y - A*x) + lambda*pow_p(norm(x,1),q) );
cvx_end
其中,y是一个观察向量,A是一个观察矩阵,x是待求的信号向量,n是信号向量的长度,lambda和q是超参数。优化问题使用L1范数作为正则化项,目的是为了捕捉稀疏性。在这个例子中,pow_p函数用来计算x的L1范数的q次幂。
rel_entr(x, y)是一个原子函数,表示 KL 散度的一部分,即 x log(x/y)。其中,x和y具有相同的尺寸和形状,元素之间进行逐项计算。它主要用于一些需要满足概率或分布条件的优化问题中。
rel_entr函数的第一个参数 x 可以是任何非负实数或实数向量(或矩阵),而第二个参数 y 也是非负实数或实数向量(或矩阵),并且 y 中不能存在 0 的项。当 x 和 y 相等时,rel_entr(x, y)的值是 0。在CVX问题中,rel_entr(x, y)通常用在求解最大熵问题、信息论问题、对数几率回归等一些特殊问题中。
代码如下(示例):
使用rel_entr函数计算KL散度
cvx_begin
variable x(n);
maximize(sum(rel_entr(x, p)));
subject to
sum(x) == 1;
x >= 0;
cvx_end
其中,x 是一个 n 维列向量,p 也是一个相同尺寸和形状的列向量,CVX会自动将所有元素之间的操作转换成相应的 KL散度公式。
entr(x)是一个原子函数,用于计算以x为概率的随机变量的熵值。该函数返回一个数值。
熵值是用于度量随机变量不确定性的指标,表示在一组可能性中每个可能性的平均信息量的大小。在机器学习中,熵值被广泛使用,特别是在信息增益和决策树等模型中
代码如下(示例):
这个例子中的问题是根据一个初始低分辨率图像生成一个更高分辨率的图像:
cvx_begin
variable x(n);
minimize( norm(y - H*x) );
subject to
entr(x) <= epsilon;
cvx_end
其中,x是待求的高分辨率图像,y是低分辨率观察,H是一个下采样矩阵,n是x的长度,epsilon是一个给定的阈值。在这个例子中,约束条件要求高分辨率图像的熵值小于等于给定的阈值,这样可以避免出现过度平滑的解。
quad_form(x, A)是一个原子函数,用于计算二次形式x’Ax的值,其中x是一个列向量,A是一个对称矩阵。该函数返回一个数值。
该函数常用于优化问题中,当目标函数或约束中包含关于向量的二次型时,可以使用quad_form函数来简化表达式。
代码如下(示例):
以下是使用quad_form函数的一个例子,这个例子中的问题是求解一个二次规划问题:
cvx_begin
variable x(n);
minimize( x'*Q*x + c'*x );
subject to
A*x <= b;
cvx_end
其中,Q是一个对称矩阵,c是一个列向量,A是一个矩阵,b是一个列向量。目标函数是一个带有二次型项的二次函数,最小化目标函数相当于解决一个二次规划问题。在这个例子中,quad_form函数用来计算二次项x’Qx的值。
上述内容是对cvx中一些子函数的总结,这些函数不仅能够很好的简化我们的表达式,还会解决很多编程中遇到的错误,数量掌握这些函数的用法,会对解决优化问题、掌握cvx工具箱有很大帮助。
如果对MATLAB不是很熟悉。可以先看一下下面两篇文章,来巩固基础知识。
MATLAB基础操作,矩阵乘法、数组矩阵索引、最大最小运算符、零矩阵/随机矩阵/单位矩阵的生成、log函数、Inf和NaN的含义,语句过长用连接符换行、逻辑运算符以及区别
MATLAB绘图必看,画图大全!MATLAB绘图基础操作大全—折线图、散点图、颜色样式、线条粗细汇总