Python.CVXPY学习指南三
来源:互联网 发布:平面设计软件怎么下载 编辑:程序博客网 时间:2024/06/16 06:15
前言:DCP(Disciplined convex programming )是一个系统,它从已给的基础函数库构造已知曲率的数学表达式。CVXPY使用DCP确保目标函数为凸.这部分解释了DCP规则以及在CVXPY中的应用。
凸优化问题:凸优化之所以如此重要,是因为凸优化的重要特性,凸优化的任意局部最优解也是全局最优解。
凸优化问题是形式如下:
其中
- 目标函数必须是凸的,
- 不等式约束是凸的
- 等式约束
hi(x)=aTi−bi 必须是仿射的。
一个值得注意的问题是:凸优化问题的可行集是凸的。
凹最大化问题:maximize f0(x)
s.t. fi(x)≤0,i=1,...,m
aTix=bi,i=1,...,p
如果目标函数f0 是凹的而不等式约束函数f1,...,fm 是凸的,也成为凸优化问题,这个凹最大化问题可以简单通过极小化凸目标函数−f0 得以求解。
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/3x - 4*asqrt(x) - min_elemwise(y, x - a)max_elemwise(2.66 - sqrt(y), square(x + 2*y))
表达式可以是标量、向量或者矩阵。表达式的维度被存储在expr.size,如果使用表达式的维度没有意义,cvxpy将会抛出异常,例如两个不同size的矩阵相加。
import numpyX = Variable(5, 4)A = numpy.ones((3, 5))# Use expr.size to get the dimensions.print "dimensions of X:", X.sizeprint "dimensions of sum_entries(X):", sum_entries(X).sizeprint "dimensions of A*X:", (A*X).size# ValueError raised for invalid dimensions.try: A + Xexcept ValueError, e: print edimensions 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.signprint "sign of a:", a.signprint "sign of square(x):", square(x).signprint "sign of c*a:", (c*a).signsign of x: UNKNOWNsign of a: NEGATIVEsign of square(x): POSITIVEsign 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: Trueprob2 is DCP: Trueprob3 is DCP: FalseMaximize(square(x)) is DCP: Falseprob4 is DCP: Falsesqrt(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 eProblem does not follow DCP rules.
- Python.CVXPY学习指南三
- Python.CVXPY学习指南一
- Python.CVXPY学习指南二
- Python凸优化库cvxopt、cvxpy安装
- Python 学习指南
- Python学习指南
- windbg 学习指南<三>
- Hive学习指南(三)
- python 学习指南教程
- 正则表达式学习指南(三)----字符
- 学习指南
- 学习指南
- 学习指南
- python学习指南教程(更新完毕)
- 深度学习学习指南(Python版)
- SecureCRT中python脚本编写学习指南
- Flash动画学习指南三:时间轴与关键帧
- pl/sql 之三大循环的完全学习指南
- 朱啸虎:创业公司不要一开始就想着教育市场
- 链表倒置
- 如何让图片按比例响应式缩放并自动裁剪的css技巧(同时也适用于一些轮播父容器响应式缩放)
- 修改Eclipse格式化代默认长度
- opencv学习系列:目标检测相关
- Python.CVXPY学习指南三
- 记录被计算机虐死的心酸历程之bamm-2.5.0的安装-1
- 2017 Google 开发者大会都有哪些炫酷科技?
- elasticsearch 使用go-mysql-elasticsearch 同步Mysql NDB Cluster 日志格式设置
- 基于Nginx负载均衡方案
- 数据结构实验之排序七:选课名单
- Redis安装
- swift-oc wkwebView使用自定义UIMenuController
- 22. 其他操作流