标签:
转载,http://blog.csdn.net/gamer_gyt
本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正
转载请注明出处,谢谢
======================================================================
先介绍一些简单的基本概念
分隔超平面:将数据集分割开来的直线叫做分隔超平面。
超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。
间隔:
一个点到分割面的距离,称为点相对于分割面的距离。
数据集中所有的点到分割面的最小间隔的2倍,称为分类器或数据集的间隔。
最大间隔:SVM分类器是要找最大的数据集间隔。
支持向量:坐落在数据边际的两边超平面上的点被称为支持向量
对于上图直观的理解是红线的分类效果最好,为什么?
由此便引出了超平面的定义,SVM的目标就是寻找区分两类的超平面(hyper plane),使边际(margin)最大化。
那么如何选择超平面?超平面到一侧最近点的距离等于另一侧最近点的距离,两个超平面平行,如下图。
上面显示的两个图都是线性可区分的,就是说很容易找到一个超平面将数据分割成两类
上图中的两个图形都是线性不可区分的,这种情况下,我们就需要用到核函数,将数据映射到高维空间中,寻找可区分数据的超平面
对于这幅图来说, 就是图中黄色那个点,它是方形的,因而它是负类的一个样本,这单独的一个样本,使得原本线性可分的问题变成了线性不可分的。这样类似的问题(仅有少数点线性不可分)叫做“近似线性可分”的问题。对于这类问题的处理就引入了一个松弛变量,当然随之而来的便是惩罚因子了,具体他们是什么请参考:点击阅读 , 这里不做解释
超平面的公式可以定义为 : W * X + b = 0 W表示权重向量 W= {w1,w2,w3,w4.....,wn},n为特征值的个数 , X为训练实例, b表示偏移量
在这里假设二维特征向量X=(x1,x2)
做另外一个假设就是把b看作是另外一个weight,那么超平面就可以更新为: w0 + w1 * x1 +w2 * x2 = 0
所有超平面右上方的点满足: w0 + w1 * x1 +w2 * x2 > 0
所有超平面左下方的点满足: w0 + w1 * x1 +w2 * x2 < 0
调整weight,使超平面定义边际的两边:
H1:H1:w0 + w1 * x1 +w2 * x2 > 1 for yi=+1
H2:w0 + w1 * x1 +w2 * x2 =< -1 for yi=-1
综合上边两个公式得到:
(1): yi ( w0 + w1 * x1 +w2 * x2 ) >= 1 ,对于所有的i来说
所有坐落在数据边际的两边超平面上的点被称为支持向量
分界的超平面H1和H2任意一点的距离为 1/||W|| (推导过程这里略过,推导参考博客) , ||W||表示向量的范数
W= sqrt(W1^2 + W2^2 + ... + Wn^2)
所以两边最大距离为 2/||W||
利用一些数学公式的推导,以上公式(1)可以变为有限制的凸优化问题,利用KKT条件和拉格朗日公式,可以推出MMH(最大超平面)表示为以下决策边界:
yi是支持向量点Xi的类别标记
X^T是要测试的实例
ai和b0都是单一数值型参数
l是支持向量点的个数
下面看一张示例图片:
特性:训练好的模型算法复杂度是由支持向量的个数决定的,而不是 数据的纬度决定的,所以SVM不太容易产生OverWriting
SVM训练出的模型完全依赖于支持向量,即使所有训练集里所有非支持向量的点都被去除,重复训练过程,结果仍会得到一个完全一模一样的模型
一个SVM如果训练得出的支持向量个数比较小,SVM训练出的模型也容易被泛化
针对这种在空间中对应的向量不能被一个超平面划分开,用以下两个步骤来解决
1:利用一个非线性的映射把原数据集中的向量点转化到一个更高维的空间中
2:在这个高纬度的空间中找一个线性超平面来根据线性可分的情况处理
如下图示:
那么如何利用非线性映射把 转化到高维空间中
下面看一个小例子:
思考问题:如何选择合理的非线性转化把数据转到高维空间中?如何解决计算内积时算法复杂度高的问题?
答案是使用核函数
更多关于核函数请参考:点击阅读
至此SVM已经被我描述的差不多,其中的两部分求超平面的具体数学推导和核函数的具体使用方法,我并没有写,第一是因为,对于非数学专业的人来讲确实麻烦了,其次是自己太菜,但是网上已经有很多写的很好的博客,大家可以参考,下面我们就来看看scikit-learn上SVM的具体使用吧
========================================================================================
d.其他多类分类方法。除了以上几种方法外,还有有向无环图SVM(Directed Acyclic Graph SVMs,简称DAG-SVMs)和对类别进行二进制编码的纠错编码SVMs。
=====================================================================================
svc使用代码示例(我演示的是最简单的,官网上还有很多看起来很漂亮的分类示例,感兴趣的可以自己参考下):
NuSVC(Nu-Support Vector Classification.):核支持向量分类,和SVC类似,也是基于libsvm实现的,但不同的是通过一个参数空值支持向量的个数
示例代码:
更多NuSVC的参考:点击阅读
LinearSVC(Linear Support Vector Classification):线性支持向量分类,类似于SVC,但是其使用的核函数是”linear“上边介绍的两种是按照brf(径向基函数计算的,其实现也不是基于LIBSVM,所以它具有更大的灵活性在选择处罚和损失函数时,而且可以适应更大的数据集,他支持密集和稀疏的输入是通过一对一的方式解决的
代码使用实例如下:
更多关于LinearSVC请参考:点击阅读
‘‘‘lin_clf = LinearSVC()lin_clf.fit(X, Y) dec = lin_clf.decision_function([[1]])print "LinearSVC:",dec.shape[1]
结果显示:
红色字体暂时忽略
对于非平衡级分类超平面,使用不平衡SVC找出最优分类超平面,基本的思想是,我们先找到一个普通的分类超平面,自动进行校正,求出最优的分类超平面
这里可以使用 SVC(kernel="linear")
针对下面的svc可以使用 clf=SGDClassifier(n_iter=100,alpha=0.01) 代替
标签:
原文地址:http://www.cnblogs.com/harvey888/p/5852687.html