zoukankan      html  css  js  c++  java
  • 从核函数到SVM原理--sklearn-SVM实现

    SVM核函数及sklearn实现SVM

    SVM中,其中最重要的也是最核心的就是核函数的选取和参数选择,当然这个需要大量的经验来支撑。今天我们就是抛砖引玉形象的讲解一下什么是核函数,及在SVM中在哪用到。

    我们知道,SVM相对感知机而言,它可以解决线性不可分的问题,那么它是怎么解决的呢?它的解决思想很简单,就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分,但是在变维之后的空间中样本点是线性可分的,然后再变换后的高维空间中进行分类。

    了解SVM原理,并且有凸优化理论知识的话,都应该知道SVM其实主要是在用对偶理论求解一个二次凸优化问题,其中对偶问题如下:

     

     

    求的最终结果:

     

     其中表示任选的一个支持向量

    当然这是线性可分的情况,那么如果问题本身是线性不可分的情况呢,那就是先扩维后再计算,计算形式是一样的:

    其中表示原来的样本扩维后的坐标。

     从中可以看出,不管是不扩维的求解还是扩维的求解,在求解对偶问题的过程中都会用到各样本点的内积的结果,那么这时候问题来了,在很多情况下,扩维可能会吧原数据扩到很高维(甚至无穷维),这时候直接求内积是非常困难的,我们为了避免做这样的事就提出了核函数的概念。

     

    核函数:任意两个样本点在扩维后的空间的内积,如果等于这两个样本点在原来空间经过一个函数后的输出,那么这个函数就叫核函数。

     

    当然这是我自己的理解定义,意思就是这么个意思。也就是说:

    这个函数f就是核函数。我们接下来举一个例子:

    为简单起见,假设所有样本点都是二维点,其值分别为(x,y),可以验证任意两个扩维后的样本点在3维空间的内积等于原样本点在2维空间的函数输出:  

    有了这个核函数,以后的高维内积都可以转化为低维的函数运算了,这里也就是只需要计算低维的内积,然后再平方。明显问题得到解决且复杂度降低极大。总而言之,核函数它本质上隐含了从低维到高维的映射,从而避免直接计算高维的内积。

    当然上面所介绍的只是众多核函数中的一个示例,它其实是属于多项式核函数这一类核函数中的一个特例。其实核函数还有很多种,相同种类但是不同参数的核函数效果又有所不同,需要说明的是并不是说所有的核函数都能显示的写出隐含的从低维到高维的扩维细节。成为核函数有满足的条件Mercer’s condition。一般用得比较多比较成熟的核函数有如下几个。

    核函数英文为kernel function,因此一般这个函数符号一般用k不用 f

     

    ★线性核函数:

     

    ★多项式核函数:

     

    ★径像基核函数/高斯核函数:

     

    ★拉普拉斯核函数:

     

    ★sigmod核函数:

     

    大家有时间可以研究研究这些核函数分别应用在那些场景下。接下来给一个例子:

     

     有如图的这么一些点,红色圆点的是正类,蓝色圆点的是负类。五星是预测样本点,采用的核函数就是上面我们举例的核函数,细心的人会发现它就是

    的多项式核函数,基于该多项式核函数可以把左下角的预测样本划分为正样本,右上预测样本为负样本。

    # -*- coding:utf-8 -*-

    from sklearn.svm import SVC

    import matplotlib.pyplot as plt

    import numpy as np

    X=np.array([[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[3,1],[4,1],[5,1],

             [5,2],[6,1],[6,2],[6,3],[6,4],[3,3],[3,4],[3,5],[4,3],[4,4],[4,5]])

    Y=np.array([1]*14+[-1]*6)

    T=np.array([[0.5,0.5],[1.5,1.5],[3.5,3.5],[4,5.5]])

    #X为训练样本,Y为训练样本标签(1-1)T为测试样本

    svc=SVC(kernel='poly',degree=2,gamma=1,coef0=0)

    svc.fit(X,Y)

    pre=svc.predict(T)

    print pre     #输出预测结果

    print svc.n_support_   #输出正类和负类支持向量总个数

    print svc.support_    #输出正类和负类支持向量索引

    print svc.support_vectors_  #输出正类和负类支持向量

    结果输出:

    [ 1  1 -1 -1]

    [2 3]

    [14 17  3  5 13]

    [[ 3.  3.]

     [ 4.  3.]

     [ 1.  4.]

     [ 2.  2.]

     [ 6.  4.]]

    从结果总可以看出,4个预测点分类为前两个为1,后两个为-1.负类(蓝色)支持向量有2个,在样本集中索引为14,17,分别为(3,3)(4,3)

    正类(红色)支持向量有3个,在样本集中索引为3,513,分别为(1,4)(2,2)(6,4)

     可以想象出来,在3位空间的线性SVM,在原来的二维空间中是如图黑线所示的类似于抛物线,这就是为什么SVM可以分类线性不可分的问题。其实它在高维空间是可分的,见下图

     

     以上内容为原创内容,本人也正在学习阶段,如有不对,欢迎指正

     

  • 相关阅读:
    [atARC123F]Insert Addition
    3.1 概述
    2.5 信道的极限容量
    2.4 编码与调制
    2.3 传输方式
    tp6_004路由配置
    tp6_003多应用配置
    tp6_002规范和配置
    tp6_001安装和运行
    问题解决:tp6多应用无法获取controller 和 action怎么办
  • 原文地址:https://www.cnblogs.com/xiaotan-code/p/6695049.html
Copyright © 2011-2022 走看看