支持向量机(SVM)理解以及在sklearn库中的简单应用

原创 2017年08月12日 12:12:43

1. 什么是支持向量机

  • 英文Support Vector Machines,简写SVM . 主要是基于支持向量来命名的,什么是支持向量后面会讲到…….最简单的SVM是用来二分类的,在深度学习崛起之前被誉为最好的现成分类器,”现成”指的是数据处理好,SVM可以直接拿来使用 …

2. 名词解释

2.1线性(不)可分 , 超平面

线性可分
上图 线性可分(绿色荧光笔直线),即一条直线完美分类,虽然有不同的分割法,这条分割线就叫做”分割超平面”,二维中直线就是一个超平面,扩展到n维中n-1维也就是超平面

线性不可分 左面这张图很明显,所谓线性不可分,则是一条直线不能完美分类

高维可分 左面这张图也是线性不可分 但是 有一个圆形区域很好的进行了分类
这时候就可以映射到高维,见下例

面 到 体 :
映射高维
线 到 面 :
1-2维 这个例子就比较好理解了,主要是怎么映射? 见下内容….

2.2 支持向量

支持向量

支持向量在SVM中很重要,名字就看得出来, 在上例中红线为分割超平面,红色的*点就是支持向量点,即离分割超平面最近的点。

3. SVM理解

在二分类问题中,SVM需要的就是寻得一个分割超平面,使margin最大化,见下图,margin就是切割超平面离最近点的距离margin margin
最近的点就是支持向量点,这里的超平面可以定义为 w^X+b=0
假设2维特征向量X=(x1,x2) , 把b想象虚拟的w0 ,
那么超平面方程就变成了 : w0+w1x1+w2x2=0
右上方点满足 : w0+w1x1+w2x2>0
同理,左下点满足 : w0+w1x1+w2x2<0
经过对weight参数的调整,使得
H1:w0+w1x1+w2x2>=1 for y = +1
H2:w0+w1x1+w2x2<=1 for y = - 1 (用y的+1代表一类,-1代表另一类)
综上两式
yi(w0+w1x1+w2x2)>=1,i

那么如果线行不可分呢,那就需要映射到高维,例如X=(x1,x2,x3) 那么映射到6维Z函数就可以是 θ1(x)=x1,θ2(x)=x2,θ3(x)=x3θ4(x)=x21,θ5(x)=x1x2,θ6(x)=x1x3,取而代之的方程变为Y=w1z1+w2z2+...+w6z6 那么怎么映射呢,(回答:用到的是内积)内积很耗时,所以使用核函数来计算这个内积,使得高维化时间变短,主要的核函数有

  • linear : 线性核函数(linear kernel)
  • poly : 多项式核函数(ploynomial kernel)
  • rbf : 径向机核函数(radical basis function)
  • sigmoid : 神经元的非线性作用函数核函数(Sigmoid tanh)

具体介绍还是看看文档吧…..

然后根据核函数就可以进行分类或者回归了…..

4. SVM优缺点

优点
- 支持向量决定时间复杂,而不是取决于数据集的大小
- 结果易于理解
缺点
- 对于参数以及核函数有依赖,原始算法不加修改只用于二分类
- 算法实现比较困难 (依赖sklearn库的话就算了,打脸)

5. sklearn库简单应用实例

# coding:utf-8

from sklearn import svm
from numpy import *
import pylab as pl

# 加载数据集
def loadData(fileName):
    dataMat = []
    labelMat = []
    with open(fileName) as txtFile:
        for line in txtFile.readlines():
            dataMat.append(map(float, line.split())[0:-1])
            labelMat.append(map(float, line.split())[-1])
    return dataMat, labelMat

#
if __name__ == '__main__':
    x, y = loadData("train.txt")
    X, Y = loadData("test.txt")

    #'使用线性方法分类'
    clf = svm.SVR(kernel='linear')  
    clf.fit(x, y)
    res = clf.predict(X)
    print "kernel is linear", corrcoef(Y, res, rowvar=0)[0, 1]

    #'使用径向机方法分类'
    clf = svm.SVR(kernel='rbf')   
    clf.fit(x, y)
    res = clf.predict(X)
    print "kernel is rbf", corrcoef(Y, res, rowvar=0)[0, 1]

    #'使用线性最小二乘法进行分类'
    x = mat(x)
    X = mat(X)
    y = mat(y).T
    Y = mat(Y).T
    temp = x.T * x
    ws = temp.I * (x.T * y)
    yPre = X * ws
    print "linear", corrcoef(yPre, Y, rowvar=0)[0, 1]

    ''' SVR 支持向量回归 '''
    # w^T * x + bias
    # weight is .coef_
    # bias   is .intercept_

    random.seed(0)
    x = r_[random.randn(20, 2) - [2, 2], random.randn(20, 2) + [2, 2]]
    y = [0] * 20 + [1] * 20
    clf = svm.SVC(kernel='linear')
    clf.fit(x, y)
    w = clf.coef_[0]
    # print "coef",clf.coef_
    a = -w[0] / w[1]
    xx = arange(-4, 4)
    yy = a * xx - (clf.intercept_[0]) / w[1]  # intercept_ bias
    # print "bias",clf.intercept_
    b = clf.support_vectors_[0]
    yy1 = a * xx + (b[1] - a * b[0])
    b = clf.support_vectors_[-1]
    yy2 = a * xx + (b[1] - a * b[0])
    pl.plot(xx, yy, 'k-', color='red')
    pl.plot(xx, yy1, 'k--', color='green')
    pl.plot(xx, yy2, 'k--', color='green')
    pl.plot(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], '*', color='red')
    # print clf.support_vectors_
    pl.scatter(x[:, 0], x[:, 1], marker='.', s=60)
    pl.show()

6. 图像结果 以及 分析

# kernel is linear 0.989824485227
# kernel is rbf 0.990336373871
# linear 0.989824485227
'对比发现,简单调用中rbf函数分类效果最好,内核函数linear就是利用了最小二乘法'

结果
红色为支持向量,红线为切割超平面,绿色虚线为边际超平面,用来’阻挡’两类的超平面

附 数据集

点击这里

版权声明:有错误麻烦赐教,感激不尽~~~(转载留言哦~) 举报

相关文章推荐

支持向量机-数据集

# 训练集 ''' 1.000000 0.067732 3.176513 1.000000 0.427810 3.816464 1.000000 0.995731 4.550095 1.000000 ...

使用sklearn进行集成学习——实践

目录 1 Random Forest和Gradient Tree Boosting参数详解 2 如何调参?   2.1 调参的目标:偏差和方差的协调   2.2 参数对整体模型性能的影响  ...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

3. K-means方法及其应用

1. K-means聚类算法k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。其处理过程如下: 随机选择k个点作为初始的聚类中心。 对于剩下的点,根据其与...

支持向量机(SVM)简单小结

支持向量机,就是常说的SVM,为学习复杂的非线性方程提供一种更为清晰,更加强大的方式。模型优化我们从逻辑回归对SVM的cost function进行推导演绎。回顾逻辑回归我们可以知道,当z>>0的时候...

简单理解支持向量机SVM的方法

一.简介         SVM主要针对小样本数据进行学习、分类和预测(有时也叫回归)的一种方法,能解决神经网络不能解决的过学习问题,而且有很好的泛化能力。SVM是一种有监督的学习模型,在处理二分类问...

SVM支持向量机原理(一) 线性支持向量机

此篇文章并非完全原创,参考了下篇博客,如果大家觉得稳重的1、2、3部分不好理解,可以看下图中我的手写版。 http://www.cnblogs.com/pinard/p/6097604.html ...

学习笔记——支持向量机svm(1)最简单的支持向量机

引言支持向量机作为一个有着完整理论证明并且效果很棒的算法始终活跃在机器学习的舞台上,而博主也很早就知道支持向量机了,但是始终都只是调用一下别人写的算法,没有深入的去理解支持向量机的原理,正好林轩田教授...

学习SVM(四) 理解SVM中的支持向量(Support Vector)

我们在开始接触SVM时肯定听到过类似这样的话,决定决策边界的数据叫做支持向量,它决定了margin到底是多少,而max margin更远的点,其实有没有无所谓。 然后一般会配一张图说明一下哪些是支持...

支持向量机SVM的简介

支持向量机SVM是从线性可分情况下的最优分类面提出的。所谓最优分类,就是要求分类线不但能够将两类无错误的分开,而且两类之间的分类间隔最大,前者是保证经验风险最小(为0),而通过后面的讨论我们看到,使分...

SVM支持向量机

SVM是一种有监督的学习方法,即已知训练点的类别,求训练点与类别之间的对应关系。 从理论基础分析到数学推导,详细介绍SVM算法的算法由来和推导过程。
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)