python3《机器学习实战系列》学习笔记----5.2 SMO(序列最小优化)算法求解SVM

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mcyJacky/article/details/83067530

前言

     机器学习实战系列之学习笔记主要是本人进行学习机器学习的整理。本系列所有代码是用python3编写,并使用IDE PycharmWindows平台上编译通过。本系列所涉及的所有代码和资料可在我的github或者码云上下载到,gitbub地址:https://github.com/mcyJacky/MachineLearning,码云地址:https://gitee.com/mcyHome/MachineLearning,如有问题,欢迎指出~。

一、SMO算法概述

1.1 简述

     SMO(Sequential minimal optimization)算法,即序列最小最优化算法,是一种用于解决支持向量机训练过程中所产生优化问题的算法。1998年由微软研究院Platt提出,目前被广泛使用于SVM的训练过程中,并在通行的SVM库LIBSVM中得以实现。在上一篇文章中,我们知道支持向量机的学习问题可以形式化为求解凸二次规划问题,这样的凸二次规划问题具有全局最优解,并且有许多最优化算法可以用于这一问题的求解,但是当训练样本容量很大时,这些算法就变得非常低效,以致无法使用。所有才使用SMO这种快速实现的算法。
     SMO算法要求解如下凸二次规划的对偶问题:
(1.1) { min α 1 2 i = 1 N j = 1 N α i α j y i y j K ( x i x j ) i = 1 N α i s . t . j = 1 N α i y i = 0 0 α i C , i = 1 , 2 , . . . , N \begin{cases} \min \limits_{α} \quad \frac{1}{2} \sum_{i=1}^N \sum_{j=1}^N α_iα_jy_iy_jK(x_ix_j) - \sum_{i=1}^N α_i \\ s.t.\quad \sum_{j=1}^N α_iy_i = 0 \\ \quad \quad \quad 0 \leq α_i \leq C, i=1,2,...,N \end{cases} \tag{1.1}
在这个问题中,变量是拉格朗日乘子,一个变量 α i α_i 对应于一个样本点 ( x i , y i ) (x_i,y_i) ;变量的总数等于训练样本容量 N N

1.2 基本思路

     SMO算法是一种启发式算法,其基本思路是:如果所有变量的解都满足此最优化问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反KKT最严重的一个,另一个由约束条件自动确定。如此,SMO算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。
     注意,子问题的两个变量中只有一个是自由变量。假设 α 1 , α 2 α_1,α_2 为两个变量, α 3 , α 4 , . . . , α N α_3,α_4,...,α_N 固定,那么由式(1.1)等式约束可知:
α 1 = y 1 i = 2 N α i y i α_1 = -y_1 \sum_{i=2}^N α_iy_i
所以如果 α 2 α_2 确定,那么 α 1 α_1 也随之确定,所以子问题中同时更新两个变量。
     整个SMO算法包括两个部分:求解两个变量二次规划的解析方法选择变量启发式方法

二、SMO算法求解

2.1 两个变量二次规划的求解方法

     我们假设选择的两个变量是 α 1 , α 2 α_1,α_2 ,其它变量 α i ( i = 3 , 4 , . . . , N ) α_i(i=3,4,...,N) 是固定的。于是SMO算法的最优化问题式(1.1)的子问题可以写成:
(2.1) { min α 1 , α 2 W ( α 1 , α 2 ) = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 ( α 1 α 2 ) + y 1 α 1 i = 3 N y i α i K i 1 + y 2 α 2 i = 3 N y i α i K i 2 s . t . α 1 y 1 + α 2 y 2 = i = 3 N y i α i = ζ 0 α i C , i = 1 , 2 \begin{cases} \min \limits_{α_1,α_2} W(α_1,α_2) = \frac{1}{2}K_{11} α_1^2 + \frac{1}{2}K_{22} α_2^2 + y_1y_2K_{12}α_1α_2 - (α_1 - α_2) \\\quad\quad\quad\quad\quad\quad\quad\quad+ y_1 α_1\sum_{i=3}^N y_iα_iK_{i1} + y_2 α_2\sum_{i=3}^N y_iα_iK_{i2}\\ s.t.\quad α_1y_1 + α_2y_2 = -\sum_{i=3}^N y_iα_i = ζ\\ \quad \quad \quad 0 \leq α_i \leq C, i=1,2 \end{cases} \tag{2.1}
其中, K i j = K ( x i , x j ) , i , j = 1 , 2 , . . , N , ζ K_{ij}=K(x_i,x_j), i,j=1,2,..,N,ζ 是常数,目标函数式(2.1)中省略了常数项。
     为了求解两个变量的二次规划问题式(2.1),首先分析约束条件,然后在此约束条件下求极小值。由于只有两个变量 ( α 1 , α 2 ) (α_1,α_2) ,可以用二维空间中的图形表示。假设问题(2.1)的初始可行解为 α 1 o l d , α 2 o l d α_1^{old},α_2^{old} ,最优解为 α 1 n e w , α 2 n e w α_1^{new},α_2^{new} ,且假设沿着约束方向未经剪辑时约束 α 2 α_2 的最优解为 α 2 n e w , u n c α_2^{new,unc}
①当 y 1 y 2 = > α 1 α 2 = k y_1 \neq y_2 => α_1 - α_2 = k

图2.1 二次变量优化约束第一种情况

②当 y 1 = y 2 = > α 1 + α 2 = k y_1 = y_2 => α_1 + α_2 = k

图2.2 二次变量优化约束第二种情况

分析: 不等式约束使得 ( α 1 , α 2 ) (α_1,α_2) 在矩形盒[0,C]x[0,C]内,等式约束使得 ( α 1 , α 2 ) (α_1,α_2) 在平行于盒子的对角线的直线上,因此要求的是目标函数在一条平行于对角线的线段上的最优值,这使得两个变量的最优化问题成为实质上的单变量的最优化问题,不妨考虑为变量 α 2 α_2 的最优化问题:
     由于 α 2 n e w α_2^{new} 需满足式(2.1)中不等式约束,所以 α 2 n e w α_2^{new} 的取值范围必须满足条件:
L α 2 n e w H L \leq α_2^{new} \leq H
其中, L H L与H α 2 n e w α_2^{new} 所在的对角线端点的界。如果 y 1 y 2 y_1 \neq y_2 ,如图2.1所以,则:
L = max ( 0 , α 2 o l d α 1 o l d ) , H = min ( C , C + α 2 o l d α 1 o l d ) L=\max (0, α_2^{old} - α_1^{old} ), H=\min (C, C+ α_2^{old} - α_1^{old})
如果 y 1 = y 2 y_1 = y_2 ,如图2.2所以,则:
L = max ( 0 , α 2 o l d + α 1 o l d C ) , H = min ( C , α 2 o l d + α 1 o l d ) L=\max (0, α_2^{old} + α_1^{old} -C ), H=\min (C, α_2^{old} + α_1^{old})

     下面,首先求沿着约束方向未经过剪辑即未考虑不等式约束时 α 2 α_2 的最优解 α 2 n e w , f u n c α_2^{new,func} ;然后再求剪辑后 α 2 α_2 的最优解 α 2 n e w α_2^{new} 。为了叙述简单,我们记:
(2.2) g ( x ) = i = 1 N α i y i K ( x i , x ) + b g(x) = \sum_{i=1}^N α_iy_iK(x_i,x) + b \tag{2.2}
令:
(2.3) E i = g ( x i ) y i = ( j = 1 N α i y i K ( x j , x i ) + b ) y i , i = 1 , 2 E_i = g(x_i) - y_i = \big( \sum_{j=1}^N α_iy_iK(x_j,x_i) + b \big) - y_i , i=1,2\tag{2.3}
i = 1 , 2 i=1,2 时, E i E_i 为函数 g ( x ) g(x) 对输入 x i x_i 的预测值与真实输出 y i y_i 之差。
下面是公式推导过程:
     我们记:
v i = j = 3 N α j y j K ( x i , x j ) = g ( x i ) j = 1 2 α j y j K ( x i , x j ) b v_i = \sum_{j=3}^N α_jy_jK(x_i,x_j)=g(x_i) - \sum_{j=1}^2 α_jy_jK(x_i,x_j) - b
则目标函数式(2.1)可写成:
(2.4) W ( α 1 , α 2 ) = 1 2 K 11 α 1 2 + 1 2 K 22 α 2 2 + y 1 y 2 K 12 α 1 α 2 ( α 1 α 2 ) + y 1 v 1 α 1 + y 2 v 2 α 2 W(α_1,α_2) = \frac{1}{2}K_{11} α_1^2 + \frac{1}{2}K_{22} α_2^2 + y_1y_2K_{12}α_1α_2 - (α_1 - α_2) + y_1 v_1α_1 + y_2v_2α_2 \tag{2.4}
又由 α 1 y 1 = ζ α 2 y 2 α_1y_1 = ζ - α_2y_2 y i 2 = 1 y_i^2=1 ,可将 α 1 α_1 表示为
α 1 = ( ζ α 2 y 2 ) y 1 α_1 = (ζ - α_2y_2)y_1
将其带入式(2.4),得到只是关于 α 2 α_2 函数的目标函数:
(2.5) W ( α 2 ) = 1 2 K 11 ( ζ α 2 y 2 ) 2 + 1 2 K 22 α 2 2 + y 2 K 12 ( ζ α 2 y 2 ) α 2 ( ζ α 2 y 2 ) y 1 α 2 + v 1 ( ζ α 2 y 2 ) + y 2 v 2 α 2 W(α_2)=\frac{1}{2}K_{11} (ζ - α_2y_2)^2 + \frac{1}{2}K_{22} α_2^2 + y_2K_{12}(ζ - α_2y_2)α_2 \\ - (ζ - α_2y_2)y_1 - α_2 + v_1(ζ - α_2y_2) + y_2v_2α_2 \tag{2.5}
式(2.5)对 α 2 α_2 求导:
(2.6) W α 2 = K 11 α 2 + K 22 α 2 2 K 12 α 2 K 11 ζ y 2 + K 12 ζ y 2 + y 1 y 2 1 v 1 y 2 + y 2 v 2 \frac{\partial W}{\partial α_2} = K_{11}α_2 + K_{22}α_2 - 2K_{12}α_2 - K_{11}ζy_2 + K_{12}ζy_2 + y_1y_2 - 1 - v_1y_2 + y_2v_2 \tag{2.6}
令式(2.6)为0,得:
( K 11 + K 22 2 K 12 ) α 2 = y 2 ( y 2 y 1 + ζ K 11 ζ K 12 + v 1 v 2 ) = y 2 [ y 2 y 1 + ζ K 11 ζ K 12 + ( g ( x 1 ) j = 1 2 y j α j K 1 j b ) ( g ( x 2 ) j = 1 2 y j α j K 2 j b ) ] (K_{11} + K_{22} - 2K_{12})α_2 = y_2(y_2 - y_1 + ζK_{11} - ζK_{12} + v_1 - v_2) \\ \qquad \qquad \qquad=y_2 \big[ y_2 - y_1 + ζK_{11} - ζK_{12} + \big( g(x_1) - \sum_{j=1}^2y_jα_jK_{1j} - b\big) -\big( g(x_2) - \sum_{j=1}^2y_jα_jK_{2j} - b\big)\big]
ζ = α 1 o l d y 1 + α 2 o l d y 2 ζ=α_1^{old}y_1 + α_2^{old}y_2 代入,得到:
( K 11 + K 22 2 K 12 ) α 2 n e w , u n c = y 2 ( ( K 11 + K 22 2 K 12 ) α 2 o l d y 2 + y 2 y 1 + g ( x 1 ) g ( x 2 ) ) = ( K 11 + K 22 2 K 12 ) α 2 o l d + y 2 ( E 1 E 2 ) (K_{11} + K_{22} - 2K_{12})α_2^{new,unc} = y_2((K_{11} + K_{22} - 2K_{12})α_2^{old}y_2 + y_2 - y_1 +g(x_1)-g(x_2)) \\\qquad\qquad\qquad=(K_{11} + K_{22} - 2K_{12})α_2^{old} + y_2(E_1-E_2)
η = K 11 + K 22 2 K 12 η=K_{11} + K_{22} - 2K_{12} 代入,于是得到:
(2.7) α 2 n e w , u n c = α 2 o l d + y 2 ( E 1 E 2 ) η α_2^{new,unc} = α_2^{old} + \frac{y_2(E_1-E_2)}{η} \tag{2.7}
所以要使其满足不等式约束必须将限制在区间[L,H]内,从而得到新的 α 2 n e w α_2^{new} 的表达式
(2.8) α 2 n e w = { H , α 2 n e w , u n c > H α 2 n e w , u n c , L α 2 n e w , u n c H L , α 2 n e w , u n c < L α_2^{new}= \left \{\begin{array}{cc} H, &α_2^{new,unc} > H\\ α_2^{new,unc}, &L \leq α_2^{new,unc} \leq H\\ L, &α_2^{new,unc} < L \end{array}\right \tag{2.8}.
α 2 n e w α_2^{new} 求得 α 1 n e w α_1^{new} 是:
(2.9) α 1 n e w = α 1 o l d + y 1 y 2 ( α 2 o l d α 2 n e w ) α_1^{new} = α_1^{old} + y_1y_2(α_2^{old}- α_2^{new}) \tag{2.9}

2.2 变量的选择方法

     SMO算法在每个子问题中选择两个变量优化,其中至少一个变量是违反KKT条件的。
①第一个变量选择
     SMO称选择第一个变量的过程为外层循环。外层循环在训练样本中选取违反KKT条件最严重的样本点,并将其对应的变量作为第1个变量。具体地,检验训练样本点 ( x i , y i ) (x_i,y_i) 是否满足KKT条件,即:
(2.10) α i = 0 y i g ( x i ) 1 α_i = 0 \Rightarrow y_ig(x_i) \geq 1 \tag{2.10}
(2.11) 0 < α i < C y i g ( x i ) = 1 0 < α_i < C \Rightarrow y_ig(x_i) = 1 \tag{2.11}
(2.12) α i = C y i g ( x i ) 1 α_i = C \Rightarrow y_ig(x_i) \leq 1 \tag{2.12}
其中, g ( x i ) = j = 1 N α j y j K ( x i , x j ) + b g(x_i) = \sum_{j=1}^N α_jy_jK(x_i,x_j) + b
     该检测是在 ε ε 范围内进行的,在检测过程中,外层循环首先遍历所有满足条件 0 < α i < C 0 < α_i < C 的样本点,即在间隔边界上的支持向量点,检验它们是否满足KKT条件。如果这些样本点都满足KKT条件,那么遍历整个训练集,检验它们是否满足KKT条件。

②第二个变量选择
     SMO称选择第2个变量过程为内层循环。假设在外层循环中已经找到第1个变量 α 1 α_1 ,现在要在内层循环中找第2个变量 α 2 α_2 。第2个变量选择的标准是希望能使 α 2 α_2 有足够大的变化
     由式(2.7)和(2.8)可知, α 2 n e w α_2^{new} 是依赖于 E 1 E 2 |E_1 - E_2| 的,为了加快计算速度,一种简单的做法是选择 α 2 α_2 ,使其对应的 E 1 E 2 |E_1 - E_2| 最大。因为 α 1 α_1 已定, E 1 E_1 也确定了。如果 E 1 E_1 是正的,那么选择最小的 E i E_i 作为 E 2 E_2 ;如果 E 1 E_1 是负的,那么选择最大的 E i E_i 作为 E 2 E_2 。为了节省计算时间,我们将所有 E i E_i 值都保存在一个列表中。
     在某种特殊情况下,如果内层循环通过以上方法选择的 α 2 α_2 不能使目标函数有足够大的下降,那么采用以下启发式规则继续选择 α 2 α_2 :遍历在间隔边界上的支持向量点,依次将其对应的变量作为 α 2 α_2 试用,直到目标函数有足够的下降,若找不到合适的 α 2 α_2 ,那么遍历训练数据集;若仍找不到合适的 α 2 α_2 ,则放弃第一个 α 1 α_1 ,再通过外层循环寻找另外的 α 1 α_1

③计算阈值 b b 和差值 E i E_i
     在每次完成两个变量的优化后,都要重新计算阈值 b b 。当 0 < α 1 n e w < C 0<α_1^{new}<C 时,由KKT条件可知:
i = 1 N α i y i K i 1 + b = y 1 \sum_{i=1}^N α_iy_iK_{i1} + b = y_1
于是:
(2.13) b 1 n e w = y 1 i = 3 N α i y i K i 1 α 1 n e w y 1 K 11 α 2 n e w y 2 K 21 b_1^{new} = y_1 - \sum_{i=3}^N α_iy_iK_{i1} - α_1^{new}y_1K_{11} - α_2^{new}y_2K_{21} \tag{2.13}
根据 E 1 E_1 的定义式(2.3)有:
E 1 = i = 3 N α i y i K i 1 + α 1 o l d y 1 K 11 + α 2 o l d y 2 K 21 + b o l d y 1 E_1 = \sum_{i=3}^N α_iy_iK_{i1} + α_1^{old}y_1K_{11} + α_2^{old}y_2K_{21} + b^{old} - y_1
式(2.13)前两项可以写成:
y 1 i = 3 N α i y i K i 1 = E 1 + α 1 o l d y 1 K 11 + α 2 o l d y 2 K 21 + b o l d y_1 - \sum_{i=3}^N α_iy_iK_{i1}=-E_1 + α_1^{old}y_1K_{11}+α_2^{old}y_2K_{21}+b^{old}
带入式(2.13)得:
(2.14) b 1 n e w = E 1 y 1 K 11 ( α 1 n e w α 1 o l d ) y 2 K 21 ( α 2 n e w α 2 o l d ) + b o l d b_1^{new}=-E_1 - y_1K_{11}(α_1^{new}-α_1^{old})-y_2K_{21}(α_2^{new}-α_2^{old})+b^{old} \tag{2.14}
同样的,如果 0 < α 2 n e w < C 0<α_2^{new}<C 时,那么:
(2.15) b 2 n e w = E 2 y 1 K 12 ( α 1 n e w α 1 o l d ) y 2 K 22 ( α 2 n e w α 2 o l d ) + b o l d b_2^{new}=-E_2 - y_1K_{12}(α_1^{new}-α_1^{old})-y_2K_{22}(α_2^{new}-α_2^{old})+b^{old} \tag{2.15}
     所以如果 α 1 n e w , α 2 n e w α_1^{new},α_2^{new} 同时满足 0 < α i n e w < C , i = 1 , 2 0<α_i^{new}<C,i=1,2 ,那么 b 1 n e w = b 2 n e w b_1^{new}=b_2^{new} 。如果 α 1 n e w , α 2 n e w α_1^{new},α_2^{new} 是0或者 C C ,那么 b 1 n e w b_1^{new} b 2 n e w b_2^{new} 以及它们之间的数都符合KKT条件的阈值,这时选择它们的中点作为 b n e w b^{new}
     在每次完成两个变量的优化之后,还必须更新对应的 E i E_i 值,并将它们保存在列表中。 E i E_i 值的更新要用到 b n e w b^{new} 值,以及所有支持向量对应的 α j α_j
(2.16) E i n e w = S y j α j K ( x i , x j ) + b n e w y i E_i^{new}=\sum_{S}y_jα_jK(x_i,x_j) + b^{new} - y_i \tag{2.16}
其中, S S 是所有支持向量 x j x_j 的集合。

2.3 SMO伪算法

     输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) ,   , ( x N , y N ) } T=\{(x_1, y_1),(x_2, y_2),\cdots,(x_N, y_N)\} ,其中, x i R n x_i \in \mathbf{R}^n , y i { 1 , + 1 } , i = 1 , 2 ,   , N y_i \in \{ -1,+1\},i=1,2,\cdots,N ,精度为 ε ε

     输出:近似解 α ^ \hat{α} .

     (1) 取 α ( 0 ) = 0 , k = 0 α^{(0)}=0, 令k=0 ;

     (2) 选取优化变量 α 1 ( k ) , α 2 ( k ) α_1^{(k)}, α_2^{(k)} ,解析求解两个变量的最优化问题式(2.1),求得最优解 α 1 ( k + 1 ) , α 2 ( k + 1 ) α_1^{(k+1)}, α_2^{(k+1)} ,更新 α α α k + 1 α^{k+1} ;

     (3) 若在精度 ε ε 范围内满足停机条件:
i = 1 N α i y i = 0 \sum_{i=1}^N α_iy_i = 0
0 α i C i = 1 , 2 ,   , N 0 \leq α_i \leq C,i=1,2,\cdots,N
y i g ( x i ) = { 1 , { x i α i = 0 } = 1 , { x i 0 α i C } 1 , { x i α i = C } y_ig(x_i)= \left \{\begin{array}{cc} \geq1, &\{x_i|α_i = 0\}\\ =1, & \quad\quad\{x_i| 0 \leq α_i \leq C\}\\ \leq 1, &\{x_i|α_i = C\} \end{array}\right.
其中 g ( x i ) = j = 1 N α j y j K ( x j , x i ) + b g(x_i)=\sum_{j=1}^N α_jy_jK(x_j,x_i) +b .
则转(4);否则令 k = k + 1 k=k+1 ,则转(2);

     (4) 取 α ^ = α ( k + 1 ) \hat{α}=α^{(k+1)} ;

三、小结

     本章介绍了SMO算法推导过程,支持向量机及SMO算法实现,是学习到目前为止最为复杂的算法,因此也耗费了我很多的时间。理论推导还是需要运用于实践,下面一篇将具体介绍如果用Python实现支持向量机及SMO算法。

【参考】:
     1. 《统计学习方法》作者:李航   第7章 支持向量机中SMO算法


转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky

猜你喜欢

转载自blog.csdn.net/mcyJacky/article/details/83067530