凸优化

定义:抛开凸优化的种种理论和算法不谈,纯粹的看优化模型,凸优化需满足一下三个条件:
1.在最小化(最大化)的要求下
2.目标函数是一个凸函数(凹函数)
3.约束条件所形成的可行域集合是一个凸集。

凸优化问题为什么这么重要:

此处问题解答引自知乎:https://www.zhihu.com/question/24641575

1、有相当一部分问题是或等价于凸优化问题。有许多问题都可以直接建立成凸优化模型(比如:线性规划LP(Linear Programming)、某些特殊的二次规划QP(Quadratic Programming)、锥规划CP(Conic Programming)其中包括:要求约束中变量落在一个二阶锥里的二阶锥规划SOCP(Second Order Cone Programming)、要求约束中变量是半正定矩阵的半定规划SDP(Semi-Definite Programming)等)。以上这些类型,总之就是要符合凸优化上述的要求。需要说明的就是,许多可行域都可以看作是凸锥(Convex Cone)的交集,所以将以上一些类型的约束混合起来,依然是凸优化问题。
另外还有一些问题,可以等价的转化为凸优化问题。例如 Linear-Fractional Programming (LFP),目标函数是两个仿射函数(Affine Function)的比,约束是一个多面体。这种目标函数具有既是拟凸又是拟凹的性质,通过一个叫做 Charnes-Cooper transformation 的转化,可以变成一个线性规划。同时,如果我们要最大化 LFP 的目标函数,且其约束仅是一个0-1整数约束(这显然不是一个凸集),我们可以将其直接松弛(Relax)成0到1的约束,并且和原问题等价。因为最大化拟凸函数,最优值一定可以落在可行域的极点上。这个结论可以用来帮助解决 Multi Nomial Logit(MNL)选择模型下的商品搭配问题( Assortment Optimization)。
2、大部分凸优化问题解起来比较快,也即多项式时间可解问题(P)。如果你的问题能直接或间接(但必须是等价的)转化成上面我提到的那些类型,那恭喜你,后面的事儿基本就可以交给solver啦,当然大规模问题还需要考虑诸如列生成(Column Generation)之类的方法,提高运算效率。

3、很多非凸优化或NP-Hard的问题可以转化(并非是等价的)为P的凸优化问题。并给出问题的界或近似。这对如何设计合理的算法,或衡量算法结果的优劣起到很大的帮助。非凸优化的问题基本上都是NP-Hard的,所以要找到其最优解,理论上是不确定有一个多项式时间的算法的,所以这时候会考虑设计一些近似算法,或者启发式算法,就要依靠凸优化。

凸优化的作用在于思维方式的转变,跟计算机思维方式一样,计算机从业人员在遇到问题的时候习惯了通过电脑去协助解决问题,而他们的价值不在于知道听得懂别人告诉他如何解决问题,而是遇到现实问题的时候都会将问题拆分成机器可以实现的方式去解决:例如遇到购物,阿里巴巴建立了网站、app、c/s系统、b/s系统,用互联网建立信息流,建立帝国。遇到查询问题,百度建立了搜索引擎。这种思维方式才是最重要的。。同样,凸优化的价值也在于思维转变,遇到现实生活问题的时候,我们必然要对问题进行建模,然后抽象问题,利用机器去帮助我们解决问题,那么,当问题的计算量接近无穷大的时候我们如何去解决?这就需要我们抽离问题抽象结构,想办法将转换成“凸优化问题”,因为凸优化已经被嚼烂,所以只要问题转化成凸优化,我们就可以分布迭代去运算,于是才有了机器学习、深度学习这一门门的交叉科学。凸优化是数学领域的重要分支,而计算机科学仅仅是数学这门基础科学的延伸而已,基础科学才是王道!!! C#、Java固然是被封装成了便于人类使用的高级语言,但是总有些功能是“已有实现”没有封装好的,这时就需要我们回归更加原始语言C、汇编去编程。。深究底层、精通基础科学才是从容面对所有问题的解决王道,学会别人解决过的问题只能让你解决相同的问题,现实是无限可能的,总有未解决过的问题等着你

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章