本文整理来自于https://blog.csdn.net/v_july_v/article/details/7624837
支持向量机(support vector machines)是一种二分类模型,它的目的是寻找一个超平面来对样本进行分割,其基本模型定义为特征空间上的间隔最大的线性分类器,分割的原则(策略)是间隔最大化,最终转化为一个凸二次规划问题来求解。
分类标准的起源来源于Logistic回归,Logistic回归的分类输出为 y = 0 和 y = 1 y=0和y=1 y=0和y=1,线性分类函数将 y = 0 变 为 y = − 1 y=0变为y=-1 y=0变为y=−1。
g ( w T x + b ) = g ( z ) g(w^Tx+b)=g(z) g(wTx+b)=g(z), 将其简单映射到 y = − 1 和 y = 1 y=-1和y=1 y=−1和y=1,映射关系如下:
y是个分类标签,二分时y就取两个值,而刚好取了-1和1,只是因为用超平面分类时,不同的类中的点函数值刚好有不同的符号,所以就用符号来进行分类。
具体阐述如下:
由简至繁的模型包括:
如下图所示,现在有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以可以用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所对应的y全是-1 ,另一边所对应的y全是1。
这个超平面可以用分类函数 f ( x ) = w T + b f(x)=w^T+b f(x)=wT+b表示,当 f ( x ) f(x) f(x) 等于0的时候, x x x便是位于超平面上的点,而 f ( x ) f(x) f(x)大于0的点对应 y = 1 y=1 y=1的数据点,f(x)小于0的点对应y=-1的点,如下图所示
在进行分类的时候,遇到一个新的数据点x,将x代入f(x) 中,如果f(x)小于0则将x的类别赋为-1,如果f(x)大于0则将x的类别赋为1。
接下来的问题是,如何确定这个超平面呢?从直观上而言,这个超平面应该是最适合分开两类数据的直线。而判定“最适合”的标准就是这条直线离直线两边的数据的间隔最大。所以,得寻找有着最大间隔的超平面。
在超平面 w ∗ x + b = 0 w*x+b=0 w∗x+b=0确定的情况下, ∣ w ∗ x + b ∣ |w*x+b| ∣w∗x+b∣能够表示点x到距离超平面的远近,而通过观察 w ∗ x + b w*x+b w∗x+b的符号与类标记y的符号是否一致可判断分类是否正确,所以,可以用 ( y ∗ ( w ∗ x + b ) ) (y*(w*x+b)) (y∗(w∗x+b))的正负性来判定或表示分类的正确性。于此,我们便引出了函数间隔(functional margin)的概念。
定义函数间隔(用 γ ^ \hat{\gamma} γ^表示)为:
而超平面 ( w , b ) (w,b) (w,b)关于T中所有样本点 ( x i , y i ) (xi,yi) (xi,yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面 ( w , b ) (w, b) (w,b)关于训练数据集T的函数间隔:
γ ^ \hat{\gamma} γ^=min γ ^ i ( i = 1 , 2 , . . . n ) \hat{\gamma}_i (i=1,2,...n) γ^i(i=1,2,...n)
函数间隔可以表示分类预测的正确性及确信度。
但这样定义的函数间隔有问题,即如果成比例的改变w和b(如将它们改成2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),所以只有函数间隔还远远不够。
事实上,我们可以对法向量 w w w加些约束条件,从而引出真正定义点到超平面的距离–几何间隔(geometrical margin)的概念。
假定对于一个点 x x x ,令其垂直投影到超平面上的对应点为 x 0 x_0 x0 , w w w 是垂直于超平面的一个向量,为样本 x x x到超平面的距离,如下图所示:
根据平面几何知识,有点 x i x_i xi(超平面正侧的点)到超平面的距离为:
γ i = ω ∣ ∣ ω ∣ ∣ ∗ x i + b ∣ ∣ ω ∣ ∣ \gamma_i={\omega\over||\omega||}*x_i+{b\over||\omega||} γi=∣∣ω∣∣ω∗xi+∣∣ω∣∣b
当点在超平面负侧时, y i = − 1 y_i=-1 yi=−1,点与超平面距离为:
γ i = − ( ω ∣ ∣ ω ∣ ∣ ∗ x i + b ∣ ∣ ω ∣ ∣ \gamma_i=-({\omega\over||\omega||}*x_i+{b\over||\omega||} γi=−(∣∣ω∣∣ω∗xi+∣∣ω∣∣b)
所以,当样本点 ( x i , y i ) (x_i,y_i) (xi,yi)被超平面正确分类时,点 x x x与超平面的距离,即几何间隔:
γ i = y i ( ω ∣ ∣ ω ∣ ∣ ∗ x i + b ∣ ∣ ω ∣ ∣ \gamma_i=y_i({\omega\over||\omega||}*x_i+{b\over||\omega||} γi=yi(∣∣ω∣∣ω∗xi+∣∣ω∣∣b)
超平面 ( w , b ) (w,b) (w,b)关于T中所有样本点 ( x i , y i ) (xi,yi) (xi,yi)的几何间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面 ( w , b ) (w, b) (w,b)关于训练数据集T的几何间隔:
γ ~ \tilde{\gamma} γ~=min γ ~ i ( i = 1 , 2 , . . . n ) \tilde{\gamma}_i (i=1,2,...n) γ~i(i=1,2,...n)
从上述函数间隔和几何间隔的定义可以看出:
γ ~ \tilde{\gamma} γ~= γ ^ ∣ ∣ ω ∣ ∣ \hat{\gamma}\over||\omega|| ∣∣ω∣∣γ^
如果 ∣ ∣ ω ∣ ∣ = 1 ||\omega||=1 ∣∣ω∣∣=1,那么函数间隔和几何间隔相等。如果 ω 和 b \omega和b ω和b成比例改变(超平面没有变),函数间隔按此比例变,几何间隔不变。
对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值。这个间隔就是下图中的Gap的一半。
通过由前面的分析可知:函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放w的长度和b的值,这样可以使得的值任意大,亦即函数间隔可以在超平面保持不变的情况下被取得任意大。但几何间隔因为除上了 ∣ ∣ ω ∣ ∣ ||\omega|| ∣∣ω∣∣,使得在缩放 w w w和 b b b的时候几何间隔的值是不会改变的,它只随着超平面的变动而变动,因此,这是更加合适的一个间隔。换言之,这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。
于是最大间隔分类器(maximum margin classifier)的目标函数可以定义为:
max γ ~ \tilde{\gamma} γ~
s.t. y i ( ω ∣ ∣ ω ∣ ∣ ∗ x i + b ∣ ∣ ω ∣ ∣ y_i({\omega\over||\omega||}*x_i +{b\over||\omega||} yi(∣∣ω∣∣ω∗xi+∣∣ω∣∣b) ≥ γ ~ \ge\tilde{\gamma} ≥γ~
即希望最大化超平面 ( ω , b ) (\omega,b) (ω,b)关于训练集的几何间隔 γ ~ \tilde{\gamma} γ~,约束条件表示的是超平面 ( ω , b ) (\omega,b) (ω,b)关于每个样本点的几何间隔至少是 γ ~ \tilde{\gamma} γ~。
其中:
γ ~ \tilde{\gamma} γ~= y γ ^ y\hat{\gamma} yγ^= γ ^ ∣ ∣ ω ∣ ∣ \hat{\gamma}\over||\omega|| ∣∣ω∣∣γ^
考虑几何间隔和函数间隔的关系,该问题改写成:
max γ ^ ∣ ∣ ω ∣ ∣ \hat{\gamma}\over||\omega|| ∣∣ω∣∣γ^
s.t. y i ( ω ∗ x i + b y_i({\omega}*x_i +{b} yi(ω∗xi+b) ≥ γ ^ \ge\hat{\gamma} ≥γ^, i=1,2,3…,N
根据等价最优化问题,取 γ ^ \hat{\gamma} γ^=1(函数间隔为1),最大化 1 ∣ ∣ ω ∣ ∣ 1\over ||\omega|| ∣∣ω∣∣1等价于 1 2 ∣ ∣ ω ∣ ∣ 2 {1\over2}{||\omega||^2} 21∣∣ω∣∣2
所以上述优化问题改写成:
min 1 2 ∣ ∣ ω ∣ ∣ 2 {1\over2}{||\omega||^2} 21∣∣ω∣∣2
s.t. y i ( ω ∗ x i + b ) − 1 y_i({\omega}*x_i +{b})-1 yi(ω∗xi+b)−1 ≥ 0 \ge0 ≥0, i=1,2,3…,N
如下图所示,中间的实线便是寻找到的最优超平面(Optimal Hyper Plane),其到两条虚线边界的距离相等,这个距离便是几何间隔 γ ~ \tilde{\gamma} γ~,两条虚线间隔边界之间的距离等于2 γ ~ \tilde{\gamma} γ~,而虚线间隔边界上的点则是支持向量。由于这些支持向量刚好在虚线间隔边界上,所以它们满足 y ( ω ∗ x + b ) = 1 y({\omega}*x+{b})=1 y(ω∗x+b)=1(上节中:处于方便推导和优化的目的,我们可以令 γ ^ \hat{\gamma} γ^=1),而对于所有不是支持向量的点,则显然有 y i ( ω ∗ x i + b ) > 1 y_i({\omega}*x_i +{b})>1 yi(ω∗xi+b)>1。
现在优化问题为:
min 1 2 ∣ ∣ ω ∣ ∣ 2 {1\over2}{||\omega||^2} 21∣∣ω∣∣2
s.t. y i ( ω ∗ x i + b ) − 1 y_i({\omega}*x_i +{b})-1 yi(ω∗xi+b)−1 ≥ 0 \ge0 ≥0, i=1,2,3…,N
因为现在的目标函数是二次的,约束条件是线性的,所以它是一个凸二次规划问题。这个问题可以用现成的QP (Quadratic Programming) 优化包进行求解。一言以蔽之:在一定的约束条件下,目标最优,损失最小。
此外,由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:
那什么是拉格朗日对偶性呢?
简单来讲,通过给每一个约束条件加上一个拉格朗日乘子(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题):
然后令
易于验证,当某个约束条件不满足时,例如 y i ( ω ∗ x i + b ) < 1 y_i({\omega}*x_i +{b})<1 yi(ω∗xi+b)<1,显然有 θ ( ω ) = ∞ \theta(\omega)=\infty θ(ω)=∞(只要令 α i = ∞ \alpha_i =\infty αi=∞ 即可),当所有约束条件满足时,则最优值为 1 2 ∣ ∣ ω ∣ ∣ 2 {1\over2}{||\omega||^2} 21∣∣ω∣∣2,也是最初要最小化的量。
因此,在约束条件满足的情况下最小化 1 2 ∣ ∣ ω ∣ ∣ 2 {1\over2}{||\omega||^2} 21∣∣ω∣∣2,等价于最小化 θ ( ω ) \theta(\omega) θ(ω)(约束条件: α i ≥ 0 \alpha_i \ge0 αi≥0,i=0,1,2,…n).如果约束条件没有得到满足, θ ( ω ) \theta(\omega) θ(ω)会无穷大,自然不会是我们所要求的最小值。
具体写出来,目标函数变成了:
这里用 p ∗ p^* p∗表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而 α i \alpha_i αi又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:
交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用来表示。而且有 d ∗ ≤ p ∗ d^*≤p^* d∗≤p∗,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。
换言之,之所以从minmax的原始问题,转化为maxmin的对偶问题,一者因为 d ∗ d^* d∗是 p ∗ p^* p∗的近似解,二者,转化为对偶问题后,更容易求解。
下面可以先求L 对w、b的极小,再求L 对的极大。
要让两者等价需满足strong duality (强对偶),有学者在强对偶下提出了KKT条件,且KKT条件的成立要满足constraint qualifications,而constraint qualifications之一就是Slater条件。
所谓Slater 条件,即指:凸优化问题,如果存在一个点x,使得所有等式约束都成立,并且所有不等式约束都严格成立(即取严格不等号,而非等号),则满足Slater 条件。对于此处,Slater 条件成立,所以d≤p可以取等号。
一般地,一个最优化数学模型能够表示成下列标准形式:
其中, f ( x ) f(x) f(x)是需要最小化的函数, h ( x ) h(x) h(x)是等式约束, g ( x ) g(x) g(x)是不等式约束, p 和 q p和q p和q分别为等式约束和不等式约束的数量。
同时,得明白以下两点:
而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:
经过论证,我们这里的问题是满足 KKT 条件的(首先已经满足Slater条件,再者 f f f和 g i gi gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。即,原始问题通过满足KKT条件,已经转化成了对偶问题。
而求解这个对偶学习问题,分为3个步骤:首先要让 L ( w , b , a ) L(w,b,a) L(w,b,a) 关于 w w w 和 b b b最小化,然后求对的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。
“倒数第4步”推导到“倒数第3步”使用了线性代数的转置运算,由于ai和yi都是实数,因此转置后与自身一样。“倒数第3步”推导到“倒数第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法运算法则。最后一步是上一步的顺序调整。
从上面的最后一个式子,我们可以看出,此时的拉格朗日函数只包含了一个变量,那就是 α i \alpha_i αi(求出了便能求出 w w w和 b b b,由此可见,上文提出来的核心问题:分类函数 f ( x ) = ω T x + b f(x)=\omega^Tx+b f(x)=ωTx+b也就可以轻而易举的求出来了)。
求对 α \alpha α的极大,即是关于对偶问题的最优化问题。经过上面第一个步骤的求w和b,得到的拉格朗日函数式子已经没有了变量w,b,只有 α \alpha α。从上面的式子得到:
这样,求出了 α \alpha α, 根据下式
求出 w w w,然后通过
,即可求出b,最终得出分离超平面和分类决策函数。
在求得 L ( w , b , a ) L(w, b, a) L(w,b,a) 关于 $w 和 和 和 b$ 最小化,以及对 α \alpha α的极大之后,最后一步则可以利用SMO算法求解对偶问题中的拉格朗日乘子 α \alpha α。
上述式子要解决的是在参数{ α 1 , α 2 , . . . α n \alpha_1,\alpha_2,...\alpha_n α1,α2,...αn}上求最大值W的问题,至于 x ( i ) x^{(i)} x(i)和 y ( i ) y^{(i)} y(i)都是已知数。SMO算法推导见下文。
为过渡到下节所介绍的核函数,再来看看上述推导过程中得到的一些有趣的形式。首先就是关于我们的hyper plane ,对于一个数据点 x 进行分类,实际上是通过把 x 带入到 f ( x ) = ω T x + b f(x)=\omega^Tx+b f(x)=ωTx+b算出结果然后根据其正负号来进行类别划分的。而前面的推导中我们得到
这里的形式的有趣之处在于,对于新点x的预测,只需要计算它与训练数据点的内积即可( < ⋅ , ⋅ > <\cdot,\cdot> <⋅,⋅>表示向量内积),这一点至关重要,是之后使用 Kernel 进行非线性推广的基本前提。
此外,所谓 Supporting Vector 也在这里显示出来——事实上,所有非Supporting Vector 所对应的系数 α \alpha α都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。
为什么非支持向量对应的 α \alpha α等于零呢?直观上来理解的话,就是这些“后方”的点——正如我们之前分析过的一样,对超平面是没有影响的,由于分类完全有超平面决定,所以这些无关的点并不会参与分类问题的计算,因而也就不会产生任何影响了。
回忆一下之前通过 Lagrange multiplier得到的目标函数:
注意到如果 xi 是支持向量的话,上式中红颜色的部分是等于 0 的(因为支持向量的 functional margin 等于 1 ),而对于非支持向量来说,functional margin 会大于 1 ,因此红颜色部分是大于零的,而又 α i \alpha_i αi是非负的,为了满足最大化, α i \alpha_i αi必须等于 0 。这也就是这些非Supporting Vector 的点的局限性。
至此,我们便得到了一个maximum margin hyper plane classifier,这就是所谓的支持向量机(Support Vector Machine)。当然,到目前为止,我们的 SVM 还比较弱,只能处理线性的情况, 不过,在得到了对偶dual 形式之后,通过 Kernel 推广到非线性的情况就变成了一件非常容易的事情了(相信,你还记得本节开头所说的:“通过求解对偶问题得到最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题”)。
事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM咋处理呢?对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) , 通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是这种类型的函数:
这里 ϕ : X − > F ϕ:X->F ϕ:X−>F是从输入空间到某个特征空间的映射,这意味着建立非线性学习器分为两步:
而由于对偶形式就是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:
如果有一种方式可以在特征空间中直接计算内积 〈 ϕ ( x i ⋅ ϕ ( x ) 〉 〈\phi(xi · \phi(x)〉 〈ϕ(xi⋅ϕ(x)〉,就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算法的方法称为核函数方法:
核是一个函数K,对所有x, z ∈ z\in z∈x,满足:
这里φ是从X到内积特征空间F的映射。
来看个核函数的例子。如下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢(下文将会有一个相应的三维空间图)?
事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用 X 1 X_1 X1和 X 2 X_2 X2来表示这个二维平面的一个点的两个坐标(等价于x,y两个点)的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:
注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 Z 1 = X 1 , Z 2 = X 1 2 , Z 3 = X 2 , Z 4 = X 2 2 , Z 5 = X 1 X 2 Z_1=X_1,Z_2=X_1^2,Z_3=X_2,Z_4=X_2^2,Z_5=X_1X_2 Z1=X1,Z2=X12,Z3=X2,Z4=X22,Z5=X1X2,那么显然,上面的方程在新的坐标系下可以写作:
关于新的坐标,这正是一个 hyper plane 的方程!也就是说,如果我们做一个映射 ϕ : R 2 − > R 5 \phi:R_2->R_5 ϕ:R2−>R5,将 按照上面的规则映射为 Z Z Z,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。
再进一步描述 Kernel 的细节之前,不妨再来看看上述例子在映射过后的直观形态。当然,你我可能无法把 5 维空间画出来,不过由于我这里生成数据的时候用了特殊的情形,所以这里的超平面实际的方程是这个样子的(圆心在 X 2 X_2 X2轴上的一个正圆):
因此我只需要把它映射到 Z 1 = X 1 2 , Z 2 = X 2 2 , Z 3 = X 3 Z_1=X_1^2,Z_2=X_2^2,Z_3=X_3 Z1=X12,Z2=X22,Z3=X3这样一个三维空间中即可,下图即是映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的:
核函数相当于把原来的分类函数:
映射成:
而其中的 α \alpha α可以通过求解如下 dual 问题而得到的:
这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射 ϕ ( ⋅ ) \phi(·) ϕ(⋅),然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上好像并没有这么简单。
细想一下,刚才的方法是不是有问题?
在最初的例子里,我们对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了五个维度;
如果原始空间是三维(一阶、二阶和三阶的组合),那么我们会得到:3(一次)+3(二次交叉)+3(平方)+3(立方)+1(x1x2x3)+23(交叉,一个一次一个二次,类似x1x2^2) = 19维的新空间,这个数目是呈指数级爆炸性增长的,从而势必这给的计算带来非常大的困难,而且如果遇到无穷维的情况,就根本无从计算了。
不妨还是从最开始的简单例子出发,设两个向量 x 1 = ( η 1 , η 2 ) T , x 2 = ( ξ 1 , ξ 2 ) T x_1=(\eta_1,\eta_2)^T,x_2=(\xi_1,\xi_2)^T x1=(η1,η2)T,x2=(ξ1,ξ2)T,而 ϕ ( ⋅ ) \phi(·) ϕ(⋅)即是前面所说的五维空间映射,因此映射过后的内积为:
式子1:
ϕ ( x 1 ) \phi(x_1) ϕ(x1)= ( η 1 , η 1 2 , η 2 , η 2 2 , η 1 η 2 ) T (\eta_1,\eta_1^2,\eta_2,\eta_2^2,\eta_1\eta_2)^T (η1,η12,η2,η22,η1η2)T
ϕ ( x 2 ) \phi(x_2) ϕ(x2)= ( ξ 1 , ξ 1 2 , ξ 2 , ξ 2 2 , ξ 1 ξ 2 ) T (\xi_1,\xi_1^2,\xi_2,\xi_2^2,\xi_1\xi_2)^T (ξ1,ξ12,ξ2,ξ22,ξ1ξ2)T
另外,式子2:
二者有很多相似的地方, 只要把某几个维度线性缩放一下,然后再加上一个常数维度,具体来说,上面这个式子的计算结果,实际和下式映射 x 1 , x 2 x_1,x_2 x1,x2后取内积< ϕ ( x 1 ) , ϕ ( x 2 ) \phi(x_1), \phi(x_2) ϕ(x1),ϕ(x2)>的结果是一样的
ϕ ( x 1 ) \phi(x_1) ϕ(x1)= ( 2 η 1 , η 1 2 , 2 η 2 , η 2 2 , 2 η 1 η 2 , 1 ) T (\sqrt2\eta_1,\eta_1^2,\sqrt2\eta_2,\eta_2^2,\sqrt2\eta_1\eta_2,1)^T (2η1,η12,2η2,η22,2η1η2,1)T
ϕ ( x 2 ) \phi(x_2) ϕ(x2)= ( 2 ξ 1 , ξ 1 2 , 2 ξ 2 , ξ 2 2 , 2 ξ 1 ξ 2 , 1 ) T (\sqrt2\xi_1,\xi_1^2,\sqrt2\xi_2,\xi_2^2,\sqrt2\xi_1\xi_2,1)^T (2ξ1,ξ12,2ξ2,ξ22,2ξ1ξ2,1)T
求内积结果同式子2:
< ϕ ( x 1 ) , ϕ ( x 2 ) \phi(x_1),\phi(x_2) ϕ(x1),ϕ(x2)>= 2 η 1 ξ 1 + η 1 2 ξ 1 2 + 2 η 2 ξ 2 + η 2 2 ξ 2 2 + 2 η 1 ξ 1 η 2 ξ 2 + 1 2\eta_1\xi_1+\eta_1^2\xi_1^2+2\eta_2\xi_2+\eta_2^2\xi_2^2+2\eta_1\xi_1\eta_2\xi_2+1 2η1ξ1+η12ξ12+2η2ξ2+η22ξ22+2η1ξ1η2ξ2+1
在上文中,提到了映射的维度爆炸,在前一种方法已经无法计算的情况下,后一种方法却依旧能从容处理,甚至是无穷维度的情况也没有问题。
我们把这里的计算两个向量在隐式映射过后的空间中的内积的函数叫做核函数 (Kernel Function) ,例如,在刚才的例子中,我们的核函数为:
核函数能简化映射空间中的内积运算——刚好“碰巧”的是,在我们的 SVM 里需要计算的地方数据向量总是以内积的形式出现的。对比刚才我们上面写出来的式子,现在我们的分类函数为:
其中 α \alpha α由如下 dual 问题计算而得:
这样一来计算的问题就算解决了,避开了直接在高维空间中进行计算,而结果却是等价的!当然,因为我们这里的例子非常简单,所以我可以手工构造出对应于 ϕ ( ⋅ ) \phi(·) ϕ(⋅)的核函数出来,如果对于任意一个映射,想要构造出对应的核函数就很困难了。
通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:
举例说明下核函数解决非线性问题的直观效果
假设现在你是一个农场主,圈养了一批羊群,但为预防狼群袭击羊群,你需要搭建一个篱笆来把羊群围起来。但是篱笆应该建在哪里呢?你很可能需要依据牛群和狼群的位置建立一个“分类器”,比较下图这几种不同的分类器,我们可以看到SVM完成了一个很完美的解决方案。
这个例子从侧面简单说明了SVM使用非线性分类器的优势,而逻辑模式以及决策树模式都是使用了直线方法。
在本文第一节最开始讨论支持向量机的时候,我们就假定,数据是线性可分的,亦即我们可以找到一个可行的超平面将数据完全分开。后来为了处理非线性数据,在上文使用 Kernel 方法对原来的线性 SVM 进行了推广,使得非线性的的情况也能处理。虽然通过映射 ϕ ( ⋅ ) \phi(·) ϕ(⋅)将原始数据映射到高维空间之后,能够线性分隔的概率大大增加,但是对于某些情况还是很难处理。
例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音。对于这种偏离正常位置很远的数据点,我们称之为 outlier ,在我们原来的 SVM 模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有少数几个 support vector 组成的,如果这些 support vector 里又存在 outlier 的话,其影响就很大了。例如下图:
用黑圈圈起来的那个蓝点是一个 outlier ,它偏离了自己原本所应该在的那个半空间,如果直接忽略掉它的话,原来的分隔超平面还是挺好的,但是由于这个 outlier 的出现,导致分隔超平面不得不被挤歪了,变成途中黑色虚线所示(这只是一个示意图,并没有严格计算精确坐标),同时 margin 也相应变小了。当然,更严重的情况是,如果这个 outlier 再往右上移动一些距离的话,我们将无法构造出能将数据分开的超平面来。
为了处理这种情况,SVM 允许数据点在一定程度上偏离一下超平面。例如上图中,黑色实线所对应的距离,就是该 outlier 偏离的距离,如果把它移动回来,就刚好落在原来的 超平面 蓝色间隔边界上,而不会使得超平面发生变形了。
“换言之,在有松弛的情况下outline点也属于支持向量SV,同时,对于不同的支持向量,拉格朗日参数的值也不同,如此篇论文《Large Scale Machine Learning》中的下图所示:
对于远离分类平面的点值为0;对于边缘上的点值在[0, 1/L]之间,其中,L为训练数据集个数,即数据集大小;对于outline数据和内部的数据值为1/L。
原来的约束条件为:
现在考虑到outlier问题,约束条件变成了:
其中 ξ ≥ 0 \xi\ge0 ξ≥0称为松弛变量 (slack variable) ,对应数据点 x i x_i xi允许偏离的 functional margin 的量。当然,如果我们运行 ξ i \xi_i ξi任意大的话,那任意的超平面都是符合条件的了。所以,我们在原来的目标函数后面加上一项,使得这些 ξ i \xi_i ξi的总和也要最小:
其中 C C C是一个参数,用于控制目标函数中两项(“寻找 margin 最大的超平面”和“保证数据点偏差量最小”)之间的权重。注意,其中 ξ \xi ξ是需要优化的变量(之一),而 C C C是一个事先确定好的常量。完整地写出来是这个样子:
用之前的方法将限制或约束条件加入到目标函数中,得到新的拉格朗日函数,如下所示:
分析方法和前面一样,转换为另一个问题之后,我们先让 L L L针对 ω 、 b \omega、b ω、b和 ξ \xi ξ最小化:
将 ω \omega ω带回 L L L并化简,得到和原来一样的目标函数:
不过,由于我们得到 C − α i − r i = 0 C-\alpha_i-r_i=0 C−αi−ri=0而又有 r i ≥ 0 r_i\ge0 ri≥0(作为 Lagrange multiplier 的条件),因此有 a l p h a i ≤ C alpha_i\leq C alphai≤C,所以整个 dual 问题现在写作:
把前后的结果对比一下(错误修正:图中的Dual formulation中的Minimize应为maxmize):
可以看到唯一的区别就是现在 dual variable α \alpha α多了一个上限 。而 Kernel 化的非线性形式也是一样的,只要把< x i , x j x_i,x_j xi,xj>换成 k ( x i , x j ) k(x_i,x_j) k(xi,xj)即可。这样一来,一个完整的,可以处理线性和非线性并能容忍噪音和 outliers 的支持向量机才终于介绍完毕了。
行文至此,可以做个小结,不准确的说,SVM它本质上即是一个分类方法,用 w T + b w^T+b wT+b定义分类函数,于是求 w 、 b w、b w、b,为寻最大间隔,引出 1 2 ∣ ∣ w ∣ ∣ 2 1\over2{||w||^2} 2∣∣w∣∣21,继而引入拉格朗日因子,化为对拉格朗日乘子 α \alpha α的求解(求解过程中会涉及到一系列最优化或凸二次规划等问题),如此,求 w . b w.b w.b与求 α \alpha α等价,而 α \alpha α的求解可以用一种快速学习算法SMO,至于核函数,是为处理非线性情况,若直接映射到高维计算恐维度爆炸,故在低维计算,等效高维表现。
本部分导述
算法目的:不断的训练试错以期寻找一个合适的超平面(是的,就这么简单)。
下面,举个例子。如下图所示,凭我们的直觉可以看出,图中的红线是最优超平面,蓝线则是根据感知机算法在不断的训练中,最终,若蓝线能通过不断的训练移动到红线位置上,则代表训练成功。
既然需要通过不断的训练以让蓝线最终成为最优分类超平面,那么,到底需要训练多少次呢?Novikoff定理告诉我们当间隔是正的时候感知机算法会在有限次数的迭代中收敛,也就是说Novikoff定理证明了感知机算法的收敛性,即能得到一个界,不至于无穷循环下去。
解释下这个扩充间隔 γ \gamma γ, γ \gamma γ即为样本到分类间隔的距离,即从引出的最大分类间隔。上文,如下:“
在给出几何间隔的定义之前,首先来看下,如上图所示,对于一个点x,令其垂直投影到超平面上的对应的为x0,由于w是垂直于超平面的一个向量, γ \gamma γ为样本x到分类间隔的距离,我们有
然后后续怎么推导出最大分类间隔请回到本文第一、二部分,此处不重复板书。
同时有一点得注意:感知机算法虽然可以通过简单迭代对线性可分数据生成正确分类的超平面,但不是最优效果,那怎样才能得到最优效果呢,就是上文中第一部分所讲的寻找最大分类间隔超平面。
Mercer定理 :如果函数K是 R n ∗ R n − > R \mathbb{R^n*R^n->R} Rn∗Rn−>R上的映射(也就是从两个n维向量映射到实数域)。那么如果K是一个有效核函数(也称为Mercer核函数),那么当且仅当对于训练样例{ x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . x ( m ) {x^{(1)},x^{(2)},x^{(3)},... x^{(m)}} x(1),x(2),x(3),...x(m)},其相应的核函数矩阵是对称半正定的。
要理解这个Mercer定理,先要了解什么是半正定矩阵,要了解什么是半正定矩阵,先得知道什么是正定矩阵(矩阵理论博大精深,关于矩阵推荐我正在看的一本《矩阵分析与应用》)。然后这里有一个此定理的证明,可以看下。
支持向量机(SVM)是90年代中期发展起来的基于统计学习理论的一种机器学习方法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。”
监督学习实际上就是一个经验风险或者结构风险函数的最优化问题。风险函数度量平均意义下模型预测的好坏,模型每一次预测的好坏用损失函数来度量。它从假设空间F中选择模型f作为决策函数,对于给定的输入X,由f(X)给出相应的输出Y,这个输出的预测值f(X)与真实值Y可能一致也可能不一致,用一个损失函数来度量预测错误的程度。损失函数记为L(Y, f(X))。
在上文中,我们提到了求解对偶问题的序列最小最优化SMO算法,但并未提到其具体解法。首先看下最后悬而未决的问题:
等价于求解:
1998年,Microsoft Research的John C. Platt在论文《Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines》中提出针对上述问题的解法:SMO算法,它很快便成为最快的二次规划优化算法,特别是在针对线性SVM和数据稀疏时性能更优。
首先来定义特征到结果的输出函数:
注:这个 u u u与我们之前定义的
实质是一样的。
接着,重新定义下原始的优化问题,权当重新回顾,如下:
求导得到:
代入
中,可得
通过引入拉格朗日乘子转换为对偶问题后,得:
注:这里得到的min函数与我们之前的max函数实质也是一样,因为把符号变下,即由min转化为max的问题,且 y i y_i yi也与之前的 y ( i ) y^{(i)} y(i)等价, y j y_j yj亦如此。
经过加入松弛变量后,模型修改为:
下面要解决的问题是:在{ α 1 , α 2 , . . . α n \alpha_1,\alpha_2,...\alpha_n α1,α2,...αn}上求上述目标函数的最小值。为了求解这些乘子,每次从中任意抽取两个乘子 α 1 \alpha_1 α1和 α 2 \alpha_2 α2,然后固定和以外的其它乘子{ α 3 , α 4 , . . . α n \alpha_3,\alpha_4,...\alpha_n α3,α4,...αn},使得目标函数只是关于 α 1 \alpha_1 α1和 α 2 \alpha_2 α2的函数。这样,不断的从一堆乘子中任意抽取两个求解,不断的迭代求解子问题,最终达到求解原问题的目的。
而原对偶问题的子问题的目标函数可以表达为:
其中
为了解决这个子问题,首要问题便是每次如何选取 α 1 \alpha_1 α1和 α 2 \alpha_2 α2。实际上,其中一个乘子是违法KKT条件最严重的,另外一个乘子则由另一个约束条件选取。
根据KKT条件可以得出目标函数中 α i \alpha_i αi取值的意义:
这里 α i \alpha_i αi的还是拉格朗日乘子:
而最优解需要满足KKT条件,即上述3个条件都得满足,以下几种情况出现将会出现不满足:
因此,如果假设选择的两个乘子 α 1 o l d \alpha_1^{old} α1old和 α 2 o l d \alpha_2^{old} α2old,它们在更新之前分别是 α 1 n e w \alpha_1^{new} α1new和 α 2 n e w \alpha_2^{new} α2new、,更新之后分别是、,那么更新前后的值需要满足以下等式才能保证和为0的约束:
其中 ξ \xi ξ是常数。
两个因子不好同时求解,所以可先求第二个乘子 α 2 \alpha_2 α2的解( α 2 n e w \alpha_2^{new} α2new),得到 α 2 \alpha_2 α2的解( α 2 n e w \alpha_2^{new} α2new)之后,再用 α 2 \alpha_2 α2的解( α 2 n e w \alpha_2^{new} α2new)表示 α 1 \alpha_1 α1的解( α 1 n e w \alpha_1^{new} α1new)。
为了求解 α 2 n e w \alpha_2 ^{new} α2new,得先确定 α 2 n e w \alpha_2 ^{new} α2new的取值范围。假设它的上下边界分别为H和L,那么有:
接下来,综合
和
这两个约束条件,求取 α 2 n e w \alpha_2^{new} α2new的取值范围。
当y1 = y2时,同样根据可得
可得
所以有
如下图所示:
如此,根据y1和y2异号或同号,可得出的上下界分别为:
回顾下第二个约束条件
令上式两边乘以y1,可得
其中,
因此, α 1 \alpha_1 α1可以用 α 2 \alpha_2 α2表示, α 1 = ω − s ∗ α 2 \alpha_1=\omega-s*\alpha_2 α1=ω−s∗α2,从而把子问题的目标函数转换为只含 α 2 \alpha_2 α2的问题:
对 α 2 \alpha_2 α2求导,可得
化简下得到式子3:
然后将 s = y 1 ∗ y 2 s=y_1*y_2 s=y1∗y2、
三个式子代入式子3,可得
令 E i = u i − y i E_i=u_i-y_i Ei=ui−yi表示预测值与真实值之差,
然后上式两边同时除以 η \eta η,得到一个关于单变量 α 2 \alpha_2 α2的解:
这个解没有考虑其约束条件 0 ≤ α 2 ≤ C 0\leq\alpha_2\leq C 0≤α2≤C,即是未经剪辑时的解。
然后考虑约束 0 ≤ α 2 ≤ C 0\leq\alpha_2\leq C 0≤α2≤C 可得到经过剪辑后的 α 2 n e w \alpha_2^{new} α2new的解析解为:
求出了 α 2 n e w \alpha_2^{new} α2new后,便可以求出 α 1 n e w \alpha_1^{new} α1new,得 α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d − α 2 n e w ) \alpha_1^{new}=\alpha_1^{old}+y_1y_2(\alpha_2^{old}-\alpha_2^{new}) α1new=α1old+y1y2(α2old−α2new)。
那么如何选择乘子 α 1 和 α 2 \alpha_1和\alpha_2 α1和α2呢?
而b在满足下述条件:
下更新b:
且每次更新完两个乘子的优化后,都需要再重新计算b,及对应的Ei值。
最后更新所有 α i \alpha_i αi,y和b,这样模型就出来了,从而即可求出开头提出的分类函数:
综上,总结下SMO的主要步骤,如下:
意思是,
第一步选取一对 α i \alpha_i αi和 α j \alpha_j αj,选取方法使用启发式方法;
第二步,固定除 α i \alpha_i αi和 α j \alpha_j αj之外的其他参数,确定W极值条件下的 α i \alpha_i αi和 α j \alpha_j αj由 α i \alpha_i αi表示。
假定在某一次迭代中,需要更新 x 1 , x 2 x_1,x_2 x1,x2,对应的拉格朗日乘子 α 1 , α 2 \alpha_1,\alpha_2 α1,α2,那么这个小规模的二次规划问题写为:
那么在每次迭代中,如何更新乘子呢?引用这里的两张tu说明下:
知道了如何更新乘子,那么选取哪些乘子进行更新呢?具体选择方法有以下两个步骤:
综上,SMO算法的基本思想是将Vapnik在1982年提出的Chunking方法推到极致,SMO算法每次迭代只选出两个分量ai和aj进行调整,其它分量则保持固定不变,在得到解ai和aj之后,再用ai和aj改进其它分量。与通常的分解算法比较,尽管它可能需要更多的迭代次数,但每次迭代的计算量比较小,所以该算法表现出较好的快速收敛性,且不需要存储核矩阵,也没有矩阵运算。
本文来自 v_JULY_v 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/v_july_v/article/details/7624837?utm_source=copy