SVM python3的实现

来源:互联网 发布:微博营销数据分析 编辑:程序博客网 时间:2024/06/07 01:39

  • 线性可分SVM硬间隔最大化
    • 1 最大间隔法
    • 2 算法72
  • 线性支持向量机
  • 非线性支持向量机
  • 序列最小最优化算法SMO

SVM从简单到复杂分为三类模型:线性可分SVM、线性SVM、非线性SVM。各模型用到的关键知识点如下:

  • 线性可分SVM:硬间隔最大化
  • 线性SVM:软间隔最大化
  • 非线性SVM:软间隔最大化和核技巧

    本文参照李航博士的《统计学习方法》。

1. 线性可分SVM:硬间隔最大化

1.1 最大间隔法

P100 算法7.1 线性可分SVM学习算法——最大间隔法
(1)构造并求解约束最优化问题:

minw,b 12||w||2
s.t. yi(wxi+b)10

(2)求最优解w,b。从而得到分类决策函数:f(x)=sign(wx+b)

为了求解最优解w,b,应用拉格朗日对偶性,通过求解对偶问题得到最优解,这就是线性可分支持向量机的对偶算法。拉格朗日对偶性引进了α,推导可看书103-106页,这里直接写结果:

1.2 算法7.2

算法7.2 线性可分支持向量机学习算法
(1)构造并求解约束最优化问题:

minα 12i=1Ni=1Nαiαjyiyj(xixj)i=1Nαi
s.t. i=1Nαiyi=0, αi0, i=1,2,...,N
求最优解α=(α1,α2,...,αN)
(2)然后计算wb

2 线性支持向量机

引进松弛变量ξ0,使函数间隔加上松弛变量大于等于1,约束条件变为yi(wxi+b)1ξi,再加一个惩罚参数C>0,则目标函数变为:

minw,b 12||w||2+Ci=1Nξi
转化为对偶问题为:
minα 12i=1Ni=1Nαiαjyiyj(xixj)i=1Nαi
s.t. i=1Nαiyi=0, 0αiC, i=1,2,...,N

3 非线性支持向量机

(1)构造并求解约束最优化问题:

minα 12i=1Ni=1NαiαjyiyjK(xixj)i=1Nαi
s.t. i=1Nαiyi=0, 0αiC, i=1,2,...,N

(2)求
b=yji=1NαiyiK(xixj)

(3)构造决策函数:
f(x)=sign(i=1NαiyiK(xxi)+b)

4 序列最小最优化算法(SMO)

从以上问题看到,支持向量机的学习问题可以形式化为求解凸二次规划问题。在python中,求解二次规划可用cvxopt包,可以看下这里的简单介绍,但是只说了使用方法,好像没介绍原理。还有是一份使用cvxopt的svm代码。

以上是背景。本文使用python,除了基本的numpy和matplotlib之外不用其它包。使用SMO算法求解二次规划问题。
SMO算法包括:求解两个变量(设为α1α2)二次规划的解析方法和选择变量的启发式算法。算法流程如下:
(1)初始化参数。
(2)选择第1个变量α1。怎么选择呢?首先观察一下KKT条件:

αi=0yig(xi)1
0<αi<Cyig(xi)=1
αi=Cyig(xi)1
g(xi)=j=1NαjyjK(xi,xj)+b
从上面三个条件可以得出,当0<αi<C,样本点(xi,yi)在间隔边界上。
因此,首先遍历在上的支持向量点,选择违反KKT条件最严重的样本点(xi,yi),将其对应的变量αi作为第1个变量。如果这些样本点都满足KKT条件,那么遍历整个训练集,看其它的训练点是否满足KKT条件。
(3)选择α1之后,要寻找第二个变量α2,使|E1E2|最大,其中Ei=g(xi)yi,表示预测值和真实值的误差。为了节省计算时间,将所有的Ei值保存在一个列表里面,Ei的初始值为0,并用0和1标记是否更新过。

//最后贴个根据李航的《统计学习方法》写的python3 程序吧。

原创粉丝点击