文章目录

  • 前言
  • 一、SVM问题的基本形式
  • 二、拉格朗日对偶算法
  • 这就是一个典型的条件最值问题 (凸优化问题,约束最优化问题)
  • 什么叫做对偶性?
  • 用拉格朗日对偶算法求解SVM的问题
  • 三、对偶性以及强对偶的成立条件
  • KKT条件
  • 四、强对偶的充要条件


前言

上一篇介绍了 一个点到直线距离的向量理解
知道这个点到超平面的距离公式:
点是否直线上 python python 点到直线距离_python
我们为什么要强调这个点的概念呢,很简单,因为这个点表示的就是数据点,也就是模型的特征。有多少个特征也就意味着这个 x 的长度大小 。
接下来将介绍SVM的原理以及详细的 拉格朗日对偶问题 推导过程。

一、SVM问题的基本形式

以二分类为例子
对于一组已经知道的数据集点是否直线上 python python 点到直线距离_机器学习_02其中

  • x 表示为特征向量点是否直线上 python python 点到直线距离_机器学习_03表示有k个特征.
  • D 中有N 个数据样本。
  • y表示的是改数据集的标签 label ,点是否直线上 python python 点到直线距离_python_04点是否直线上 python python 点到直线距离_python_05 分别标记为二分类的两个类。
    为什么一个是+1,一个是-1?
    前面我们推导过计算点到直线的距离的时候要再分子加个绝对值,这是因为一个超平面必然会划分出两个半空间,超平面是一个等于0 的方程。在超平面的上方的为正,则在下方的为负数。所以将一类标记为+1,一类标记为-1 时,可以化掉绝对值符号,用来表示距离:
    点是否直线上 python python 点到直线距离_python_06

点是否直线上 python python 点到直线距离_支持向量机_07


由上图可知,要区分D中的两个类目标就是找出一个合理的超平面,图中的直线就是一个超平面。这个超平面必须具备两个功能。

1. 尽可能地让两个类别分在两个不同的半空间。
2. 两个类的点到超平面的距离越大越好。
超平面可以表示为:

点是否直线上 python python 点到直线距离_机器学习_08

显然两个半空间就是

点是否直线上 python python 点到直线距离_支持向量机_09点是否直线上 python python 点到直线距离_点是否直线上 python_10

在SVM问题中,这由于标签 y 标记为+1 ,-1 ,在数学上这两个半空间需要做小小改动。也就是:

点是否直线上 python python 点到直线距离_机器学习_11

为什么需要这样改动?/为什么是1?

这是因为要描述最优的超平面,最优在这里的含义就是尽可能地讲连个类别分开。在距离上定义上版空间要>1 ,下半空间<-1 是为了引出一个两个平行直线之间的 间隔 这一概念,然后“两个分类的数据点点到划分超平面的距离越远越好”问题就可以转换为 间隔越大越好。如图:

点是否直线上 python python 点到直线距离_机器学习_12


这样很容易得到这个间隔的大小为点是否直线上 python python 点到直线距离_机器学习_13,也就是优化的目标。

“尽可能地让两个类别分在两个不同的半空间。”则是优化的约束条件,不能让样本点落在间隔之内。

也就是样本点到超平面的距离大于1,也就是:点是否直线上 python python 点到直线距离_支持向量机_14

为什么是1?不用纠结这个数值,他就是表示一个“间隔”的意义,后面我们知道只需要最小化分母即可,与分母无关,这是一种问题的等价思想。

将它表示为凸优化问题:

点是否直线上 python python 点到直线距离_数据集_15

最大化点是否直线上 python python 点到直线距离_机器学习_13, 在凸优化问题上与最小化分母点是否直线上 python python 点到直线距离_点是否直线上 python_17是等价的。因此就可以得出SVM 问题的基本形式:
点是否直线上 python python 点到直线距离_支持向量机_18

二、拉格朗日对偶算法

这就是一个典型的条件最值问题 (凸优化问题,约束最优化问题)

  • 插上一句:如果你学过高数,求解一个条件最值问题的时候,通常用拉格朗日乘子法来解。
    1.构造拉格朗日函数,
    2.分别求各个参数的一阶偏导数=0,
    3.分情况讨论,求解最值。
  • 在最优化理论里面步骤3就是作为的KKT条件。

什么叫做对偶性?

  • 回顾语文:对偶的修辞手法。“海阔凭鱼跃,天高任鸟飞。”这就是对偶。
  • 那么拉格朗日的对偶性也是同样的含义:
    简单来说: 一个极小极大问题,它的对偶问题就是极大极小问题。
    以下latex 图片识别次数有限。手推了。

点是否直线上 python python 点到直线距离_数据集_19

用拉格朗日对偶算法求解SVM的问题

点是否直线上 python python 点到直线距离_支持向量机_18

构造拉格朗日函数:

点是否直线上 python python 点到直线距离_点是否直线上 python_21

原问题是拉格朗日函数的极小极大,则其对偶问题是拉格朗日函数的极大极小。

点是否直线上 python python 点到直线距离_支持向量机_22

因此SVM问题的对偶算法求解思路是:

  1. 构造拉格朗日函数点是否直线上 python python 点到直线距离_python_23
  2. 求一阶偏导数=0的x,代入拉格朗日函数,目的是找到最小的点是否直线上 python python 点到直线距离_python_23使得求出对偶函数:
  3. 点是否直线上 python python 点到直线距离_支持向量机_25

  4. 转化为通过优化拉格朗日乘子来优化出最大的对偶函数问题:
  5. 点是否直线上 python python 点到直线距离_机器学习_26

具体步骤:

  1. 非等式约束一律化为左边<= 右边的形式
    点是否直线上 python python 点到直线距离_机器学习_27
  2. 构造拉格朗日函数:

化简一下等价于:

点是否直线上 python python 点到直线距离_支持向量机_28

  • 求w,b 的一阶偏导数,并且令一阶偏导数为0 得到:


    即可得到:
  • 将上面等式代入原拉格朗日函数即可得到对偶函数:

    所以对 对偶函数 优化 点是否直线上 python python 点到直线距离_数据集_29
    对偶问题描述:

三、对偶性以及强对偶的成立条件

KKT条件

  • 先看下面的 【 对偶问题 , 拉格朗日函数 , 原问题的关系】
  • 原问题和对偶问题等价时,就是强对偶,即存在对偶最优解和原问题最优解等价,要先知道中间这个等号成立的条件是什么。

点是否直线上 python python 点到直线距离_点是否直线上 python_30


回顾下高数里面用拉格朗日乘子法求解条件约束问题的最值问题:

  • 对于约束问题,先构造拉格朗日函数,高数里考试一般是等式约束。
  • 对拉格朗日函数的所有参数都求偏导,然后令偏导为0.得出几个约束条件组。
  • 对符合条件的 解代入原函数,求取最值。
  • 点是否直线上 python python 点到直线距离_机器学习_31

  • 以上为拉格朗乘子法求解条件约束问题最值的步骤。为什么要说这个求解方法?因为这跟KKT条件极其相像。或者说步骤2 的三个约束条件 就是KKT条件。
    求的最值的解一定要符合KKT条件,这是充分条件。
    那么什么是KKT条件呢?KKT条件有三个结构
  • 1.原问题的约束条件
  • 2.对偶问题的约束条件----->非等式约束的拉个朗日乘子
  • 3.互补松弛条件 —>下面细说一下
  • 4.梯度条件 -->偏导为0
    ,对于一个拉格朗日函数来说,是怎么得出其KKT条件的呢?
  • 点是否直线上 python python 点到直线距离_点是否直线上 python_32

  • KKT 条件:
    1.原问题的约束条件:
  • 点是否直线上 python python 点到直线距离_点是否直线上 python_33

  • 2.对偶问题的约束条件:
    这个就是拉格朗日乘子的非等式约束的乘子,要求是大于等于0.所以对偶约束为:
  • 点是否直线上 python python 点到直线距离_机器学习_34

  • 3.互补松弛条件与梯度条件
    这个互补松弛是什么概念呢?这是一个原目标函数的最优解与对偶函数最优解的相等。其中下面公式的点是否直线上 python python 点到直线距离_点是否直线上 python_35表示的是原问题和对偶问题的最优解,那么依照这样的可以得出以下推导:
  • 点是否直线上 python python 点到直线距离_支持向量机_36

  • 从(1)到(2),不难推断出,优化x取最小值的解,必须是最优解
    显然这必要要求这个在最优解取值时一阶偏导数为0,这就是KKT梯度条件。也就是拉格朗日函数的原函数 参数x 的偏导必须为0。
    这就是KKT条件4,梯度条件。
  • 点是否直线上 python python 点到直线距离_数据集_37

  • 这也是为什么拉格朗日乘子法需要求偏导取0 的做法。
    (可能你会问对拉格朗日乘子求偏导又是为何呢?)
    很简单,对拉格朗日乘子求导得到的其实就是KKT条件1 原问题的初始约束条件。
  • 再看(2),到(3),这个步骤成立的条件是什么?我们看其第二项,非等式约束项,拉格朗日乘子与非等式约束相乘,一个为大于等于0,一个为小于等于0,那么这一项必然是小于等于0,也就是:
  • 点是否直线上 python python 点到直线距离_python_38

  • 要使(2)到(3)成立必须要上述不等式条件取等号! 这就是KKT互补松弛条件:
    ![在这里插入图片描述](

以上就是KKT条件,那么与强对偶:

点是否直线上 python python 点到直线距离_支持向量机_39


成立的关系是符合KKT条件?

错,强对偶的解一定符合KKT条件,符合KKT条件的解不一定是原问题的最优解

四、强对偶的充要条件

存在可行解符合SCQ,Slater 条件

Slater条件定义:

对于一个凸问题,若存在 点是否直线上 python python 点到直线距离_数据集_40 ,使得点是否直线上 python python 点到直线距离_python_41那么凸问题和它的对偶问题一定是强对偶。

(relint D 的含义就是既满足不等式约束,又满足等式约束的点集)

这就是强对偶的条件,SCQ 条件还可以用另一句经常听到的话“拉格朗日函数存在鞍点”,但是这也不是充要条件,因为没有鞍点也可以强对偶,拉格朗日函数有鞍点一定是强对偶。这里不在证明。

如果你不懂什么是鞍点,来看一下这个马鞍的形状,来脑补一下极大极小,和极小极大,留给大家思考。

点是否直线上 python python 点到直线距离_点是否直线上 python_42