从核函数到SVM原理--sklearn-SVM实现

摘要:
SVM核函数和SVM的SKLEARN实现在SVM中,最重要也是最核心的是核函数和参数的选择,这使得原始样本空间中的样本点是线性不可分割的,但改变维度后的空间中的采样点是线性可分的,所以你应该知道SVM主要用于解决二次凸优化问题,它代表一个可选的支持向量。当然,这是一个线性可分的情况。在求解对偶问题的过程中,将使用每个样本点的内积。

SVM核函数及sklearn实现SVM

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

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

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

 

 从核函数到SVM原理--sklearn-SVM实现第1张

求的最终结果:

 从核函数到SVM原理--sklearn-SVM实现第2张

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

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

从核函数到SVM原理--sklearn-SVM实现第3张

其中从核函数到SVM原理--sklearn-SVM实现第4张表示原来的样本扩维后的坐标。

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

 

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

 

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

从核函数到SVM原理--sklearn-SVM实现第5张

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

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

从核函数到SVM原理--sklearn-SVM实现第7张

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

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

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

 

★线性核函数:

 从核函数到SVM原理--sklearn-SVM实现第8张

★多项式核函数:

 从核函数到SVM原理--sklearn-SVM实现第9张

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

 从核函数到SVM原理--sklearn-SVM实现第10张

★拉普拉斯核函数:

 从核函数到SVM原理--sklearn-SVM实现第11张

★sigmod核函数:

 从核函数到SVM原理--sklearn-SVM实现第12张

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

 从核函数到SVM原理--sklearn-SVM实现第13张

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

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

# -*- 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)

从核函数到SVM原理--sklearn-SVM实现第15张

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

 从核函数到SVM原理--sklearn-SVM实现第16张

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

 

免责声明:文章转载自《从核函数到SVM原理--sklearn-SVM实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点新晋“网红”Cat1 是什么下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转载)Linux下DIR,dirent,stat等结构体详解

摘自:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/ 最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅。 首先说说DIR这一结构体,以下为DIR结构体的定义: struct __dirstre...

AppInventor学习笔记(五)——瓢虫快跑应用学习

一、瓢虫引入 1:加入控件:        先引入方框中含有的控件,里面有两个画布,一个图像精灵,一个重力感应,一个时钟(设为10Ms)。顺手改名。设置图像精灵的移动speed为10,并且引入瓢虫的图像 2、加入逻辑      编程思路为,先加入一个一直调用的函数(时钟),即这个是程序中不断运行的代码。只要到10ms就调用一次。      所以我们应该...

iOS 强制退出程序APP代码

1、先po代码 // 退出程序 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:self.exitapplica...

VC中Spin控件的使用

微调按钮设置成set buddy inter选上 然后可以(1)通过 setbuddy+setrange函数    或(2)auto buddy自动选上,只要编辑框的tab order 比微调按钮小1就可以自动了 (另转)VC中Spin控件的使用 http://leichaofu.blog.163.com/blog/static/459481820098...

C/C++头文件一览

C/C++头文件一览 //////////////////////////////////////////////////////////////////////////C头文件(C89,C95)(C++98,C++03也包含) include <assert.h>    //诊断库include <ctype.h>     //...

7年,OpenStack从入门到放弃|送书

七年之痒这个词,大家经常说,不过起源,估计就不是谁都清楚。这是梦露的一部影片的名字,后来大家发现无论是企业,家庭,甚至政府,都在第七年时间段上面临各种麻烦。 OpenStack存在的问题,其实已经不是痒,就挠一下。基本上是已经无药可救。 Contents 1 逐步没落 2 都不挣钱 3 TC不作为 4 企业用户收益差 5 K8S 和 PaaS 6 技术不...