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

从核函数到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,5,13,分别为(1,4)、(2,2)、(6,4)

 

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

 

 

 

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

 

分类: 机器学习
0
0
« 上一篇: 基于scikit-learn包实现机器学习之KNN(K近邻)-完整示例
» 下一篇: sklearn-SVC实现与类参数
sklearn中,SVM模型提供了多种核函数供选择。常用的核函数有以下几种: 1. 线性核函数(linear):线性核函数是最简单的一种核函数,它在原始特征空间中实现线性分类器,适用于特征空间是线性可分的情况。 2. 多项式核函数(poly):多项式核函数通过将样本映射到高维空间来实现非线性分类。它可以定义为在原始特征空间中进行多项式函数运算后的内积。 3. RBF核函数(rbf):径向基函数(RBF)核函数是一种常用的非线性核函数。它通过将样本映射到无穷维的特征空间来实现非线性分类。RBF核函数在实际应用中被广泛使用,因为它具有很好的表示能力。 4. Sigmoid核函数(sigmoid):Sigmoid核函数将样本映射到高维空间,并通过Sigmoid函数来实现非线性分类。它主要用于二分类问题。 在使用sklearn中的SVM模型时,可以通过设置参数`kernel`来指定所需的核函数。默认情况下,SVM模型的核函数为RBF核函数。例如,可以使用以下代码创建一个使用多项式核函数SVM模型: ```python from sklearn.svm import SVC # 创建SVM模型,使用多项式核函数 svm_model = SVC(kernel='poly') ``` 需要根据具体的数据集和问题选择合适的核函数。在实际应用中,可以通过尝试不同的核函数并比较它们在训练集和测试集上的性能来选择最佳的核函数。在选择核函数时,需要考虑数据集的线性可分性、特征空间的维度以及模型的复杂度等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值