转载 原地址https://blog.csdn.net/on2way/article/details/47729419

写在之前

支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问题,不得不说确实完美。
本系列旨在以基础化的过程,实例化的形式一探SVM的究竟。曾经也只用过集成化的SVM软件包,效果确实好。因为众人皆说原理复杂就对其原理却没怎么研究,最近经过一段时间的研究感觉其原理还是可以理解,这里希望以一个从懵懂到略微熟知的角度记录一下学习的过程。
其实网络上讲SVM算法的多不胜数,博客中也有许多大师级博主的文章,写的也很简单明了,可是在看过之和总是感觉像差点什么,当然对于那些基础好的可能一看就懂了,然而对于像我们这些薄基础的一遍下来也能马马虎虎懂,过一两天后又忘了公式怎么来的了。比如说在研究SVM之前,你是否听说过拉格朗日乘子法?你是否知道什么是对偶问题?你是否了解它们是怎么解决问题的?Ok这些不知道的话,更别说什么是KKT条件了,哈哈,有没有说到你的心声,不用怕,学学就会了。话说像拉格朗日乘子法,在大学里面学数学的话,不应该没学过,然你学会了吗?你知道是干什么的吗?如果那个时候就会了,那你潜质相当高了。作为一个刚过来的人,将以简单实例化形式记录自己的学习过程,力图帮助新手级学习者少走弯路。

(一)关于拉格朗日乘子法

首先来了解拉格朗日乘子法,那么为什么需要拉格朗日乘子法?记住,有拉格朗日乘子法的地方,必然是一个组合优化问题。那么带约束的优化问题很好说,就比如说下面这个:

minf=2x21+3x22+7x23s.t.2x1+x2=12x2+3x3=2

这是一个带等式约束的优化问题,有目标值,有约束条件。那么想想假设没有约束条件这个问题是怎么求解的呢?是不是直接f对各个x求导等于0,,解x就可以了,可以看到没有约束的话,求导为0,那么各个x均为0吧,这样f=0了,最小。但是x都为0不满足约束条件呀,那么问题就来了。这里在说一点的是,为什么上面说求导为0就可以呢?理论上多数问题是可以的,但是有的问题不可以。如果求导为0一定可以的话,那么f一定是个凸优化问题,什么是凸的呢?像下面这个左图:

凸的就是开口朝一个方向(向上或向下)。更准确的数学关系就是:

f(x1)+f(x2)2>f(x1+x22)或者f(x1)+f(x2)2<f(x1+x22)

注意的是这个条件是 对函数的任意x取值。如果满足第一个就是开口向上的凸,第二个是开口向下的凸。可以看到对于凸问题,你去求导的话,是不是只有一个极点,那么他就是最优点,很合理。类似的看看上图右边这个图,很明显这个条件对任意的x取值不满足,有时满足第一个关系,有时满足第二个关系,对应上面的两处取法就是,所以这种问题就不行,再看看你去对它求导,会得到好几个极点。然而从图上可以看到,只有其中一个极点是最优解,其他的是局部最优解,那么当真实问题的时候你选择那个?说了半天要说啥呢,就是拉格朗日法是一定适合于凸问题的,不一定适合于其他问题,还好我们最终的问题是凸问题。

回头再来看看有约束的问题,既然有了约束不能直接求导,那么如果把约束去掉不就可以了吗?怎么去掉呢?这才需要拉格朗日方法。既然是等式约束,那么我们把这个约束乘一个系数加到目标函数中去,这样就相当于既考虑了原目标函数,也考虑了约束条件,比如上面那个函数,加进去就变为:

minf=2x21+3x22+7x23+α1(2x1+x2−1)+α2(2x2+3x3−2)

这里可以看到与α1,α2相乘的部分都为0,所以α1,α2的取值为全体实数。现在这个优化目标函数就没有约束条件了吧,既然如此,求法就简单了,分别对x求导等于0,如下:

∂f∂x1=4x1+2α1=0⇒x1=−0.5α1∂f∂x2=6x2+α1+2α2=0⇒x2=−α1+2α26∂f∂x3=14x3+3α2=0⇒x3=−3α214

把它在带到约束条件中去,可以看到,2个变量两个等式,可以求解,最终可以得到α1=−0.39,α2=−1.63,这样再带回去求x就可以了。那么一个带等式约束的优化问题就通过拉格朗日乘子法完美的解决了。那么更高一层的,带有不等式的约束问题怎么办?那么就需要用更一般化的拉格朗日乘子法即KKT条件来解决这种问题了。

(二)关于KKT条件

继续讨论关于带等式以及不等式的约束条件的凸函数优化。任何原始问题约束条件无非最多3种,等式约束,大于号约束,小于号约束,而这三种最终通过将约束方程化简化为两类:约束方程等于0和约束方程小于0。再举个简单的方程为例,假设原始约束条件为下列所示:

minf=x21−2x1+1+x22+4x2+4s.t.x1+10x2>1010x1−10x2<10

那么把约束条件变个样子:

s.t.10−x1−10x2<010x1−x2−10<0

为什么都变成等号与小于号,方便后面的,反正式子的关系没有发生任何变化就行了。

现在将约束拿到目标函数中去就变成:

L(x,α)=f(x)+α1g1(x)+α2g2(x)=x21−2x1+1+x22+4x2+4+α1(10−x1−10x2)+α2(10x1−x2−10)

那么KKT条件的定理是什么呢?就是如果一个优化问题在转变完后变成

L(x,α,β)=f(x)+∑αigi(x)+∑βihi(x)

其中g是不等式约束,h是等式约束(像上面那个只有不等式约束,也可能有等式约束)。那么KKT条件就是函数的最优值必定满足下面条件:

(1) L对各个x求导为零;
(2) h(x)=0;
(3) ∑αigi(x)=0,αi≥0

这三个式子前两个好理解,重点是第三个式子不好理解,因为我们知道在约束条件变完后,所有的g(x)<=0,且αi≥0,然后求和还要为0,无非就是告诉你,要么某个不等式gi(x)=0,要么其对应的αi=0。那么为什么KKT的条件是这样的呢?

假设有一个目标函数,以及它的约束条件,形象的画出来就如下:

假设就这么几个吧,最终约束是把自变量约束在一定范围,而函数是在这个范围内寻找最优解。函数开始也不知道该取哪一个值是吧,那就随便取一个,假设某一次取得自变量集合为x1*,发现一看,不满足约束,然后再换呀换,换到了x2*,发现可以了,但是这个时候函数值不是最优的,并且x2*使得g1(x)与g2(x)等于0了,而g3(x)还是小于0。这个时候,我们发现在x2的基础上再寻找一组更优解要靠谁呢?当然是要靠约束条件g1(x)与g2(x),因为他们等于0了,很极限呀,一不小心,走错了就不满足它们两了,这个时候我们会选择g1(x)与g2(x)的梯度方向往下走,这样才能最大程度的拜托g1(x)与g2(x)=0的命运,使得他们满足小于0的约束条件对不对。至于这个时候需不需要管g3(x)呢?正常来说管不管都可以,如果管了,也取g3在x2*处的梯度的话,因为g3已经满足了小于0的条件,这个时候在取在x2*处的梯度,你能保证它是往好的变了还是往差的变了?答案是都有可能。运气好,往好的变了,可以更快得到结果,运气不好,往差的变了,反而适得其反。那么如果不管呢?因为g1(x)与g2(x)已经在边缘了,所以取它的梯度是一定会让目标函数变好的。综合来看,这个时候我们就不选g3。那么再往下走,假设到了自变量优化到了x3*,这个时候发现g2(x)与g3(x)等于0,也就是走到边了,而g1(x)小于0,可变化的空间绰绰有余,那么这个时候举要取g2(x)与g3(x)的梯度方向作为变化的方向,而不用管g1(x)。那么一直这样走呀走,最终找到最优解。可以看到的是,上述如果g1(x)、g2(x)=0的话,我们是需要优化它的,又因为他们本身的条件是小于0的,所以最终的公式推导上表明,是要乘以一个正系数α作为他们梯度增长的倍数,而那些不需要管的g(x)为了统一表示,这个时候可以将这个系数设置为0,那么这一项在这一次的优化中就没有了。那么把这两种综合起来就可以表示为
∑αigi(x)=0,αi≥0。
也即是某次的g(x)在为最优解起作用,那么它的系数值(可以)不为0。如果某次g(x)没有为下一次的最优解x的获得起到作用,那么它的系数就必须为0,这就是这个公式的含义。

比如上面例子的目标值与约束:

minf=x21−2x1+1+x22+4x2+4s.t.10−x1−10x2<010x1−x2−10<0

将约束提到函数中有:

L(x,α)=x21−2x1+1+x22+4x2+4+α1(10−x1−10x2)+α2(10x1−x2−10)

此时分别对x1、x2求导数:

∂L∂x1=2x1−2−α1+10α2=0⇒x1=0.5(α1−10α2+2)∂L∂x2=2x2+4−10α1−α2=0⇒x2=0.5(10α1+α2−4)

而我们还有一个条件就是α∗g(x)=0,那么也就是:

α1∗g1(x)=α1∗(10−x1−10x2)=0α2∗g2(x)=α2∗(10x1−x2−10)=0

这样我们就去讨论下,要么g=0,要么α=0,这里两个g两个α,这样我们就需要讨论四种情况,可能你会说,这是约束条件少的情况,那么如果有10个约束条件,这样就有10个g和10个α,你去给我讨论?多少种组合,不知道,但是换个思路,我们非得去10个一起去讨论?机智的学者想到一种方法,考虑到∑αigi(x)=0这个条件,那么我两个两个讨论不就可以了,比如现在我就讨论α7,α8,让其他的α不变,为什么选或者至少选两个讨论呢,因为这个式子求和为0,改变一个显然是不行的,那就改变两个,你增我就减,这样和可以为0。再问为什么不讨论3个呢?也可以,这不是麻烦嘛,一个俗语怎么说来着,三个和尚没水喝,假设你改变了一个,另外两个你说谁去减或者加使得和为0,还是两个都变化一点呢?不好说吧,自然界都是成双成对的才和谐,没有成三成四的(有的话也少)。这里顺便提一下后面会介绍到的内容,就是实现SVM算法的SMO方法,在哪里,会有很多α,那么人们怎么解决的呢,就是随便选择两个α去变化,看看结果好的话,就接受,不好的话就舍弃在选择两个α,如此反复,后面介绍。

说回来,这里有四种情况,正好两个α,也不用挑不用减的,一次完事。那么我们分着讨论吧,
(1)α1=α2=0,那么看上面的关系可以得到x1=1,x2=−1,再把两个x带到不等式约束,发现第一个就是需要满足(10-1+20=29<0)显然不行,29>0的。舍弃

(2)g1(x)=g2(x)=0,带进去解得,x1=110/101;x2=90/101,再带回去求解α1,α2,发现α1=58/101,α2=4/101,它们满足大于0的条件,那么显然这组解是可以的。

(3)其他两种情况再去讨论发现是不行的。

可以看到像这种简单的讨论完以后就可以得到解了。
x1=110/101=1.08;x2=90/101=0.89,那么它得到结果对不对呢?这里因为函数简单,可以在matlab下画出来,同时约束条件也可以画出来,那么原问题以及它的约束面画出来就如下所示:

这是截取下来的符合约束要求的目标面

可以看到最优解确实就是上面我们求的那个解。既然简单的问题可以这样解,那么复杂一点的只需要简单化,照样可以解,至此KKT条件解这类约束性问题就是这样,它对后续的SVM求解最优解至关重要。

转载于:https://juejin.im/post/5acdb4f66fb9a028db590ce4

解密SVM系列(一):关于拉格朗日乘子法和KKT条件相关推荐

  1. 最优控制理论 六、拉格朗日乘子法和KKT条件

    拉格朗日乘子法和KKT条件 1. 等式约束最优化 2. 不等式约束最优化 2.1 1个不等式约束 2.2 KKT条件 2.3 二维不等式约束图解 3. MATLAB不等式约束优化 总结 4. 参考文献 ...

  2. 真正理解拉格朗日乘子法和KKT条件

    转载自:https://www.cnblogs.com/xinchen1111/p/8804858.html  这篇博文中直观上讲解了拉格朗日乘子法和 KKT 条件,对偶问题等内容. 首先从无约束的优 ...

  3. 【数学基础】运筹学:拉格朗日乘子法和KKT条件(上)

    引言 在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush Kuhn Tucker)条件是两种最常用的方法.通常,对于等式约束问题,采用拉格朗日乘子法.对 ...

  4. 拉格朗日乘子法和KKT条件

    转自:http://www.cnblogs.com/zhangchaoyang/articles/2726873.html 拉格朗日乘子法(Lagrange Multiplier)和KKT(Karus ...

  5. 第99:真正理解拉格朗日乘子法和 KKT 条件

    转载于:https://www.cnblogs.com/invisible2/p/11441485.html

  6. 拉格朗日乘子法和KTT条件

        这篇博文中直观上讲解了拉格朗日乘子法和 KKT 条件,对偶问题等内容.     首先从无约束的优化问题讲起,一般就是要使一个表达式取到最小值: minf(x)minf(x)     如果问题是 ...

  7. 拉格朗日乘子法 KKT条件

    目录 1. 拉格朗日乘子法用于最优化的原因 2. 最优化问题三种情况 2.1 无约束条件 2.2 等式约束条件:拉格朗日乘子法 2.3 不等式约束条件:KKT 3. Lagrange对偶函数 3.1  ...

  8. 机器学习之拉格朗日乘子法和 KKT

    有约束的最优化问题 最优化问题一般是指对于某一个函数而言,求解在其指定作用域上的全局最小值问题,一般分为以下三种情况(备注:以下几种方式求出来的解都有可能是局部极小值,只有当函数是凸函数的时候,才可以 ...

  9. 直观理解拉格朗日乘子法和Karush-Kuhn-Tucker(KKT)条件

    在最优化问题中,经常是会有约束条件的,而约束条件可分为等式约束条件和不等式约束条件,对于前者,我们有拉格朗日乘子法,对于后者,有KKT条件,对于既有等式约束又有不等式约束的最优化问题,只需要结合拉格朗 ...

最新文章

  1. 打印出所有的 info.plist 中的 keys、values
  2. 一步一图一代码之排序二叉树
  3. redis相关知识记录整理
  4. PDF下载!《Python十大基础专题》《247个Python综合案例》《Pandas 20页学习笔记》...
  5. IntelliJ IDEA 2019 激活码 | 全产品 | 跨平台 | Goland | PhpStorm | Rider | CentOS | Windows
  6. python获取请求中的参数_python – 在Tastypie中获取请求参数
  7. 智慧校园物联网管理平台建设方案2.0
  8. 支付宝支付接口客户端调试工具使用教程
  9. 目标跟踪——Tracking without bells and whistles
  10. Android高级UI系列教程(二)
  11. Android 端app直播源代码,解决系统启动黑屏
  12. Linux内核裁剪机制优化(make menuconfig)
  13. 基于知识图谱的推荐系统(KGRS)综述
  14. 根据 Excel 数据表的内容和 Word 模板文件,批量生成 Word 文档
  15. UE5神通--POI解决方案
  16. 创业失败,是一种怎样的体验?
  17. c语言编程代码五星红旗,飘动的五星红旗
  18. 业务对话机器人Rasa核心算法DIET及TED论文详解
  19. CodeBlocks的下载安装、配置、简单编程
  20. 按键精灵之自动复制粘贴到Excel单元格中

热门文章

  1. hdu 5063 操作逆推+mul每次要*2%(modo - 1)
  2. 景兴纸业和机器人概念_机器人相关股票有哪些?机器人概念股票龙头一览
  3. atoi函数功能以及模拟实现
  4. 使用nordic芯片遇到休眠功耗的问题
  5. 压力,压力,压力真的来了
  6. ubuntu 18.04安装 ros melodic提示: 有一些软件包无法被安装。如果您用的是 unstable 发行版...解决方法
  7. 广义pareto分布_狭义Pareto分布.pdf
  8. XX云应用 nextcloud lychee
  9. 机械师F-117 Ubuntu 安装显卡驱动以及CUDA
  10. JAVA如何调用C/C++动态库