一切问题都可以是最优化

本文版权属于重庆大学计算机学院刘骥,禁止转载

  • 一切问题都可以是最优化

最优化问题的一般定义是:存在目标函数f(x1,x2,...,xn)f(x_1,x_2,...,x_n),求满足特定条件的变量x1,x2,...,xnx_1,x_2,...,x_n使得目标函数值最大或者最小。最典型的例子就是求解函数f(x)=ax2+bx+cf(x)=ax^2+bx+c的极值(初中数学的内容)。在现实生活中,人们求解一个问题,往往需要找到这个问题最好的解。比如找到最好的伴侣、找最好的工作、最好的美食、最省钱的商品,以及最XXX的XXX。在解决这些问题的过程中,最优化函数往往只存在于脑海中,求解也在脑袋里进行。因此我们往往得到的是这些问题的近似解,但如果要求得更为准确的结果,那么就需要严格的定义目标函数,采用最精确的数学方法求解。随着大数据的发展,如果你愿意,那么完全可以利用现代科技,解决找工作、择偶、吃饭等等一系列的问题。事实上,这一切都由高科技公司帮忙做了,只是大家浑然不觉而已。比如外卖网站会给你推荐美食,这些推荐就是根据一系列的最优化算法得出的。

因此如果抛开一些非常特殊的问题,例如打印“Hello World”(生拉硬扯也不是不行),大多数问题都可以纳入最优化的框架。下面列举一个简单的非最优化问题,我们试试如何将其转换为最优化问题。

问题:求解水仙花数
该问题就不再描述了,学过计算机的都懂。下面我们将其转换为最优化问题。设集合NN是从100到999的自然数数列,ni∈Nn_i \in N,且n1=100,n100=999,ni<ni+1n_1=100,n_{100}=999,n_i。定义函数g(ni)g(n_i)如下:

g(ni)={01h(ni)3+k(hi)3+l(hi)3≠niotherwise

\begin{align} g(n_i)=\begin{cases} 0&h(n_i)^3+k(h_i)^3+l(h_i)^3\ne n_i \\ 1&otherwise \end{cases} \end{align}
函数 h(ni)、k(ni)、l(ni)h(n_i)、k(n_i)、l(n_i)的定义如下:

h(ni)=⌊ni/100⌋

\begin{align} h(n_i)=\lfloor n_i/100 \rfloor \end{align}

k(ni)=⌊(ni%100)/10⌋

\begin{align} k(n_i)=\lfloor (n_i\%100)/10 \rfloor \end{align}

l(ni)=ni%10

\begin{align} l(n_i)=n_i\%10 \end{align}
集合 X={xi|xi∈{0,1}}X=\{x_i|x_i \in \{0,1\} \},且集合 XX的元素个数为100。求集合XX使其满足:

argmaxX∑i=1100xig(ni)

\begin{align} \mathop{\arg\max}_{X}\sum_{i=1}^{100}x_ig(n_i) \end{align}
上述函数称为称为水仙花数最优化问题的目标函数。可以看出只有当 nin_i是水仙花数并且 xi=1x_i=1,目标函数求得最大值。
我们应该如何解决这个最优化问题呢?最愚蠢的方法是穷举。任何一个 xix_i有两种取值,因此共需要穷举 21002^{100}次。这显然是不现实的。 可行的方法仍然是经典教科书中的从100到999测试每一个自然数是否为水仙花数
我们可以得出两个推论:
推论1:任何问题可以转化为最优化问题。
推论2:最优化问题并不一定能够直接求解,或者说问题转换为最优化问题之后,求解难度不一定会下降。
最终我们可以得出如下结论:
结论:如果一个问题不容易直接求解,那么可以尝试将其转化为最优化问题。若转换后的问题容易求解,那么就可以通过求解最优化问题得出原问题的解。

下面来看一个比较复杂的问题

如上图所示,这张图片充满了噪声,并且中间还缺少了一块,应该如何修补这张图片才能产生如下的结果呢?

真是一点头绪都没有。既然原始问题不好解,为什么不将问题转换一下呢?先做一些简单的定义,图像II上的任意像素点坐标为pp,C(p)C(p)表示像素点pp对应的RGB值,N(p)N(p)表示像素点周围的邻居。最终修补后的图像,必然满足如下条件:

argminIE(I)=Ed(I)+λEs(I)

\begin{align} \mathop{\arg\min}_{I}E(I)=E_d(I)+\lambda E_s(I) \end{align}
意思就是说,求得的 II必然使得E(I)E(I)最小。看到这里,你一定想问为什么。没有为什么!事实只可能如此!任何函数都可以划分为两个部分,比如 f(x)=kx+b=g(x)+λh(x)f(x)=kx+b=g(x)+\lambda h(x),其中 g(x)=kxg(x)=kx, h(x)=1,λ=bh(x)=1,\lambda=b。真正关键的是如何定义 EdE_d和 EsE_s:

Ed(I)=∑p∈ID(p)

\begin{align} E_d(I)=\sum_{p\in I}D(p) \end{align}
很好解释, EdE_d是每个像素 D(p)D(p)值的和。

Es(I)=∑p∈I∑q∈N(p)S(p,q)

\begin{align} E_s(I)=\sum_{p\in I}\sum_{q\in N(p)}S(p,q) \end{align}
EsE_s稍微复杂,它是 pp和邻居qq的 s(p,q)s(p,q)值之和。如果用人类的语言来翻译,函数 E(I)E(I)是 II上所有像素点的D(p)D(p)和 S(p,q)S(p,q)值的和,而 D(p)D(p)只和 pp有关,S(p,q)S(p,q)与 pp的邻居qq有关。如果更直白一些,p的最优值由他自身和邻居决定。这几乎是宇宙间通行的法则。我们甚至可以用E(I)来描述人际关系、描述行星的运动、描述生命的演化等等。
你可能认为我在做梦。我当然是在做梦。因为 D(p)D(p)和 S(p,q)S(p,q)压根就没有定义。怎么定义呢?恕我无能,我不知道。事实上众多的学者也不可能知道,他们顶多能够给出一些近似的模型。因此大量的研究其实就是在不断的细化某个函数、某个模型。

如果我们假设E(I)E(I)能够被定义出来,接下来的问题就变成了如何求解E(I)E(I)的最优解。穷举法总是可以在一定范围内适用的,但多数情况下会产生指数时间复杂度的算法。这个话题太长,下一篇文章再谈。
总结一下。读完本文,你所需要记住的内容有以下两点:
(1)如果一个问题不容易直接求解,那么可以尝试将其转化为最优化问题。若转换后的问题容易求解,那么就可以通过求解最优化问题得出原问题的解。
(2)很多问题经过前人的研究,已经有现成的最优化框架,你所能做的不过是细化这个框架,以及找到更好的解最优化问题的方法。

一切问题都可以是最优化相关推荐

  1. 最优化方法一:梯度下降法

    目录 1 梯度下降 1.1 梯度下降的场景假设 1.2 梯度下降 1.2.1 微分: 1.2.2 梯度 1.3 梯度下降算法的数学解释 1.3.1 α是什么含义 1.3.2 为什么要梯度要乘以一个负号 ...

  2. 最优化技术——单纯形法

    最优化技术--单纯形法 说明 这个文章的大部分内容(几乎全部)都来自于我最优化课程的课程笔记.主要来源是重庆大学文静老师的PPT,个人主要用于整理.归纳,如果有侵权等问题,我会在第一时间将博客撤销. ...

  3. 【机器学习入门】(7) 线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降

    各位同学好,今天我和大家分享一下python机器学习中的线性回归算法.内容有: (1) 线性回归方程.(2) 损失函数推导.(3) 似然函数.(4) 三种梯度下降方法 1. 概念简述 线性回归是通过一 ...

  4. 各种 Optimizer 梯度下降优化算法回顾和总结

    1. 写在前面 当前使用的许多优化算法,是对梯度下降法的衍生和优化.在微积分中,对多元函数的参数求  偏导数,把求得的各个参数的导数以向量的形式写出来就是梯度.梯度就是函数变化最快的地方.梯度下降是迭 ...

  5. 各种 Optimizer 梯度下降优化算法总结

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:DengBoCong,编辑:极市平台 来源:https://zhu ...

  6. Pytorch完成基础的模型-线性回归

    Pytorch完成基础的模型-线性回归 1. Pytorch完成模型常用API 在前一部分博文中,实现了通过torch的相关方法完成反向传播和参数更新,在pytorch中预设了一些更加灵活简单的对象, ...

  7. 【Math】常见的几种最优化方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:poll 来源:https://www.cnblogs.co ...

  8. 深度学习 Optimizer 梯度下降优化算法总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:https://zhuanlan.zhihu.com/p/3 ...

  9. 各种Optimizer梯度下降优化算法回顾和总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法那些事 论文标题:An overview o ...

最新文章

  1. RT-Thread智能车培训计划-2021
  2. linux /etc/profile和/etc/bashrc
  3. phpcms URL修改
  4. 《算法竞赛入门经典》 例题5-2 木块问题(The Blocks Problem,UVa 101)
  5. windows gtk+ 开发环境搭建
  6. ezdpl Linux自动化部署实战
  7. JAVA安装作用_jdk安装配置及其作用
  8. JS之数据类型v(** v**)v个人笔记
  9. [原创]python MySQLdb在windows环境下的安装、出错问题以及解决办法
  10. 英国鬼死于狭隘和傲慢,中国鬼死于听天由命和漫不经心--《我的团长我的团》兰晓龙...
  11. Centos7 wordpress4.8.2
  12. ISBN(国际标准书号)的校验
  13. 华为计算机视觉博士,华为视觉计划发布,要做“智能世界的眼睛”
  14. python怎么安装turtle_Turtle模块安装
  15. codeforces 1000A,T-sthirt
  16. JS逆向-请求参数验证(案例:七麦数据)
  17. python django怎么读_怎么读django
  18. 福建程序员行业技术微信交流群,福建的小伙伴看过来了!
  19. Python小白项目练习500例(附源代码),练完可就业
  20. macOS系统_常用终端操作命令

热门文章

  1. C语言缺陷与陷阱(笔记)
  2. 最常用的几个数据验证正则判断,手机号,车牌号,身份证,Email,IP
  3. C/S模式和B/S模式
  4. 怎样将文件后缀名统一重命名并为大写字母
  5. 糖尿病视网膜病变检测 (Diabetic Retinopathy Detection)
  6. 《Linux驱动:使用音频设备驱动框架-OSS构建音频设备驱动》
  7. CSS固定格式-小垒
  8. (转载) android项目大全,总有你所需的
  9. 大话数据结构 -- 查找
  10. 【Math ML】Newton-Raphson.python 牛顿拉夫森方法