凸问题的编程规则(Disciplined Convex Programming)
前言:DCP(Disciplined convex programming )是一个系统,它从已给的基础函数库构造已知曲率的数学表达式。 CVXPY使用DCP确保目标函数为凸. 这部分解释了DCP规则以及在CVXPY中的应用。
凸优化问题:凸优化之所以如此重要,是因为凸优化的重要特性, 凸优化的任意局部最优解也是全局最优解
凸优化问题是形式如下: f 0 , . . . , f m 为凸函数,凸优化问题附加三个条件:
  • 目标函数必须是凸的,
  • 不等式约束是凸的
  • 等式约束 h i ( x ) = a T i b i 必须是仿射的。
    一个值得注意的问题是:凸优化问题的可行集是凸的。
    凹最大化问题:
    maximize f 0 ( x ) 得以求解。

1、表达式

在cvxpy中表达式由变量、参数、数值常量(例如Python floats、Numpy matrices)、标准算数运算符(+, -, *, /) 和标准库函数。
如下是cvxpy表达式的例子:

from cvxpy import *
# Create variables and parameters.
//建立变量与参数
x, y = Variable(), Variable()
a, b = Parameter(), Parameter()
# Examples of CVXPY expressions.
//cvxpy表达式:
3.69 + b/3
x - 4*a
sqrt(x) - min_elemwise(y, x - a)
max_elemwise(2.66 - sqrt(y), square(x + 2*y))

表达式可以是标量、向量或者矩阵。表达式的维度被存储在 expr.size ,如果使用表达式的维度没有意义,cvxpy将会抛出异常,例如两个不同size的矩阵相加。

import numpy
X = Variable(5, 4)
A = numpy.ones((3, 5))
# Use expr.size to get the dimensions.
print "dimensions of X:", X.size
print "dimensions of sum_entries(X):", sum_entries(X).size
print "dimensions of A*X:", (A*X).size
# ValueError raised for invalid dimensions.
try:
    A + X
except ValueError, e:
    print e
dimensions of X: (5, 4)
dimensions of sum_entries(X): (1, 1)
dimensions of A*X: (3, 4)
Incompatible dimensions (3, 5) (5, 4)

CVXPY uses DCP analysis to determine the sign and curvature of each expression.
CVXPY使用DCP分析来求每个表达式的正负号与曲率

2、正负号Sign

每一个表达式或者子表达式被标记为非负、非正、零或者未知。复合表达式的正负号可以从它的子表达式的正负号求出。
例如,expr1*expr2的正负号:

  • Zero if either expression has sign zero.只要expr1或者expr2一个为0,则表达式为0
  • Positive if expr1 and expr2 have the same (known) sign.
  • Negative if expr1 and expr2 have opposite (known) signs.
  • Unknown if either expression has unknown sign.

    给一个表达式符号总是正确的,但是当一个表达式能通过更加复杂的分析标记符号时,DCP可能标记一个表达式为unknown。
    例如x*x符号为正,但是x被标记为unknown。
    cvxpy根据常量的值决定它的符号,对于标量常量,它的符号是容易求的。如果向量或者矩阵的每一项都是正(负),则向量或者矩阵常数被标记为正(负)。如果向量或矩阵的每一项有正有负,则向量或者矩阵被标记为unknown sign.

The sign of an expression is stored as expr.sign:
x = Variable()
a = Parameter(sign="negative")
c = numpy.array([1, -1])
print "sign of x:", x.sign
print "sign of a:", a.sign
print "sign of square(x):", square(x).sign
print "sign of c*a:", (c*a).sign
sign of x: UNKNOWN
sign of a: NEGATIVE
sign of square(x): POSITIVE
sign of c*a: UNKNOWN

3、曲率Curvature

每个表达式或子表达式被标记为下列曲率(根据它们的变量):
这里写图片描述使用如下的曲率规则。正如符号分析,结论总是正确的。但是当一个表达式是凸的或者凹的时,一个简单的分析能标记表达式是unknown。注意常量标记为affine,任何仿函数能标记为凸的或者凹的。

4、DCP problems

一个问题能够由目标函数和一系列约束构造。如果问题遵从DCP规则,这个问题将是凸的,能够被cvxpy解决。DCP规则要求目标函数有以下两种形式:

  • Minimize(convex)
  • Maximize(concave)
    在DCP规则下的有效约束为:
  • affine == affine
  • convex <= concave
  • concave >= convex
    你能调用object.is_dcp()来检查一个问题、约束、目标函数是否满足DCP规则。
//Here are some examples of DCP and non-DCP problems:
x = Variable()
y = Variable()
# DCP problems.
prob1 = Problem(Minimize(square(x - y)), [x + y >= 0])
prob2 = Problem(Maximize(sqrt(x - y)),
                [2*x - 3 == y,
                 square(x) <= 2])
print "prob1 is DCP:", prob1.is_dcp()
print "prob2 is DCP:", prob2.is_dcp()
# Non-DCP problems.
# A non-DCP objective.
prob3 = Problem(Maximize(square(x)))
print "prob3 is DCP:", prob3.is_dcp()
print "Maximize(square(x)) is DCP:", Maximize(square(x)).is_dcp()
# A non-DCP constraint.
prob4 = Problem(Minimize(square(x)), [sqrt(x) <= 2])
print "prob4 is DCP:", prob4.is_dcp()
print "sqrt(x) <= 2 is DCP:", (sqrt(x) <= 2).is_dcp()
prob1 is DCP: True
prob2 is DCP: True
prob3 is DCP: False
Maximize(square(x)) is DCP: False
prob4 is DCP: False
sqrt(x) <= 2 is DCP: False

CVXPY will raise an exception if you call problem.solve() on a non-DCP problem.

# A non-DCP problem.
prob = Problem(Minimize(sqrt(x)))
try:
    prob.solve()
except Exception as e:
    print e
Problem does not follow DCP rules.
凸问题的编程规则(Disciplined Convex Programming) 前言:DCP(Disciplined convex programming )是一个系统,它从已给的基础函数库构造已知曲率的数学表达式。CVXPY使用DCP确保目标函数为凸.这部分解释了DCP规则以及在CVXPY中的应用。 凸优化问题:凸优化之所以如此重要,是因为凸优化的重要特性,凸优化的任意局部最优解也是
1. 从线性规划到二次规划 LP算法主流主要是Dantzig的Simplex和Karmarkar的IPM算法: Simplex Method:大部分中小规模问题超快,大规模问题不如IPM,偶尔情况很差。 Interior-point Method, IPM:大规模情况比较快, 中小规模不如Simplex, 但是不会出现最坏情况。 2. Cvxpy介绍 CVXPY是一种可以内置于Python中的模...
在使用matlab cvx求解凸优化问题时遇到了一些问题,在这里记录一下。 Disciplined convex programming error: Cannot perform the operation: {real affine} .* {invalid} 这个问题困扰了我好久TAT 先前的代码中定义variable为x 看报错的意思应该是,x为real affine,那么就是与x(i)相乘的后面那几项中出现了问题 最后找到是Y(1,i)的问题 因为Y在定义的时候,表达式在第一次迭代时,分
AMiner平台由清华大学计算机系研发,拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。系统2006年上线,吸引了全球220个国家/地区1000多万独立IP访问,数据下载量230万次,年度访问量超过1100万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。 IJCAI 2020 论文推荐 Polar Relative Positional Encoding for Video-Languag.
前面第二章介绍了print的语法,其语法如下: print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) 其中有几个参数,分别说明一下: sep:表示前面打印的几个参数之间的分隔符是什么,默认是一个空格,我们可以替换成为我们想要的字符串,甚至是一个字符串变量; end... 1.1关系运算(除运算) 关系R(X,Y)和关系S(Y,Z),其中X,Y,Z是属性集。则R÷S得到一个新的关系T,且T有以下特点: 是R(X,Y)关于X(集合运算:{X}=R-S)投影的子集 T中的任一元组,在R中的象集,包含关系S中的Y属性集的所有字段的域 意义:R÷S得到的结果是,一个关系某些元组,拥有另一个关系的某一字段的所有值。 还是难以理解,看看下面例子吧,有时候结合例子可以更好的理解。 1.2 SQL语句实现 除运算 没有特定运算符实现除运算。 需要用到not exist 直接看例子:
cvx报错Invalid quadratic form(s): not a square 最近在用matlab的CVX工具箱解决凸优化的一些问题,这里整理一下我遇到的一些问题和解决办法。 Invalid quadratic form(s): not a square 出现这个问题的原因是因为CVX是不支持两个变量直接相乘的,如果在约束中或者目标函数中不能避免的话,这里有两个方法可以解决。 GP mode模式 调用方法 cvx_begin gp 就可以了,就不会出现上述报错了。 利用 prod_inv函
本文介绍一种基于凸优化的图像去噪方法。 该方法采用L1范数来衡量图像的平滑度,即能滤除澡声,又能最大限度地保存图像的边缘。 模型如下:  其中f(x)为差分矩阵,存放了X每个元素与其4邻域的差值。 I为输入的灰度图像。 对于通道彩色图像,可对每个通道进行单独处理。gamma为权重,值趣大则图像越平滑。 上述模型为无约束的最小化问题 ,用线性规化可解。 在这里用一个很强大通用的matlab算法包CVX[1]进行求解
AMiner平台由清华大学计算机系研发,拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。系统2006年上线,吸引了全球220个国家/地区1000多万独立IP访问,数据下载量230万次,年度访问量超过1100万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。 IJCAI 2020 论文推荐 Reasoning Like Human: Hierarchical Reinforcement Lea.
CVXR 是斯坦福大学 CVX* 系列的一个凸优化求解器,面向 R 的封装接口,专注于凸优化问题的求解。 凸优化,因为它易于求解全局最优解的特性,在许多场景下都有应用,比如 投资组合优化 使用凸优化求解的前提是,问题的定义需要满足 DCP 规则(Disciplined convex programming) DCP 规则 含义...
如果PyCharm找不到Python.exe,可能是因为Python解释器的路径没有正确设置。您可以尝试以下步骤来解决此问题: 1. 确认您已经安装了Python,并且知道Python的安装路径。 2. 在PyCharm中打开“设置”(Settings)对话框。 3. 在左侧面板中选择“解释器”(Interpreter)选项。 4. 在右侧面板中,单击“添加”(Add)按钮。 5. 在弹出的对话框中,选择“本地”(Local)选项,并浏览到Python.exe所在的路径。 6. 点击“确定”(OK)按钮,然后等待PyCharm完成解释器的配置。 7. 现在,您应该能够在PyCharm中使用Python了。 如果您仍然遇到问题,请尝试重新安装Python,并确保将其路径添加到系统环境变量中。