我与机器学习 - [Today is SVM] - [支持向量机]

支持向量机分为:

线性可分支持向量机,线性支持向量机,非线性支持向量机。

下面开始推导:

核心思想:让距离最小的点取最大。就是对于每一个可行的超平面,计算最近的点的距离,找到一个超平面,能使这个距离最大,就是最好的分割超平面,这样分类的效果最明显。

计算点到直线的距离 

然后,转化为求 max min d的问题

然后,我们希望预测值和实际值是相同的,也就是说,预测值和实际值同号,这里yi为实际值,y(xi)为预测值,就有yi * y(xi) > 0,于是得到下图的函数。

该函数就是svm的目标函数,满足预测值与实际值同号,选择一条距离最小距离点最大的分割线或者分割平面。

至此,目标函数已经求出来了,接下来的问题就是求解目标函数。

这里对W进行了缩放操作,为了就是能让y>=1,说明如下图。

当有了这个条件,就可以接着化简。

不等式约束问题,考虑到用拉格朗日乘子法,得到:

这样一个式子,该怎么取处理。

接下来就是分别对w和b求偏导,然后带入到式子中得到一个关于a的式子。

这里得到了两个式子。

将其带回到拉格朗日的式子中:

这里还是将求max问题转化为求min问题

这里新增了一个约束,ai >= 0 这是因为在对

这个式子作处理的时候,我们希望,max L(w,b,a) 能取到一个a,使得该式子最大,也就是等于||w||平方/2.

所以式子推导到这里,有两个约束条件。

这里求得a后,就可以求得w,b

至此,svm目标函数以及推导就全部完成了,现在摆在面前的问题是,对于目标函数,怎么求得a,对于这个问题,著名的解决svm问题的smo算法的确是第一选择。接下来我们将会推导smo算法。

在推导smo之前,先进行一个例子,对刚才的问题做一个巩固。

这个例子得到什么启示:

这里求得的x1对应的a1为1/4,x2对应的a2为0,x3对应的a3为1/4,所以,将a2带入到求w的式子中,可以看出来,x2这个样本点对求w没有起到作用。而x1和x3这两个样本,对w是有作用的,我们把这两个点叫做支撑点。

推导到N维,我们说对于n个样本,有对应的n个a,可能只有个别a是不等于0的,我们把这些不等于0的样本点,就叫做支撑向量。对于所有的a来说,a是一个稀疏的。

以上说明的是,线性可分支持向量机,是一种理想情况,当样本集无法只用一条直线完美区分开的时候,这时候就有了,线性支持向量机。

其区别就是增加了一个松弛因子。

这里的C是个重点,表示对松弛因子的容忍度,svm的api调参数的重点,也是api中c代表的含义。

这里的C直观上看,表示,支撑向量距离分割超平面的距离,由式子上来看C。

当C无穷大的时候,后面的柯西的求和不管多小,整个式子都无法满足求最小。所以这里C的意义就是控制松弛因子的一个权重。

C越大表示,不允许犯错,所以支撑向量到分割超平面的距离越小。这时训练集分类很精密,容易造成过拟合。

C越小表示,支撑向量面到分割超平面的距离大,泛化能力好。

当C = 无穷,就等价于线性可分svm。

下面来看核函数

这里多使用的是高斯核函数也就是径向基函数。

看一下径向基函数,这里类比于高斯分布的概率密度函数,假设其等价于均值为x1,方差为sigma平方的高斯分布,当sigma很大的时候,说明方差很大,高斯函数的底部很开,当非常开散的时候,就好像一条直线,当方差很小时,高斯函数的顶部很尖。

而对于svm函数很重要的另一个参数就是gama,gama = -1/sigma的平方,在svm调参中,很多api中的gama就是这个意思。

由图中可知,gama越大,对样本点的精度越高,越容易形成过拟合。

gama越小,泛化能力越好,分界面越接近一条直线。逼近线性的svm。

当使用高斯核函数时候,其分类过程相当于将一部分数据提升上去,一部分数据降下来。

下面开始smo部分的讲解

 SMO-Sequential Minimal Optimization,序列最小优化,SMO的基本思路就是:先固定ai之外的所有参数,然后求ai的极值。但是问题中存在约束条件:

如果固定了ai之外的其他变量,则ai可以由其他的变量导出。于是,一次只留一个参数,固定其余参数的方法在这里是不适用的,但是这个思想却给了我们不错的启发。那么,SMO可以每次选择两个变量ai和aj,并固定其他参数。这样,在参数初始化之后,SMO不断迭代重复下面的步骤,直至收敛:

1.选取一对新的ai,aj。

2.固定其他的参数,求解优化的ai,aj,获取更新后的ai,aj。

简化原目标函数:

原目标函数为:

改为只有a1和a2为变量,其余都为常量。

有了这个式子之后,接下来确定解的范围。

接下来进入求解过程

对该式子关于a2求导:

式子中含有v1,v2,需要作变换

将求出来的v1和v2带入到求导的等式中

现在a1和a2地推公式已经求解完成。

下面来看一下w和b怎么求解出来

w的求解:

再来看b:

以上smo算法的推导就完成了,接下来我么要看一下smo启发式的方法

​在SMO算法中,如果使用遍历所有的αi,再随机选择第二个变量进行优化,也能实现功能,但是算法速度非常的慢,为了提高算法的运算速度,目前一般采用一种启发式的变量选择。

第二个变量的选择上:

假设在外循环中找到的第一个变量记为α1,那么第二个变量的选择我希望能使α2有较大的变化。由于α2是依赖于|E1−E2|,当Ei为正时,那么选择最小的Ei作为E2 ,如果Ei为负,选择最大Ei作为E2,通常为每个样本的Ei保存在一个列表中,选择最大的|E1−E2|来近似最大化步长。

至此,svm算法和smo算法推演完毕。

以上部分部分内容转自:

https://blog.csdn.net/kabuto_hui/article/details/80369793

http://www.chinahadoop.cn/

下面开始看代码:

首先从简化版的开始入手,就是不含有启发式的,也就是外层遍历整个数据集,内层随机选择。

伪代码:

初始化数据集,标签集为numpy的矩阵

初始化b = 0

计算数据集的维度 m行 n列

初始化alpha,维度为m行1列的

初始化迭代次数  = o

while循环判断迭代次数如果小于设定的最大迭代次数

      初始化一个bool变量标记是否有alpha变化 alphapairchanged

      对所有数据进行for循环遍历

            计算f(xi)                     公式:

            计算预测误差Ei 

            判断该xi是否符合标准(需要选择一个违反KKT条件的变量)

                  接下来随机选择一个aj

                  计算f(xj)

                  计算预测误差Ej

                  获取alpha_i_old,alpha_j_out

                  判断alpha的范围,分两种情况

                  yi等于yj的时候

                        下界low等于 max{0,α1+α2−C}

                        上界high等于 min{α1+α2,C}

                  yi不等于yj的时候

                        下界low等于 max{0,α2−α1}

                        上界high等于 min{C,C+α2−α1}

                  如果low等于high跳过执行下一次循环

                  计算eta      公式为 η=2K12 - K11+K22

                  如果eta大于0 跳过执行下一次循环

                  迭代alphaj     公式为 

                  得到的新alphaj检查上下界

                  计算新的alphaj和旧的alphaj的差值如果小于一个阈值,跳过执行下一次循环

                  迭代alphai  公式为 

                  然后迭代b,计算b1和b2 公式为  

                  如果0<ai<c b等于b1,如果0<aj<c b等于b2,如果都不满足 b = b1+b2/2

                  所有参数都更新了之后,更新bool变量 alphapairchanged

      如果 alphapairchanged 等于0

            迭代次数加1

      否则

            迭代次数清0

返回alpha 和 b

猜你喜欢

转载自blog.csdn.net/weixin_43409627/article/details/84987662