ML in Action Note - Day 4/5/6/7 - SVM 未完成

研究了几天的SVM,发现实战书上的内容不详尽,于是把统计学习方法结合网上的一些博客了解了不少,确实这一章的公式推导有点吃力,不过每次在算出来后,那种畅快也是真的很让人愉快和兴奋的,抑制不住的兴奋,想要学习更多,只懊恼自己这么晚才转行,学习和理解的速度太慢。去年末学习python和python框架,上个月末才决心来学机器学习,发现机器学习中那么多有意思的东西,统计学和数学是真的很有趣啊。

但是对于公式还是不够熟悉,希望能继续多找时间复习和研究,做到完全理解SVM,能够默写推导SVM的公式,和SMO算法。说起来现在也是大概能看书本懂差不多,博客和书上的知识有一些差异,我还没有能够好好转换吸收为自己的知识。看懂了但是不吸收为自己知识的话,还是会迅速忘记的。

今天回看前些天做的前几章其他方法,也发现了自己在notebook上的不全面,不能做到以后重复使用notebook,这种无质量的文档备份,等于有种白费的感觉,浪费了时间和精力,不如从一开始就做到保证notebook质量。食之无味,弃之可惜。这一点需要谨记,在日后提升。博客同理,写出没有质量的,自己以后也不会想看,对自己也没有什么意义,如果写得好,日后自己还能继续根据记载的内容来复习,看自己理解到什么层次,有没有什么新的理解。

这一篇SVM,对于书中的代码发现有一些问题还没有处理,时间过了几天,打算先前往下一章,等过段时间等昨天下单的统计学习方法和机器学习两本实体书到了以后,再来更新。

最近一些对我很有帮助的link:

[Math & Algorithm] 拉格朗日乘数法

梯度方向与等高线方向垂直的理解

SVM关于Platt文章中SMO求解参数的具体推导过程

SVM——(三)对偶性和KKT条件(Lagrange duality and KKT condition)

Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM

>>>>>> 以下是原来的“无质量”笔记,等待更新为有质量版: )

SVM全名support vector machines,关于实现方法有很多种,书中介绍的是SMO, sequential minimal optimization算法。

优点:泛化错误率低,计算开销不大,结果容易解释。

缺点:对参数调节和kernel的选择敏感,原始分类器不修改的话仅适用于处理二类问题。

适用数值型和标称型数据。

P1:寻找最大间隔

SVM分类器是要找到最大的数据集间隔,也就是分割超平面separating hyperplane。

分割超平面的形式可以写成w^{T}x+b,那么计算点A到分割超平面的距离就是点到分割面的垂线的长度\frac{|w^{T}A+b|}{||w||}。这里的长树b类似于logistics regression里面的结局w_0

这里要使用的阶跃函数和logistics regression里不同,此处对w^{T}x+b作用得到f(w^{T}x+b),其中当u<0时f(u)输出-1,反之输入+1,而logistics regression输出的是0或1。

采用-1和+1而不是0和1是因为-1和+1仅相差一个符号,方便数学上的处理。

间隔通过label * (w^{T}x+b)如果数据点处于正方向(+1类)并且距离很远时候,w^{T}x+b是一个很大的正数,所以label * (w^{T}x+b)也是一个很大的正数。如果数据点在负方向(-1类)并且距离很远,label * (w^{T}x+b)仍然是一个很大的正数。

找到具有最小间隔的数据点,这些数据点就是support vector,然后对这些间隔点最大化。

\arg \underset{w,b}{\max}\left \{\underset{n}{\min}(label\cdot (w^{T}x+b))\cdot \frac{1}{||w||} \right \}

上面公式很复杂,进行优化的话,固定其中一个因子而最大化其他因子。如果所有support vector的label * (w^{T}x+b)都为1,那么通过求\frac{1}{||w||}的最大值得到最终解。但并非所有数据点的label * (w^{T}x+b)都等于1,只有距离分割超平面最近的点才能得到1,越远的点,label * (w^{T}x+b)的值就越大。

上面这里给定约束条件然后求最优值,约束条件是label * (w^{T}x+b)\geq 1.0。对于这类问题,可以通过拉格朗日乘子法求解。由于这里的约束条件都是基于数据点,所以我们可以把超平面写成数据点的形式,于是优化目标函数可以写成:

\underset{a}{\max}\left [\sum_{i=1}^{m}a-\frac{1}{2}\sum_{i,j=1}^{m}label^{(i)}\cdot label^{(j)}\cdot a_i\cdot a_j\left \langle x^{(i)},x^{(j)} \right \rangle\right ]

约束条件是:a\geq 0\sum_{i-1}^{m}a_i\cdot label^{(i)}=0

这里有个假设是数据必须是线性可分。因为有些数据不完整,所以可以引入slack variable来允许有些数据点可以在分割面的错误一侧,这样可以保持优化目标。于是约束条件变为:C\geq a\geq 0\sum_{i-1}^{m}a_i\cdot label^{(i)}=0

这里的常数C用于控制“最大化间隔”和“保证大部分点的函数间隔小于1.0”这两个目标的权重。

1. label * (w^{T}x+b)被称为点到分割面的函数间隔label * (w^{T}x+b)\cdot \frac{1}{||w||}为点到分割面的几何间隔

2. 尖括号表示x^{(i)}x^{(j)}两个向量的内积。

SVM本身是一个二分类的tool,如果需要多个分类,需要修改代码。

SMO(sequential minimal optimization)算法可以训练SVM,它把大问题分解成小优化问题来求解。通过求出一系列alpha和b,一旦求出了这些alpha,就很容易计算出权重向量w并得到分割超平面。

SMO工作原理:每次循环中选择两个alpha来优化处理。一旦找到一对合适的alpha,那么增大其中一个同时减少另一个。合适的意思:1. 两个alpha必须在间隔边界之外 2. 两个alpha还没有进行过区间化处理或不在边界上

简化版SMO算法:

SMO算法中的外循环要确定要优化的最佳alpha对,简化版会跳过这里。首先在数据集上遍历每一个alpha,然后再剩下的alpha集合中随机选择另一个alpha,从而构建alpha对。需要同时改变两个alpha,因为有一个约束条件:\sum a_i\cdot label^{(i)}=0

数据格式如下:

3.542485    1.977398    -1
3.018896    2.556416    -1
7.551510    -1.580030    1
2.114999    -0.004466    -1
8.127113    1.274372    1

猜你喜欢

转载自blog.csdn.net/gritsissi/article/details/86768000