导航:首页 > 源码编译 > 拉格朗对偶性算法

拉格朗对偶性算法

发布时间:2022-12-17 21:47:21

⑴ 支持向量机(SVM)基本原理

看了很多关于SVM的博客,但是常常只能保存书签之后看,有时候有的博客就突然没了,这里就作为搬运工总结一下之后自己看吧。主要内容来自于:
支持向量机通俗导论(理解SVM的三层境界)

线性回归
给定数据集 , 其中, ,线性回归试图学习到一个线性模型,尽可能地输出正确标记.

如果我们要用线性回归算法来解决一个分类问题,(对于分类,y 取值为 0 或者 1),但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于 0,就算所有训练样本的标签 y 都是 0 或 1但是如果算法得到的值远大于 1 或者远小于 0 的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在 0 到 1 之间。

所以逻辑回归就是一个分类算法,这个算法的输出值永远在 0 到 1 之间.
我们先看二分类的LR,具体做法是:利用sigmoid 函数,将每一个点的回归值映射到0,1之间.sigmoid函数特性如下:

如图所示,令 , 当 z > 0 , z 越大, sigmoid 返回值越接近1(但永远不会超过1). 反之,当z < 0时,z 越小, sigmoid 返回值越接近0(但永远不会小于0).

支持向量机 ,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为 特征空间 上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

线性分类器
给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。如果用x表示数据点,用y表示类别(y可以取1或者-1,分别代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程可以表示为( wT中的T代表转置):

logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
假设函数:

其中x是n维特征向量,函数g就是logistic函数。

图像为:

在超平面w x+b=0确定的情况下,|w x+b|能够表示点x到距离超平面的远近,而通过观察w x+b的符号与类标记y的符号是否一致可判断分类是否正确,所以,可以用(y (w*x+b))的正负性来判定或表示分类的正确性。于此,我们便引出了函数间隔(functional margin)的概念。
定义函数间隔 (用表示)为

而超平面(w,b)关于T中所有样本点(xi,yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔:

但这样定义的函数间隔有问题,即如果成比例的改变w和b(如将它们改成2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),所以只有函数间隔还远远不够。

事实上,我们可以对法向量w加些约束条件,从而引出真正定义点到超平面的距离--几何间隔(geometrical margin)的概念。

假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 ,w 是垂直于超平面的一个向量, 为样本x到超平面的距离,如下图所示:

根据平面几何知识,有

其中||w||为w的二阶范数(范数是一个类似于模的表示长度的概念), 是单位向量(一个向量除以它的模称之为单位向量)。

又由于x0 是超平面上的点,满足 f(x0)=0,代入超平面的方程 ,可得 ,即

随即让此式 的两边同时乘以 ,再根据 和 ,即可算出 :

为了得到 的绝对值,令 乘上对应的类别 y,即可得出几何间隔(用 表示)的定义:

从上述函数间隔和几何间隔的定义可以看出:几何间隔就是函数间隔除以||w||,而且函数间隔y (wx+b) = y f(x)实际上就是|f(x)|,只是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。

对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值。这个间隔就是下图中的Gap的一半。

通过由前面的分析可知:函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放w的长度和b的值,这样可以使得 的值任意大,亦即函数间隔 可以在超平面保持不变的情况下被取得任意大。但几何间隔因为除上了 ,使得在缩放w和b的时候几何间隔的值 是不会改变的,它只随着超平面的变动而变动,因此,这是更加合适的一个间隔。换言之,这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。

于是最大间隔分类器(maximum margin classifier)的目标函数可以定义为

同时需满足一些条件,根据间隔的定义,有

回顾下几何间隔的定义 ,可知:如果令函数间隔 等于1(之所以令等于1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),则有 = 1 / ||w||且 ,从而上述目标函数转化成了:

相当于在相应的约束条件 下,最大化这个1/||w||值,而1/||w||便是几何间隔。

据了解,

由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (al variable) 的优化问题,即通过求解与原问题等价的对偶问题(al problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。

那什么是拉格朗日对偶性呢?简单来讲,通过给每一个约束条件加上一个拉格朗日乘子 ,(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题)

然后令:

容易验证,当某个约束条件不满足时,例如 ,那么显然有 (只要令 即可)。而当所有约束条件都满足时,则最优值为 ,亦即最初要最小化的量。

因此,在要求约束条件得到满足的情况下最小化 ,实际上等价于直接最小化 (当然,这里也有约束条件,就是 ≥0,i=1,…,n) ,因为如果约束条件没有得到满足, 会等于无穷大,自然不会是我们所要求的最小值。

具体写出来,目标函数变成了:

这里用 表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而 又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:

交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用 来表示。而且有 ≤ ,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。

换言之,之所以从minmax 的原始问题,转化为maxmin 的对偶问题,一者因为 是 的近似解,二者,转化为对偶问题后,更容易求解。

下面可以先求L 对w、b的极小,再求L对 的极大。

KKT条件
≤ 在满足某些条件的情况下,两者等价,这所谓的“满足某些条件”就是要满足KKT条件。

要让两者等价需满足strong ality (强对偶),而后有学者在强对偶下提出了KKT条件,且KKT条件的成立要满足constraint qualifications,而constraint qualifications之一就是Slater条件。所谓Slater 条件,即指:凸优化问题,如果存在一个点x,使得所有等式约束都成立,并且所有不等式约束都严格成立(即取严格不等号,而非等号),则满足Slater 条件。对于此处,Slater 条件成立,所以 ≤ 可以取等号。

一般地,一个最优化数学模型能够表示成下列标准形式:

其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。
KKT条件的意义:它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。

而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:

我们这里的问题是满足 KKT 条件的(首先已经满足Slater条件,再者f和gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。

也就是说,原始问题通过满足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对 的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。

对偶问题求解的3个步骤

将以上结果代入之前的L:

得到:

具体推导过程是比较复杂的,如下所示:

最后,得到:

“倒数第4步”推导到“倒数第3步”使用了线性代数的转置运算,由于ai和yi都是实数,因此转置后与自身一样。“倒数第3步”推导到“倒数第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法运算法则。最后一步是上一步的顺序调整。

从上面的最后一个式子,我们可以看出,此时的拉格朗日函数只包含了一个变量,那就是 (求出了 便能求出w,和b,由此可见,则核心问题:分类函数 也就可以轻而易举的求出来了)。

上述式子要解决的是在参数上 求最大值W的问题,至于 和 都是已知数。要了解这个SMO算法是如何推导的,请跳到下文第3.5节、SMO算法。

总结
让我们再来看看上述推导过程中得到的一些有趣的形式。首先就是关于我们的 hyper plane ,对于一个数据点 x 进行分类,实际上是通过把 x 带入到 算出结果然后根据其正负号来进行类别划分的。而前面的推导中我们得到:

因此分类函数为:

这里的形式的有趣之处在于,对于新点 x的预测,只需要计算它与训练数据点的内积即可(表示向量内积),这一点至关重要,是之后使用 Kernel 进行非线性推广的基本前提。此外,所谓 Supporting Vector 也在这里显示出来——事实上,所有非Supporting Vector 所对应的系数 都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。

为什么非支持向量对应的 等于零呢?直观上来理解的话,就是这些“后方”的点——正如我们之前分析过的一样,对超平面是没有影响的,由于分类完全有超平面决定,所以这些无关的点并不会参与分类问题的计算,因而也就不会产生任何影响了。

回忆一下我们通过 Lagrange multiplier得到的目标函数:

注意到如果 xi 是支持向量的话,上式中红颜色的部分是等于 0 的(因为支持向量的 functional margin 等于 1 ),而对于非支持向量来说,functional margin 会大于 1 ,因此红颜色部分是大于零的,而 又是非负的,为了满足最大化, 必须等于 0 。这也就是这些非Supporting Vector 的点的局限性。

至此,我们便得到了一个maximum margin hyper plane classifier,这就是所谓的支持向量机(Support Vector Machine)。当然,到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,不过,在得到了对偶al 形式之后,通过 Kernel 推广到非线性的情况就变成了一件非常容易的事情了(通过求解对偶问题得到最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题”)。

事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM咋处理呢?对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。

具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:

而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是这种类型的函数:

这里ϕ:X->F是从输入空间到某个特征空间的映射,这意味着建立非线性学习器分为两步:

首先使用一个非线性映射将数据变换到一个特征空间F,
然后在特征空间使用线性学习器分类。

而由于对偶形式就是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:

如果有一种方式可以在特征空间中直接计算内积〈φ(xi · φ(x)〉,就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算法的方法称为核函数方法:
核是一个函数K,对所有x,z,满足 ,这里φ是从X到内积特征空间F的映射。

来看个核函数的例子。如下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢(下文将会有一个相应的三维空间图)?

事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用 和 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:

注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 ,那么显然,上面的方程在新的坐标系下可以写作:

关于新的坐标 ,这正是一个 hyper plane 的方程!也就是说,如果我们做一个映射 ,将 按照上面的规则映射为 ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。

再进一步描述 Kernel 的细节之前,不妨再来看看上述例子在映射过后的直观形态。当然,你我可能无法把 5 维空间画出来,不过由于我这里生成数据的时候用了特殊的情形,所以这里的超平面实际的方程是这个样子的(圆心在 轴上的一个正圆)

因此我只需要把它映射到 ,这样一个三维空间中即可,下图即是映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的

核函数相当于把原来的分类函数:

映射成:

而其中的 可以通过求解如下 al 问题而得到的:

这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射

⑵ SVM算法原理

一、决策面方程

以二维空间为例,二维空间中任意一条直线方程可以写为

我们将其向量化,可以得到

设用向量w代表矩阵a1和a2,用向量x代表矩阵x1和x2,标量γ代表b,则方程可化表示为

从方程可知,一个n维空间的超平面在二维空间上的表现,可以是一条直线,或者一个曲线(二维空间中只能看到这个n维超平面穿过而无法看到其模样), 超平面方程即是我们的决策面方程

二、函数间隔和几何间隔

在SVM监督学习中,我们规定标签数据为+1和-1两个值,这么做的目的, 可以计算出任意一个样本点在超平面方程上的表现结果的符号,与标签符号是否一致来判断分类的正确性 ,为此我们可以引入函数间隔的概念

但是当我们成比例的缩放w和γ,函数间隔的值也将成比例的变化,可是超平面的位置并没有发生任何变化,所以函数间隔并不是我们想要的分类间隔,为此,我们需要引入几何间隔的概念

还是以二维空间出发,任意一点到直线的距离可以写成

我们将其拓展到n维空间,直线方程即是我们的超平面方程,则n维空间中任何一点到超平面的距离可以写成

为此,我们引入几何间隔概念,其中||w||表示向量w的二范数

从几何间隔可以看出,就算等比例缩放w和γ,由于除上了||w||使得几何间隔的值不会改变,它只随着超平面位置的变化而变化,因此, 我们要寻找的分类间隔是几何间隔

三、不等式约束条件

SVM算法的目的是找到一个将分类效果达到最合理化的超平面,这个超平面即是分类器 。而评估分类器的好坏的标准就是分类间隔的大小

我们定义分类间隔的距离为d,好的分类器应该让所有样本点到决策面的几何间隔都大于等于d

化简上式,不等式两边同时除以d可得

由于||w||和d都是标量,可定义

则上式可化简为

在不等式两边同时乘以yi,即将两个式子化简为一个式子(这里体现了正是因为标签数据为+1和-1,才方便将约束条件变成一个约束方程)

这个约束方程的意义 即是任何样本点到超平面(分类器)的几何间隔都大于等于分类间隔

四、SVM最优化模型的数学描述

评估分类器的优劣是分类间隔的大小,且对于任意样本点都满足约束方程

由约束方程可知,当样本点落在支持向量边界上有如下关系

则分类间隔d可以表示为支持向量点到超平面的几何间隔

要让任何样本点都在d之外,即求分类间隔d的最大值,则目标函数可以写成

为了方便在后续最优化处理中对目标函数的求导,我们将目标函数做等效变化

由目标函数是二次的,而约束条件是线性的,则 SVM的数学模型即是:不等式约束条件下的二次型函数优化 ,而求解这一类优化问题,接下来我们需要构造 拉格朗乘子函数

五、引入拉格朗函数

目标函数是求解在约束条件g(x)下的二次型函数f(x)的最小值,直观上我们希望构造一个函数L(x),使得L(x)在f(x)的可行解区域内的求出的值和f(x)求出的值完全一样,而在f(x)的可行解区域外,L(x)的值又接近无穷大,这么做的目的,使得我们可以用一个函数L(x)来等效表示原问题的g(x)和f(x)

拉格朗函数的目的,就是将约束条件融合到目标函数中,构造一个新函数来表示目标函数,将有约束的优化问题转化为无约束的优化问题

下面,我们构造拉格朗函数来表示目标函数

其中αi是拉格朗日乘子,每一个约束条件对应一个拉格朗日乘子,其中αi大于等于0

则原优化问题可以转化为

讨论如下条件(1)(2):

(1) 当样本点不满足约束条件时,即说明在 可行解区域外

此时将αi置为正无穷大,那么θ(w)显然也是正无穷大

(2) 当样本点满足约束条件时,即说明在 可行解区域内

此时θ(w)的最小值就是原目标函数,于是综上所述,引入拉格朗乘子函数后,可以得到新的目标函数

我们用p*表示优化目标函数后的最优解,且与最初的目标函数等价

观察新的目标函数,如果直接求偏导数求解,那么一上来将面对w和b两个未知参数,而αi又是不等式约束,求解过程将非常复杂。换一个角度思考,如果将max和min的位置对调,变成如下新的目标函数

上式变化使用了 拉格朗日函数的对偶性,交换后的新问题即是原目标函数的对偶问题 ,我们用d*来表示对偶目标函数的最优解,可见d*的求导过程比p*相对容易,且d*<=p*,而当满足下列条件时,d*= p*

因为目标函数本身已经是一个凸函数,而优化问题又是求解最小值,所以目标函数的最优化问题就是凸优化问题,则接下来就要重点讨论KKT条件

六、KKT条件的描述

一个最优化模型能够表示成下列标准形式

其中f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,m和n分别是等式约束和不等式约束的数量

KKT条件即是规定f(x)的 最优值 必须满足以下(1)(2)(3)条件, 只有满足KKT条件,目标函数的最优化问题依然可以用拉格朗日乘子法解决

很明显,我们需要优化的目标函数属于带有不等式约束函数g(x),所以条件二显然满足,下面我们来分析条件一和条件三的理论

七、目标函数的等高线与约束条件的最优值分析(条件一)

对于KKT条件一的分析,我们假设目标函数是f(x1,x2)的二元函数,它的图像在三维空间里是一个曲面,准确的来说是一个凸曲面

其中g(x1,x2)是约束方程,要求目标函数f(x1,x2)的最小值,即转化为 求g(x1,x2)=c这条曲线上的一点,使得f(x1,x2)取得最小值,换个比喻,就是在山上(目标函数曲面)寻找一条山路(约束条件曲线)的最低点

我们画出目标函数的等高线,来分析目标函数最优值和约束条件的关系

对于研究目标函数z=f(x1,x2),当z取不同的值,即将曲线z投影在(x1,x2)组成的空间中(这里指的是二维空间),也就是曲面的等高线,上图中d1和d2即是两条目标函数的等高线,可以看出,当约束函数g(x1,x2)与目标函数的等高线有共同的交点, 即证明这组值同时满足在目标函数的可行域中,也符合约束条件的约束关系

如果等高线与g(x1,x2) 相交 ,则是一组目标函数的解,但是这个解一定不是最优解, 因为相交意味着肯定存在其它等高线在该条等高线的内部或者外部 ,可能会使得新的等高线与g(x1,x2)的交点更大或者更小,这就意味着只有当等高线与g(x1,x2) 相切 ,才可能得到最优解(切线可能多条)

所以最优解必须满足: 目标函数的负梯度方向与约束函数的梯度方向一致

而上式恒成立的条件就是: 拉格朗日乘子α >= 0 ,且这个式子就是目标函数对各个参数求偏导数的结果,即KKT的第一个条件:目标函数对各个参数的导数为0

八、分类讨论约束条件和拉格朗日乘子的组合(条件三)

对于KKT条件三,可以看出,因为所有的约束函数gi(x)<=0,所有的拉格朗日乘子αi>=0,要使得求和后结果为0,要么某个约束函数gi(x)=0,要么其对应的αi=0

从一个案例出发来分析KKT条件三的逻辑,假设目标函数和约束函数是

将不等式约束构造出拉格朗日函数,并分别对x1和x2求偏导数

而KKT的条件三要求最优解满足 ∑α*g(x) = 0,在这个案例里α和g(x)只有一个,结合条件一,可以得到

根据之前的分析,最优值满足条件三的话,要么α=0,要么g(x)=0

(i):如果α=0,则x1=1,x2=-2,代入g(x1,x2) =10-1-10*(-2)=29>0,发现这组解违背了约束函数g(x)<0,则舍弃这组解

(ii): 如果g(x1,x2)=0,则代入x1和x2的表达式到g(x)中,解出α=58/101>0,发现这组解不违背约束函数,则代入α解出x1=130/101,x2=88/101,则这组解有可能是最优解

综上(i)(ii)讨论,目标函数的最优值符合KKT条件三,也说明了 满足强对偶条件的优化问题的最优值必须满足KKT条件

九、求解对偶问题

上面分析了目标函数满足凸优化和KKT条件,则问题转化为求解原问题的对偶问题(即p*=d*)

根据对偶问题描述,先要求内侧w和b关于L(w,b,α)的最小化值,即求L对w和b的偏导数

将w和b的偏导数带入拉格朗函数化简得

整理一下最终化简结果为

从上述结果可以看出,样本的x和y是已知的,此时的 L(w,b,α)函数只有一个变量,即αi

我们归纳一下现在的目标函数为

现在目标函数变成了如上形式,其中αi>=0,这里隐含着一个假设,即数据100%线性可分,但是现实生活中,数据往往是不会那么规则的线性化,为此我们需要引入松弛变量

十、引入松弛变量

由于现实世界中的数据都是带有噪音的,也就是数据可能出偏离其正常的位置很远,而出现这种极端现象后往往会影响超平面的选择,也许将无法构造出将数据彻底分开的超平面出来

所以对于处理这种情况, SVM需要允许(妥协)出某些噪音很大的数据点能够偏离超平面,即允许其出现在超平面的错误的一侧 ,为此我们引入松弛变量C,这样我们的目标函数又变为

接下来为了研究讨论αi的取值范围,我们加上一个负号将目标函数等价转化为

十一、讨论拉格朗乘子的取值意义和其值域

回顾一下最初的约束条件为

设ui为该约束条件,可以归纳出αi关于约束函数的取值意义

αi只有满足上述3种情况,才能求出最优解,所以 当αi与约束条件ui冲突的时候,需要更新这些αi ,这也就是满足目标函数的第一个约束限制,即0<=αi<=C

而同时目标函数还受到第二个约束条件的限制,即

所以不能只更新一个αi因子,需要同时再次更新第二个αj因子,也就是 α因子总是成对的更新(αi对总是和αj配对),一增一减,此消彼长,才能保证加权和为0的约束 ,同时这也就是下面提及SMO算法的思想和多元函数化简为二元函数,在从二元函数化简为一元函数的难点

根据这个约束和α因子需要成对更新,假设我们选取的两个拉格朗乘子为α1和α2,则更新之前是old,更新之后是new,且更新前后需要满足和为0的约束

两个因子同时更新显然非常困难,所以需要先求出第一个αj的解,再用αj的解去表示更新第二个αi的解 ,后文的SMO算法会阐述这一点。因此需要先确定αj的取值范围,假设L和H分别为它的下界和上界,结合目标函数的约束限制来综合讨论L和H的取值关系

(i):当y1和y2异号时,可以得到

移项可得a2 = a1 - A,此时α的取值范围如下图所示

所以此时α的上下界H和L为

(ii):当y1和y2同号时,可以得到

移项可得a2 = -a1 + A,此时α的取值范围如下图所示

所以此时α的上下界H和L为

综上(i)(ii)的讨论,通过y1和y2的异号或者同号,可以推导出α更新后的上下界分别为

这个公式显得非常的重要,它将α因子限制在有效的矩形范围内,在SMO算法中,当我们更新完α后,由于α可能会被更新得很大或很小,因此需要经过裁剪来保证α的在约束条件内

12、SMO算法的思想

回顾之前第九,第十,第十一步的分析,目标函数为

目标函数只包含n个变量α的 多元函数 ,且带有两个约束条件,我们的 目的是求出目标函数的最小值,即找到一组α的组合,使得目标函数取得最小值

由第十一步的分析,我们需要不断更新这n个α因子,通过迭代来逼近函数达到最小值,但是如果一次性更新n个参数,将会有n!种组合,那么时间复杂度将会非常高,为此我们首先想到 坐标上升(下降)法

来通过一个例子来说明坐标上升法的思路

可知案例中要求一个三元函数的最大值, 算法的思想是每次迭代时只更新一个维度,通过多次迭代直到收敛来优化函数的最值 ,求出三个变量的偏导数推出其关系

通过迭代即就可以求出其最值

SMO算法借鉴了坐标上升(下降)法的思想来优化α因子组合,但是由于目标函数的第二个约束条件有加权和为0的限制,导致每次迭代时候不能只更新一个因子αi,必须同时更新与之配对的另一个因子αj,此消彼长才能保证加权和为0(第十一步中已提及)

所以SMO算法思想是将原始问题中,求解n个参数的二次规划问题,分解成了多个子二次规划问题来分别求解,每一个子问题只需要求解2个参数,即将多元函数推导为二元函数,再将二元函数推导为一元函数

13、多元函数推导为二元函数

目标函数是关于α的N元函数,通过SMO的算法思想,假设每次迭代更新,选取一对α1和α2的组合,其余的乘子不变, 首先需要将α1和α2从目标函数中分离出来 ,也就是将多元函数推导为二元函数

从N元函数中分离出α1和α2因子

由于上式推导结果过于复杂,我们定义2个表达式来表示上式常量部分,用来简化上式

又由于单独存下的常数项对以后的求导没有贡献,所以我们提出单独的常数项定义为Constant

带入vi和Constant表达式,则结果化简为

至此,我们将 多元函数推导为含有α1和α2变量的二元函数 ,接下来将这个二元函数推导为一元函数

14、二元函数推导为一元函数

我们需要推导出α1和α2的关系,然后用α2来表示α1带入二元函数,就可以推导出关于α2的一元函数了

由目标函数的第二个约束条件

同理根据SMO算法思想,从约束条件中分离出α1和α2

将等式两边同时乘以y1,可推导出α1和α2的关系

同理,我们定义两个表达式r和s来表示上式的常量部分,用来简化上式关系

带入r和s后,α1和α2的关系推导为

下面将α1带入我们的二元函数中,可得

至此, 我们将二元函数推导为只含有一个变量α2的一元函数 ,接下来终于可以对目标函数求导了

15、求解一元函数的偏导数,推导出第一个拉格朗乘子的递推关系

我们对一元函数求α2的偏导数为0

带入s=y1*y2和y2*y2=1,整理上式可求出α2

⑶ 拉格朗日对偶性

在约束最优化问题中,拉格朗日对偶性将原始问题转换为对偶问题,通过解对偶问题而得到原始问题的解。该方法在统计学习方法中得到广泛的应用

假设 f(x),ci(x),hj(x) 是连续可微函数,考虑约束最优化问题:

讨论原始问题与对偶问题的关系:

《统计学习方法》李航

⑷ 求解原始问题和对偶问题常用的优化算法有哪些

1. 支持向量机的目的是什么?
对于用于分类的支持向量机来说,给定一个包含正例和反例(正样本点和负样本点)的样本集合,支持向量机的目的是寻找一个超平面来对样本进行分割,把样本中的正例和反例用超平面分开,但是不是简单地分看,其原则是使正例和反例之间的间隔最大。
超平面是什么呢?简单地说,超平面就是平面中的直线在高维空间中的推广。那么,对于三维空间,超平面就是平面了。对于更高维的空间,我们只能用公式来表达,而缺少直观的图形了。总之,在n维空间中的超平面是n-1维的。
超平面的公式为。公式中的w为可以调整的系数向量,b为bias。注意我们的表达习惯,所有的向量都是列向量,所以在第一项的内积中向量w需要进行转置。
现在考虑样本集合{xi,di},xi是输入的特征,di是样本对应的分类。现在规定当样本xi属于第一类时,di为1,当xi属于第二类时,di为-1。
那么,线性可分的意思就是一个超平面可以把两类样本完全地分割开来。用公式表达就是:

你现在可能会问,那么如果不是线性可分的情况应该怎么办呢?事实是这些会在后面处理到。在这里我们首先讨论线性可分的情况,然后将其拓展到线性不可分的情况.
现在假设对于线性可分的样本集,我们有了一个分割超平面,现在我们想通过调整w0和b0让它分割的正样本和负样本保持最大的间隔,这样我们就获得了最优的超平面。实际上在操作过程中,我们最大化的是离超平面最近的点到超平面的距离。也就是说,我们要让超平面尽量远离最近的点。从图中可见超平面到正样本最近点的距离和超平面到负样本最近点的距离是相等的。这是个巧合么?
假设我们已经找到了一个超平面,它离正样本最近点的距离大于离负样本最近点的距离,那么这个离超平面最近的点就是负样本中的最近点。而考虑到我们的目标,我们还会调整超平面的位置使它还可以增大一些,即使这样会牺牲离正样本最近点的距离。所以调整到最后的结果肯定是超平面离两侧最近点的距离是等距的。

为了更形象地表现正负样本的间隔,我们可以在分割超平面的两侧再定义两个超平面H1和H2(如图中虚线所示),这两个超平面分别通过正样本和负样本中离分割超平面最近的样本点(图中加了外圈)。从以上分析可以知道,超平面H1和H2离分割超平面是等距的。
我们定义超平面H1和H2上面的点叫做支持向量。正负样本的间隔可以定义为超平面H1和H2之间的间隔,它是分割超平面距最近正样本点距离和最近负样本点距离之和。
从图中可以看出,支持向量对于分割超平面的位置是起到关键作用的。在优化分割超平面位置之后,支持向量也显露出来,而支持向量之后的样本点则对分类并不关键。为什么这样说呢?因为即使把支持向量以外的样本点全部删除,再找到最优的分割超平面,这个超平面的位置跟原先的分割超平面的位置也是一样的。总结起来就是:
支持向量包含着重构分割超平面所需要的全部信息!
2. 样本点到超平面距离的表示
如何求一点到超平面的距离呢?
现在我们来看看系数向量w0是什么含义?回忆一下,w0实际上是超平面的法向量!
那么,对于任意一个样本点x,它可以表示为:

其中xp是x在超平面上的投影,r是x到超平面的几何距离(几何间隔)。
设 ,
现在由定义有g(xp)为0,则有。
现在我们开看,g(x)实际上度量了样本点x到超平面的距离,在||w0||恒定的情况下,g(x)绝对值的大小反映了几何间隔r的大小。我们给g(x)起个名字叫做函数间隔。注意几何间隔r和函数间隔g(x)都是有正负号的,代表着处于超平面的不同侧。

3. 最大化间隔
我们已经知道了函数间隔和几何间隔的表示,现在回到正题,我们需要最大化支持向量到分割超平面的距离,当然在最开始我们不知道哪些向量是支持向量。
我们的目的是最大化支持向量到分割超平面的几何间隔r,而不是最大化函数间隔g(x),为什么呢?因为超平面方程的系数可以同比例增大或者减小,而不改变超平面本身。所以||w0||是不固定的,这就会影响函数间隔g(x)的大小。
所以我们需要最大化的是几何间隔r,这等价于我们固定||w0||,然后最大化函数间隔g(x)。但是实际上我们不会这么做,通常的处理方法是固定函数间隔g(x)的绝对值为1,然后最小化||w0||。也就是说我们把支持向量到分割超平面的函数间隔g(x)的绝对值设定为1,然后最小化||w0||。

4. 正式的表述
现在我们可以正式地表述这个问题了。我们需要最小化||w0||,也就是最小化超平面权重向量w0的欧几里得范数。但是有没有限定条件呢?还记得上一节最后一句话么?
“也就是说我们把支持向量到分割超平面的函数间隔g(x)设定为1,然后最小化||w0||”
所以最小化||w0||是有限定条件的,如何表述限制条件呢?我们把支持向量对应的g(x)定为+1或者-1(取决于支持向量处于分割超平面的哪一侧,也就是说是正样本还是负样本),也就表明了对于所有的正样本点来说,g(x)是>=+1的,而对于负样本来说,g(x)是<=-1的。
回想g(x)的定义:

我们可以把限制条件写下来:

现在我们可以把上面的问题写的更简练:
目标函数:

限制:

1/2是为了以后计算方便所加的,N是样本点的个数。
现在我们的第一个任务结束了,我们把要寻找最优的分割超平面的问题转化为带有一系列不等式约束的优化问题。这个最优化问题被称作原问题。我们不会直接解它,而是把它转化为对偶问题进行解决。至于如何将其转化为对偶问题,这是以后几节的内容。
等式约束极小的最优性条件
对支持向量机的求解都是将上节说的原问题转化为对偶问题进行求解的,这些内容都是最优化课程中的内容。
回忆上节的内容,我们的目标是寻找函数在若干约束条件下的最小值。在上节的原问题中,约束条件是包含不等式的,本节先考虑简单的问题,即考虑只包含等式约束的最优化问题:
(1)
其中f(x)被称作目标函数,而下面是一系列的等式约束。回想一下,当没有任何约束存在的时候,应该怎样寻找最优点呢?事实上x*是最优点的必要条件是:

而如果函数f(x)是凸函数的话,这个条件也是充分条件。
插入一个说明,如果函数f(x)是一个实值函数,x是一个n维向量,那么f(x)对向量x的导数被定义为:

回到目前的问题,当我们寻找约束存在时的最优点的时候,约束的存在虽然减小了需要搜寻的范围,但是却使问题变得更加复杂。为了使问题变得易于处理,我们的方法是把目标函数和约束全部融入一个新的函数,即拉格朗日函数,再通过这个函数来寻找最优点。
为了形象化地分析这个问题,我们考虑目标函数是三变量的函数并且只有一个约束的情况:
(2)
从几何上来看,上面的问题(2)就是从曲面上来寻找函数的最小值。假设问题(2)的最优解是。我们现在做曲面Ω上任一条通过点x的光滑曲线l:(由于曲线l是在曲面Ω上的,所以自然有)。
令最优点对应的t为t*。因为x*是曲面Ω上的最优点,所以x*也是曲线l上的最优点,所以t*是一元函数的最优点,所以在这一点它的导数是0。通过链式法则我们得到:

这个式子说明了在x*这一点,函数的梯度向量 和曲线l在x*处的切线是垂直的。由于曲线l是任意的,所以梯度向量和曲面Ω是垂直的。
回忆高等数学的结论,的方向就是曲面Ω的法线方向,所以和必然在同一直线的方向上,所以必定存在一个常数μ*,有。
我们可以把它写成更加精炼的形式。如果我们构造二元函数,上面的结论就可以表达为必定存在着常数μ*,使。
我们把构造的函数称作拉格朗日函数,而其中的μ称作拉格朗日乘子。

关于只有等式约束的拉格朗日函数的引入,也可以参考维基网络中的两个变量函数的例子。
以上是一个特殊情形的分析,并且只包含了一个约束。那么包含等式约束的一般情况,也就是问题(1)来说,我们同样可以构造拉格朗日函数,不过由于包括多个等式约束,表达稍微不同:

也就是说,每一个等式约束都对应着一个拉格朗日乘子。那么x*是最优点的必要条件就是,存在相应的拉格朗日乘子μ*,使得以下两个式子成立:
(实际上就是原问题(1)的约束条件换了种写法)
这两个式子就是最优点的必要条件,当然如果函数是凸函数的话,这两个式子也是充分条件。
现在我们的目标达到了,也就是把目标函数和一系列的等值约束融合到了一个函数(拉格朗日函数)里面,这样只需要解(3)和(4)这两个式子就可以找到最优点,其优点是不言而喻的。而在下一节中我们将会讨论包含不等式约束的最优化问题。
寻找最优值的下界
我们首先要引入包含不等式约束的优化问题,标准形式如下:
(1)
f(x)是目标函数,而后面分别是一系列的不等式约束和等式约束。
我们首先明确几个概念:
可行点(可行解):所有满足约束的点x。
可行域:所有可行点组成的点集,记为R。正式写出来就是:

最优点(最优解):满足约束(也就是处于可行域之内)并且使目标函数达到最小的点,记为x*。
最优值:如果找到了x*,p* = f(x*) 就是最优值。
明确了这些概念以后我们就接着说下面的内容了。
与上节所说的只包含等式约束的情况类似,我们定义拉格朗日函数如下:

我们来看看,这与上节的拉格朗日函数有什么不同?多了一系列的不等式约束对应的项,所以也多了一系列的拉格朗日乘子。在这里需要强调的是,所有的λi必须是大于等于0的(也即是不等式约束对应的乘子要求大于等于0,我们记为λ≥0,意思是每个都λi≥0)。至于为什么要这样要求,后面自然可以看出来。
接下来我们定义一个重要的函数,我们定义拉格郎日对偶函数(the Lagrange al function)如下:
(2)
所以拉格朗日对偶函数就是把看成x的函数所找到的最小值。找到这个最小值有什么意义呢?
我们先把结论写下来,这个结论十分重要,是本节论述的目的:
对偶函数产生了原问题(1)最优值p*的一个下界,也就是说,对于任意的λ≥0和任意的μ来说,有:
(3)
那么如何证明(3)呢?
这个证明步骤十分简洁。假设x*是原问题(1)中的最优解,也就是f(x*) = p*。

最后两行的推导是考虑到x*是在可行域R内的,所以肯定有,当然前提是λ≥0,这也就是为什么在一开始要做这个规定的原因了。
我们如何理解这个不等式(3)呢?下面给出两个直观的解释:
解释一:线性逼近的解释

我们首先重写问题(1),就是把问题(1)换个更加紧凑的方式来表达,首先我们定义示性函数:

同样我们也可以定义另外一个示性函数:

有了这两个示性函数的帮助,现在我们可以把问题(1)重新写成一个没有约束的形式:
(4)
我们来看看这个优化问题(4)和问题(1)是等价的么?我们可以把(4)的后面两大项看做是对违反约束条件的x的惩罚函数。起的作用是对违反不等式约束的x进行“无限的”惩罚,也就一旦,惩罚就等于无穷大。而起的作用是对违反等式约束的x进行惩罚,一旦,惩罚就为无穷大。这样对(4)中目标函数的优化跟对(1)中目标函数在约束条件下的优化就是同一回事,是不是?也就是说,(1)和(4)这两个问题是等价的问题,但是在(4)中约束被融合到目标函数中来了。

现在我们再回头看看(2),也就是拉格朗日对偶函数,它也是个优化问题,我们对比它所优化的函数和(4)中所优化的函数,把它们重写在一起:
(2)中的目标函数
(4)中的目标函数
可见在问题(2)和问题(4)中,我们优化的目标函数区别在于惩罚项不同,(4)中的惩罚项是无限的,就是说一旦违反约束,就施加无穷大的惩罚;而在(2)中我们的惩罚项是线性的,就是说随着gi(x)和hi(x)的不同,惩罚项是线性变化的。所以(2)和(4)中需要优化的目标函数有很大的不同,用(2)来逼近(4)是很不准确的。但是我们可以看出,对于任意的u,任意的λ≥0和任意的μ来说都有:
(我们把λ限制为大于等于0了)
所以在任意点,(2)中的目标函数的值都是小于(4)中的目标函数的值,所以(2)中找到的最优值肯定是小于(4)中找到的最优值的。再结合前面说的(1)和(4)是等价的问题,所以不等式(3)是成立的。

解释二:交换max和min的次序
我们首先可以看出:

为什么会有这个结果呢?当x满足约束的时候,也就是对所有的i来说有并且,如果我们想通过调整λ和μ让变大怎么办呢?只有让λ全部为0(注意λ只能大于等于0),这样就消去了小于0的项,至于,无论μ怎么变都是没有影响的。所以当x属于可行域的时候上式的结果是f(x)。如果x违反了约束呢?在做sup运算的时候只需要对满足和的项对应的乘子定为+∞,而把其他的项对应的乘子设为0,就可以让整个式子的结果变为无穷大。
所以我们可以看出来,在问题(1)中的带约束的优化问题和直接优化是一回事,也就是说:

现在我们把inf和sup两个运算符调换次序,显然有:

我们重写(2)式:
(2)
可以看出结论了,也就是λ≥0时(3)式成立:
(3)
好了,费了半天的劲我们说明了一个问题,就是不等式(3)是怎么来的。
总结一下,不等式(3)用文字叙述就是:
如果我们把拉格朗日函数看做是x的函数,然后取下确界(注意:是在整个定义域里取下确界,而不是仅仅在可行域里取值,也就是说取下确界时对x是没有约束的),那么得到的结果就是原优化问题(1)的最优值的一个下界。

至于我们得到这个结果有什么用,下节再说。
对偶问题
回忆上一节,对如下的原问题:
(1)
我们定义了拉格朗日对偶函数:

然后我们证明了:,其中p*是原问题的最优值。
也就是说我们找到了原问题最优值的一个下界。既然我们找到了一个下界,显然我们要找到它最好的下界。什么是最好的下界的?显然就是所有下界当中最大的那一个。所以我们要把最大化,当然我们还要记得我们需要限制。我们把要优化的函数和约束条件正式写下来就是:
(2)
与原问题(1)相对应,我们把上面的问题(2)称作拉格朗日对偶问题(Lagrange al problem)。显然,对偶问题的最优值d*就是我们可以获得的p*的最优下界,也就是所有下界中离p*最近的一个,它们的关系是:
(3)
我们把这个不等式叫做弱对偶性质(Weak Duality)。
顺其自然,我们可以引出一个重要的概念,对偶间隙,其定义为,用文字叙述就是原问题的最优值与通过拉个郎日对偶函数获得的其最好(最大)的下界之差。由不等式(3)可以看出,对偶间隙肯定是大于等于0的。
那么有没有可能在某种情况下,对偶间隙消失了呢?也就是说对偶问题的最优值与原问题的最优值相等了呢?
我们将要叙述一下Slater条件:
Slater条件:
存在x满足:
Slater条件即是说存在x,使不等式约束中的“小于等于号”要严格取到“小于号”。
可以证明,对于凸优化问题(关于凸优化问题,请参考维基网络),如果Slater条件满足了,则:

这种情况称为强对偶性质(Strong Duality)。
下面的问题是,如果对偶间隙消失了,会发生什么有趣的现象呢?
如果对偶间隙消失了,也就是说,如果对偶问题存在着最优点λ*,μ*并且使其对应的最优值等于p*,这时会发生什么情况呢?还记得上一节我们证明的过程么:
(4)
在对偶间隙消失的情况下,中间所有的不等号都要变成等号:
(5)
注意,(5)中的λ和μ都加了星号,表示它们是对偶问题的最优点。(5)中有两个重要的等号,已经加了标记。
我们能得出什么结论?
1 .我们先来看等号1:
它说明了原问题的最优点x*是使取得最小值的点。
2. 我们再来看等号2:
它说明了:

由于我们限制了每一个λi≥0,所以上式中每一项都是非正的。这样我们又可以得出结论:
(6)
等式(6)被称作是互补性条件,我们可以把它换种写法:

或者写成它的等价形式(逆否命题):

也就是说,只要一个不为0,另一个就必为0!
互补性条件有着重要的意义。它说明了当时,x*是处于可行域的内部的,这时不等式约束并不起作用,此时;而的点肯定是可行域边界的点()。也就是说只有积极约束才有不为0的对偶变量。而这在支持向量机中有着重要的意义。回想在第一节我们最后的结论,支持向量机寻找最大间隔超平面可以归结为一个优化问题:
目标函数:

限制:

那么哪些不等式约束对应着不为0的对偶变量呢?显然,只有当时,这个约束对应的对偶变量才可能不为0,而意味着什么?意味着这个约束对应的样本点xi是支持向量!也就是说:
只有支持向量才对应不为0的拉格朗日乘子!

⑸ 如何求拉格朗日对偶问题中的参数

任何优化问题的拉格朗日对偶函数,不管原问题的凸凹性,都是关于拉格朗日乘子的凹函数 为理解这个问题,首先有个结论:对于一凹函数族F:{f1,f2,f3...},取函数f在任意一点x的函数值为inf fi(x),即F中所有函数在这一点的值的下限,则f为凹函数。

⑹ 支持向量机(SVM)

参考Jerrylead 和 july-支持向量机通俗导论

再回忆一下逻辑回归:Logistic回归目的是从特征学习出一个0/1分类模型,而 这个模型是将特征的线性组合作为自变量 ,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数) 将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率

中间那条线是θ T x=0,logistic回归强调 所有点 尽可能地远离中间那条线。学习出的结果也就中间那条线。
但是:
考虑上面3个点A、B和C。从图中我们可以确定A是×类别的, 然而C我们是不太确定的 ,B还算能够确定。这样我们可以得出结论, 我们更应该关心靠近中间分割线的点,让他们尽可能地远离中间线,而不是在所有点上达到最优(引出了下面的函数间隔与几何间隔)

我想这就是支持向量机的思路和logistic回归的不同点:
支持向量机考虑局部(不关心已经确定远离的点),
逻辑回归一个考虑全局(已经远离的点可能通过调整中间线使其能够更加远离,但是也可能使一部分点靠近中间线来换取另外一部分点更加远离中间线。)

上面已经知道,θ T x=0是分类的线,在svm中,只考虑局部,只考虑θ T x的正负问题,而不用关心g(z)。因此,在这里,用w T x+b代替θ T x,并 对g(z)做一个简化 ,将其简单映射到类别标签y=1和y=-1上。

这里的y取值为1和-1(在svm中,只考虑局部,只考虑θ T x的正负问题),是为了方便定义:在分类正确的情况下,函数间隔(确信度 )的大小

比如,在分类正确的情况下,y等于1,wx+b应该为正数越大,则情况越好,是正例的确定度就越大。就如上图的A点。y等于-1,wx+b应该为负数越大,则情况越好是负例的确信度就越大。

所以, 函数间隔越大,说明分类正确的置信度越大。函数间隔越小 ,比如上图c点,说明越不能确定c点属于哪一类。

可以为 别的值,只是为了方便。这一点在参考的第二个博客上也已经说明了。

由上面解释,已知可以用y(wT x + b) 的正负性来判定(或表示)分类的正确性。

定义函数间隔如下:

也就是,这个样本点x与超平面之间的间隔(但是现在有些不准确,所以有下面的几何间隔)。

此时,若根据SVM的思想,最大化这个间隔,就能提高分类正确的确信度了吗?

答案是否定的,因为,如果成比例的改变w 和b(如将它们改成2w 和2b),则函数间隔的值f(x) 却变成了原来的2 倍( 虽然函数值增大了,达到了目标,但是此时超平面没有改变 ),所以只有函数间隔还远远不够。

我们真正关心的,其实是“几何上”的点到平面的距离,于是可以用几何知识推理出来的几何间隔。 而不是一开始人们想当然定义的函数间隔。

事实上,我们可以对法向量w 加些约束条件( 这就是调优问题的思考了 ),从而引出真正定义点到超平面的距离——几何间隔(geometrical margin)的概念。

又因为x 0 是超平面w T x + b=0上的点,利用向量之间的运算

再令上式乘上对应的类别y,即可得出几何间隔

从上述函数间隔和几何间隔的定义可以看出:几何间隔就是函数间隔除以∥w∥,而 函数间隔实际上就是,只是人为定义的一个间隔度量,而几何间隔才是直观上的点到超平面的距离。

接下来就是我们的目标:寻找一个超平面, 使得离超平面比较近的点能有更大的间距。 也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。也就是找到最大的几何间隔。

由上一小节可以知道,我们这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。

上面两个式子的意思是( 注意,函数间距上面是折线,几何间距上面是波浪线 ):
最大化几何间隔
约束条件是,每个样例的函数间隔都要大于全局的那一个函数间隔(也就是所有训练集里的最小的那个)

用函数间隔表示几何间隔

于是得到了这个式子:

然而这个时候目标函数不是凸函数,约束条件也不是线性的,没法直接代入优化软件里计算。我们还要改写。前面说到 同时扩大w和b对结果没有影响 ,因此,我们将全局的函数间隔值定义为1。于是,上述的函数转变成了

由于求1/||w||的最大值,相当于求||w||²的最小值,因此结果为:

因为现在的 目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题 。这个问题可以用现成的QP (Quadratic Programming) 5优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。

根据前面几个文章的话,SVM作为判别模型,它的的模型,就是 w T x i + b 。参数就是w和b。学习完参数以后,新来的样例作为x i ,得到结果大于1,说明在超平面上面,所以是正例。反之亦然。

根据SVM的思想,SVM的初步目标函数,就是所有样例的几何间隔尽可能的大

至此,得到了SVM的目标函数,算是初步解决了SVM的这个问题,用优化包求解得到wb,即可得到具有最大几何间距的超平面,提高分类每个点的确信度,分类目标完成。

接下来介绍的是手工求解w和b的方法了,一种更优的求解方法。

从上可以看出 ,就同时扩大w和b就相当于等式两边同时除以函数间隔 γ,而新的w和b仍然是旧的wb的函数,所以最大化仍然可以进行。

效果等价于,令函数间隔γ=1,综上所述,零γ=1是合理的,而且也方便了原优化问题的计算

由拉格朗日对偶(线性可分条件下SVM的对偶算法)引入核函数(非线性可分条件下SVM的算法)

上一篇说到,得到了 如下的线性可分的SVM的目标函数 ,可以利用优化包进行求解。

此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量(al variable) 的优化问题,即通过求解与原问题等价的对偶问题(al problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法。

引入对偶的优点:

因为 引入拉格朗日算子可以求出极值。 (参考最优化方法的解释)

这种极值问题怎么求

首先,同样定义拉格朗日公式,希望可以利用拉格朗日算子法求得最优解,得到:

但是,出现问题了,此时加入的约束条件g已经不再等于0了,所以,此时可以调整算子alpha变成很大很大的 值,使结果负无穷, 这显然是不合理的。

所以,我们需要 排除在满足条件下,也会无解的情况。

因此,我们定义下面的函数

要看这个函数有什么优点,就要看看这个函数相比于L(ω,α,b)有什么变化: 加了max,加了α I 大于等于零。

所以,当g和h不满足约束时,总可以调整α i 和β i 来使thetap具最大值为正无穷。

只有当g和h满足约束时,此时g<0,我们可以调整α i 和β i (使α i 等于0,β i 任意),得到最大值,即θ p =f(w)。

于是函数等价于这样

于是原来的极值问题min f(w) 就等价于求min θ p 了,
即:

也就是说,最小化 θ p ,就是为了得到最小的 f(w),而能有f(w)就说明了满足约束条件。所以这个等价于原来的极值问题。

至此, 相比于拉格朗日公式L(ω,α,b),现在即加入了拉格朗日算子,又排除了纯粹的拉格朗日公式中出现无穷的情况。

但是,又出现了新的问题,也就是,如果直接求解,首先面对的就是两个参数(最里面的是max,这个max问题有两个参数),而且alpha也是不等式约束,再在w上求最小值,这个过程并不容易做。那么应该怎么办呢?

在最优化课程里,当遇到不好解的优化问题时,可以转化为原问题的对偶问题试试。
此处,d代表对偶。D--al

我们定义函数

θ D 将问题转化为先求L(ω,α,b)关于 ω 的最小值(此时α和β是固定值),之后再求θ D 的最大值。 上来面对的是一个参数,相对简单些。

相对于原问题,更换了min和max的顺序,得到了它的对偶问题。

--------------------------------------------------------------------------------------------------------------
一般的更换顺序的结果是MaxMin(X) <= MinMax(X)。也就是,此时有

对偶问题已经表示出来了,这个对偶问题也相对原问题好求,那么,这两个问题等价吗?或者说,对偶问题的解是不是原问题的解呢?

需要用KKT条件来判断了。

对于拉格朗日算子的深入理解可以看看《最优化方法》,讲义的最后一页。

含有不等式约束的问题,常常 用KKT条件求得候选最优解

对于一般化的拉格朗日公式:

最优值 w 必须满足以下三个条件:

----------1、L对 w 求导为零
----------2、h(w)=0
----------3、α i g i =0 ,i = 1,...,k

注意此时

第三个条件表明了KKT的思想:极值会在可行域边界取得。 ----解释:
-----对于一个特定的自变量w1,当自变量w1在 第 i 个 可行域边界(g i (w1)=0)时,说明此时这个约束是起到了作用的。 这个约束是w1被g i 约束了。此时只能到g i 的平面上(即边界),再多就出界了。。。 而对于最优解来说,就是f(w)达到最优,所以L中,除了f(w)部分,其余应该都等于0,所以此时α>0(或许等于零也可以?疑问)

----而此时,w1在其他的约束条件g 非i 下,有g 非i (w1)<0),说明W1可以随意些,说明此时这个约束并没有起到作用,但是作为最优解,为了 除了f(w)部分,其余应该都等于0 ,所以其系数α应该等于零。

----------------------------------------------------------------------------------------

注意:这个是传统最优化问题的一般式,这个问题有k个不等式约束方程,所有的点都要满足这k个不等式约束。 。假设有一百个样本点,只有有三个极值N1,N2,N3,那么说明其余97个点带入这k个方程中去都会小于零。 另外对于这三个极值点,可能会有g i (N1) = 0,除了第i个g以外,g(N1)都小于0 。然后对于极值N2,g j (N2)=0,除了第j个约束以外,其余的g(N2)都小于0。

而本节一开始讨论的问题,只有一个约束方程(因为参数只有w和b)即:y(w T x+b)>=1,所有的点(一共m个)都要满足这个约束方程。 而关于为什么非支持向量的系数alpha会等于零呢?也就是相当于前面的,k=1(有k个约束条件)的情况下,m个样本点中,非支持向量的约束g<0,为了最优解,除了f(w)应该都等于零,所以alpha应该等于零。

另外可以参考这段话:

即,若d* = p* <==> x * 满足KKT条件

由上面那句话可以知道,

折腾这么长时间,也就是为了说明,已经知道原问题

是凸优化问题,所以,只要对偶问题的自变量w满足了KKT条件,那么它就是对偶问题的最优解w * ,同时也是原问题的最优解了。

所以,由上可知,只要解出了2.1.3中的问题的参数w和b,也就是原问题的解了。

重新回到SVM的优化问题(其中每个约束式实际就是一个训练样本):

我们将约束条件改写为拉格朗日的形式:

由KKT条件可知,只有当函数间隔是1(g=0)的时候,α i >0。此时,这个样例 w i 在约束平面上受到约束 。对于其它的不在线上的样例点(g<0),极值不会在其范围内去的,所以这些样例点前面的系数α i =0.

实线是最大间隔超平面,假设×号的是正例,圆圈的是负例。在虚线上的点就是函数间隔是1的点,他们前面的系数α i >0, 这三个点被称作 支持向量。

由上面问题,构造拉格朗日函数如下(没有等式约束,所以没有β):

————————————————————————————————

下面我们按照对偶问题的求解步骤来一步步进行,由2.1.3可知,对偶问题的形式为:

首先求解L的最小值(最里面的先求),此时αi是固定的,L的最小值只与w和b有关。对w和b分别求偏导数。

得到

将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数), 即里面的min L已经求出,接下来就是求max了
代入后,化简过程如下:

最后得到

由于最后一项是0,因此简化为

这里,上式中左右边的向量内积,用方括号表示。

到这一步,拉格朗日函数只包含了一个变量α i 。接着进行下一步 ,最大化的过程,求得α i 。

假设求得了α i 就能根据求导得到的结果

求得w,然后就能得到b。

b 就是 距离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。 (其实,由前面的那个x和圈的图,可以认为b就是截距,这个截距b等于上下两条虚线的截距的平均值。)

注意,这里的w,b,alpha都是 向量,都是m维的向量

至于这里的α怎么求得,即上面的最大化问题怎么求解,将留给下一篇中的SMO算法来阐明。

也就是说,手动解的话,还是需要利用SMO算法,求得α才行。

————————————————————————————————

这里考虑另外一个问题,由于前面求解中得到

用α i 代替w带入判别模型w T x+b,得到:

也就是说, 利用判别模型对新来样本进行判别时 ,以前新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于1还是小于1来判断正例还是负例。大于1,说明在超平面的上面,说明是正例。同理,小于1说明在超平面的下面,说明是负例。

约束条件是wx+b-1小于等于零,所以判断就是wx+b与1进行大小比较

现在有了alpha,不需要求出w (那b呢,b怎么求呢,前面已经解释,b是由离超平面最近的间隔和负的函数间隔相等。。。得到的。所以,将新来的样本与训练数据中 支持向量 做内积以后,再确定最大的正数函数间隔以及最小的负数函数间隔,即可。)

就冲上面这段话,支持向量的系数alpha,也不能等于0。

另外,那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的α i >0 (不等于零)其他情况α i 是等于零的。 比如,像前面那个x和圈的图,新来的样本只需要和三个支持向量做运算即可

由此可以看到,求出α i 以后,只需要利用支持向量,就可以来判断新来的样例是正例还是负例了。也许这也是是为什么叫支持向量机吧。

上面这个公式,为下面要提到的核函数(kernel)做了很好的铺垫。

下面,先把没求得的alpha放一放,趁着刚刚得到的这个公式的热乎劲,再去看看核函数。

⑺ 一文理解拉格朗日对偶和KKT条件


目标函数: , 引入Lagrange算子:


目标函数:
约束条件:

根据约束条件和目标函数的类型分为3类:

KKT条件指在满足某些规则条件下, 非线性规划 问题能有最优解的 充要条件 , 是广义拉格朗日乘数的重要成果
一般优化问题(含等式和不等式约束约束):

引入Lagrange算子 :

KKT条件指上述问题的最优点 必须满足:
(1) 约束条件满足:
(2)
即,
最优点 处, 必须是 和 的 线性组合
引入拉格朗日算子可以求出极值的原因 :

(3) 且

不等式约束一直是优化问题中的难题,求解对偶问题可以将支持向量机原问题约束中的不等式约束转化为等式约束;

支持向量机中用到了高维映射,但是映射函数的具体形式几乎完全不可确定,而求解对偶问题之后,可以使用核函数来解决这个问题。

并不一定要用拉格朗日对偶。要注意用拉格朗日对偶并没有改变最优解,而是改变了算法复杂度:
在原问题下,求解算法的复杂度与样本维度(等于权值w的维度)有关;
而在对偶问题下,求解算法的复杂度与样本数量(等于拉格朗日算子a的数量)有关。

因此,

支持向量机实现非线性的方法的数学本质是升维,升维升到无穷维则无法表达w, 所以还是使用拉格朗日对偶方法更好一点。准确的说,可以用一些优化算法直接求最小间距,但是,升维的时候核要是正定的,且升维可数,而且不是很大的时候可以用。

任意一个带约束的优化均可写成:

将上述带约束的优化问题转化为无约束优化问题, 定义拉格朗日(Lagrangian)函数如下:

最大化Lagrangian, 令

z(x)满足原始约束条件的x, 其值等于 :
满足初始约束, 则 , 拉格朗日函数第三项被消去:

又因为 , 所以 的最大值在 处取得.

所以原始带约束优化问题等价于以下无约束优化问题:

等价于:

上述问题称为 primal problem
总结:

al problem 只是将primal proble调换了min和max位置:

注意上式和 并不等价.
令:

上式中 为拉格朗日对偶函数(Lagrange al function), 是primal function的一个下界.
即, 若将primal proble的最小值记为 , 则对于所有的 , 有:

证明:
对所有满足约束条件的x, 总有:

因此

假设 在 处取得极值, 则

代入上式:

于是

这样, 的上界是 ,于是:

是primal problem的 最大下界 !
记al problem 的最优值为 , 得到:

该性质称为weak ality, 对所有的优化问题都成立.
此外,
称为ality gap.

基于weak ality的重要结论:


成立时,称为strong ality.

严格满足约束条件的点x, 指 严格到 , 即存在x满足:

原始问题是convex且满足slater条件,则strong ality成立:
特例: 对某些 非convex optimization,strong ality也成立

条件(2)中若 必有 , 反之, 若 可得 , 此条件在SVM中用来证明非支持向量 对应的系数

complementary slacknes 加上其他约束条件即为KKT条件:

通过al problem可求primal problem的解:

⑻ 为什么支持向量机要用拉格朗日对偶算法来解最大化间隔问题

首先,对偶理论和方法是最优化的基本工具,也是整数规划中内容最丰富、应用最广泛的松弛方法之一。在简单的实际问题中,可以利用拉格朗日松弛和对偶产生线性整数规划的界,从而用分支定界法求解规划问题的最优解。

⑼ 支持向量机(SVM)

        支持向量机(support vector machine),故一般简称SVM,通俗来讲,它是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,这族分类器的特点是他们能够同时最小化经验误差与最大化几何边缘区,因此支持向量机也被称为最大边缘区分类器。其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。SVM在很多诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有很多的应用。

        支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。

        假设给定一些分属于两类的2维点,这些点可以通过直线分割, 我们要找到一条最优的分割线,如何来界定一个超平面是不是最优的呢?

        如图:

        在上面的图中,a和b都可以作为分类超平面,但最优超平面只有一个,最优分类平面使间隔最大化。 那是不是某条直线比其他的更加合适呢? 我们可以凭直觉来定义一条评价直线好坏的标准:

        距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。 因此我们的目标是找到一条直线(图中的最优超平面),离所有点的距离最远。 由此, SVM算法的实质是找出一个能够将某个值最大化的超平面,这个值就是超平面离所有训练样本的最小距离。这个最小距离用SVM术语来说叫做间隔(margin) 。

        描述:给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。如果用x表示数据点,用y表示类别(y可以取1或者-1,分别代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程可以表示为( wT中的T代表转置):

        例如:现在有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以可以用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所对应的y全是-1 ,另一边所对应的y全是1。

        我们令分类函数为:

        当f(x) 等于0的时候,x便是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点,如下图所示:

        一个点距离超平面的远近可以表示分类预测的确信或准确程度,如何确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。

补充知识点: 点到平面的距离

        支持向量机学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面.。对线性可分的训练数据集而言,线性可分分离超平面有无穷多个(等价于感知机),但是几何间隔最大的分离超平面是唯一的。这里的间隔最大化又称为硬间隔最大化。

        间隔最大化的直观解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。也就是说,不仅将正负实例点分开,而且对最难分的实例点(离超平面最近的点)也有足够大的确信度将它们分开。这样的超平面应该对未知的新实例有很好的分类预测能力。

      按照我们前面的分析,对一个数据点进行分类, 当它的margin越大的时候,分类的confidence越大。 对于一个包含n个点的数据集,我们可以很自然地定义它的margin为所有这n个点的margin值中最小的那个。于是,为了使得分类的confidence高,我们希望所选择的超平面hyper plane能够最大化这个margin值。让所选择的超平面能够最大化这个“间隔”值,这个间隔就是下图中的Gap的一半:

为什么用几何间隔求最大的分离超平面而不用函数间隔?

例题:

我们构造了约束最优化问题,就是下面这个:

        此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (al variable) 的优化问题,即通过求解与原问题等价的对偶问题(al problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。

补充知识点: 拉格朗日乘子法学习

                     拉格朗日KKT条件

                     KKT条件介绍

                     拉格朗日对偶

         通过给每一个约束条件加上一个拉格朗日乘子(Lagrange multiplier)α,定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题):

 求解这个式子的过程需要拉格朗日对偶性的相关知识。

例题:

         接下来谈谈线性不可分的情况,因为 线性可分这种假设实在是太有局限性 了。下图就是一个典型的线性不可分的分类图,我们没有办法用一条直线去将其分成两个区域,每个区域只包含一种颜色的点。

         要想在这种情况下的分类器,有两种方式, 一种是用曲线 去将其完全分开,曲线就是一种 非线性 的情况,跟之后将谈到的 核函数 有一定的关系:

         另外一种还是用直线,不过不用去保证可分性 ,就是包容那些分错的情况,不过我们得加入惩罚函数,使得点分错的情况越合理越好。其实在很多时候,不是在训练的时候分类函数越完美越好,因为训练函数中有些数据本来就是噪声,可能就是在人工加上分类标签的时候加错了,如果我们在训练(学习)的时候把这些错误的点学习到了,那么模型在下次碰到这些错误情况的时候就难免出错了。这种学习的时候学到了“噪声”的过程就是一个过拟合(over-fitting),这在机器学习中是一个大忌。

我们可以为分错的点加上一点惩罚,对一个分错的点的 惩罚函数 就是 这个点到其正确位置的距离:

        对于线性不可分的情况,我们可以用核函数让空间从原本的线性空间变成一个更高维的空间 , 在这个高维的线性空间下,再用一个超平面进行划分 。 这儿举个例子,来理解一下如何利用空间的维度变得更高来帮助我们分类的:

        上图是一个线性不可分的图,当我们把这两个类似于椭圆形的点映射到一个高维空间后,映射函数为:

        用这个函数可以将上图的平面中的点映射到一个三维空间(z1,z2,z3),并且对映射后的坐标加以旋转之后就可以得到一个线性可分的点集了。

        形象说明:例如世界上本来没有两个完全一样的物体,对于所有的两个物体,我们可以通过增加维度来让他们最终有所区别,比如说两本书,从(颜色,内容)两个维度来说,可能是一样的,我们可以加上作者这个维度,是在不行我们还可以加入页码,可以加入拥有者,可以加入购买地点,可以加入笔记内容等等。当维度增加到无限维的时候,一定可以让任意的两个物体可分了。

核函数定义:

核技巧在支持向量机中的应用:

常用核函数:

非线性支持向量机学习算法:

        支持向量机的学习问题可以形式化为求解凸二次规划问题。这样的凸二次规划问题具有全局最优解,并且有许多最优化算法可以用于这一一问题的求解。但是当训练样本容量很大时,这些算法往往变得非常低效,以致无法使用。所以,如何高效地实现支持向量机学习就成为一一个重要的问题。目前人们已提出许多快速实现算法.本节讲述其中的序列最小最优化(sequential minimal optimization, SMO)算法。

        上述问题是要求解N个参数(α1,α2,α3,...,αN),其他参数均为已知,序列最小最优化算法(SMO)可以高效的求解上述SVM问题,它把原始求解N个参数二次规划问题分解成很多个子二次规划问题分别求解,每个子问题只需要求解2个参数,方法类似于坐标上升,节省时间成本和降低了内存需求。每次启发式选择两个变量进行优化,不断循环,直到达到函数最优值。

        整个SMO算法包括两部分,求解两个变量的 二次规划 问题和选择这两个变量的 启发式 方法。

 上面求得的(α1)new和(α2)new是在η>0的情况下求得的:

        当时为了推导公式我们直接默认它是大于0了,现在我们需要重新审视这一项(η)。这一项是原来关于的二次项的系数。我们可以分下面三种情况讨论:

(1)当η>0时 :这个二次函数开口向上,所以要求这个二次函数的最小值,如果说极值点不在计算出的可行域的范围内,就要根据这个极值点和可行域边界值的关系来得到取最小值的地方:

①如果这个极值点在可行域左边,那么我们可以得到这个可行域内二次函数一定在单增,所以此时L应该是那个取最小值的地方。就如大括号的第三种情况。

②如果这个极值点在可行域右边,那么此时可行域内一定单减,所以此时H就是那个取最小值的地方,就是大括号里的第一种情况。

(2)当η=0时: 这个二次函数就变成了一个一次函数,那么不管这个一次函数的单调性怎样,最小值一定是在边界处取到。所以到时候计算可行域的两个边界的值,看哪个小就用哪个。

(3)当η<0时: 这个二次函数开口向下,那么此时怎么得到取最小值的点呢?很容易就能想到:最小值也是在可行域的边界处取到。很容易理解,此时开口向下,当极值点在区间内时,最小值只能在端点处取,因为极值点处是最大的。而当极值点在区间外时,区间内一定是单调的,此时最小值也只能在端点处取。通过计算比较边界处的目标函数值,哪个小取哪个。

通过以上判断求出(α2)new以后,再根据公式求出(α1)new,然后带入目标函数(1)中。即如下过程:

        上述分析是在从N个变量中已经选出两个变量进行优化的方法,下面分析如何高效地选择两个变量进行优化,使得目标函数下降的最快。

⑽ 拉格朗日函数及其对偶性

拉格朗日函数主要用来求解在约束条件下的最优化问题,





称此约束最优化问题为原始最优化问题。

这里, 是拉格朗日乘子, .考虑 x 的函数:

这里,下标 表示原始问题。

假设给定某个 ,如果 违反原始问题的约束条件

所以当都满足约束条件时, 可以得到所有的 都为 0。另一项恒为 0。此时

再最小化

与原始问题相同

定义原始问题的最优值

又叫做广义拉格朗日函数的极小极大问题。

定义

之前的原始问题,第一步是把 当做常数,求 。现在的对偶问题,第一步是把 当做常数求

在考虑极大化

这又叫做, 广义拉格朗日函数的极大极小问题

定义最优值

这才是关键!!! 如果求解不一样,那对偶函数有什么用!

最大熵模型 中,正是因为对偶问题和原始问题的解一样,才能互相转换。

现在来探讨这个 对偶问题和原始问题的解一样 的条件

详见这篇文章

阅读全文

与拉格朗对偶性算法相关的资料

热点内容
win10原始解压软件 浏览:319
阿里程序员的老家 浏览:258
量子加密银行 浏览:193
命令方块获得指令手机 浏览:499
学习结束感言简短程序员 浏览:398
android关机闹钟实现 浏览:968
鼠标一键打开文件夹设置 浏览:161
程序员看过来我想静静搞笑视频 浏览:370
curlphp爬虫 浏览:874
python按日期循环 浏览:110
php三个等号 浏览:760
培训班出来的程序员解决问题很差 浏览:963
程序员那么可爱25集 浏览:753
服务器地址和ip地址一样不 浏览:664
php中括号定义数组 浏览:602
php打印堆栈 浏览:516
华为adb命令行刷机 浏览:965
人像摄影pdf 浏览:761
解压文件密码怎样重新设置手机 浏览:1002
高考指南pdf 浏览:695