机器学习之SVM

引言

SVM 是机器学习中比较重要的一种 分类方法。 网上各种博客讲的也非常多 ,我转载几遍写的比较好的过来 ,并写下自己的心得 。而且本文不想从公式着手分析,简单来说 就是非常复杂 当你入门后在回来看公式也可以 。上公式了很多人 就放弃了。

什么是SVM

原文在这里

近来,了解了一下SVM(支持向量机 support vector machine)的原理。顺便把自己理解的内容整理一下。

一、什么是支持向量机

好比说,我们现在在一个平面上有许多的圈圈和叉叉,如图1.1所示。

在这里插入图片描述

图1.1

现在需要一条直线将圈圈和叉叉分开,可以想象,会有很多条可能的直线,但是会有一条最佳的分割线L,如图1.2所示。

在这里插入图片描述

图1.2

绿色的叉叉到L的最短距离为d1,红色圈圈到L的最短距离为d2,保证d1=d2,并且使d1+d2的值最大,那么这条直线就是最佳的分割线。具体的表示如图1.3所示

在这里插入图片描述

图1.3

图1.3中,蓝色的虚线分别为H1和H2,每一个圈圈和叉叉都可以看成一个向量,落在蓝色虚线上的叉叉和圈圈就称为“支持向量”,那么没有在边缘上的向量就是“非支持向量”。

另外,在SVM中,我们经常听到“超平面”的概念。什么是超平面呢?当图中的圈圈和叉叉是二维的时候,那么L就是一条直线;当图中的圈圈和叉叉是三维的时候,那么L就是一个平面;当图中圈圈和叉叉是三维以上的时候,那么L就是一个超平面。

图中的每个圈圈和叉叉都是一个样本,圈圈和叉叉的维数表示样本的特征数量。

使用 skearn求解 支持向量 所在的这条线

本来打算上公式 但是如果作为新手 或者刚入门 觉得没有必要 ,我们还是先学会怎么使用它就行。 这个公式推导 涉及太多的数学知识。 很多人看了 就放弃。有现成的库 直接使用就好,而且使用起来非常简单 。

1, 训练 求超平面
2,预测数据

from sklearn.svm import SVC
import numpy as np
X= np.array([[-1,-1],[-2,-1],[1,1],[2,1]])
y = np.array([1,1,2,2])
 '''
SVC参数解释
(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
(2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂;
(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features;
(5)coef0:核函数中的独立项,'RBF' and 'Poly'有效;
(6)probablity: 可能性估计是否使用(true or false);
(7)shrinking:是否进行启发式;
(8)tol(default = 1e - 3): svm结束标准的精度;
(9)cache_size: 制定训练所需要的内存(以MB为单位);
(10)class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应;
(11)verbose: 跟多线程有关,不大明白啥意思具体;
(12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited;
(13)decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多  or None 无, default=None
(14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。
 ps:7,8,9一般不考虑。
 '''
clf = SVC()
#求解 线 或者说超平面
tmp= clf.fit(X,y)
print (tmp )
#预测分类
print ( clf.predict([[-0.8,-1]]))

为啥要设置核参数

也就是 上文中的 第二条 kernel 。

原文查看这里 我将我的理解记下来:

比如我们的数据 都在 一维空间中 。像这样: a ,b 只是我们要区别的数据 其他数据 都在这个轴上。

在这里插入图片描述

那么我们求这个超平面 没法求出。

如果我们有一个方式将数据变成 一个二维的图片 。

在这里插入图片描述

假如: 一维数据 z = WX

变成 高维数据:
g(X) = W1 * X

z = W g(x) = W ( W1*X )

这样 g(X) 就可以 将 X 数据 对应到高维上去。 也称为 核函数 。

然而并不是 所有的 函数都可以 那么什么样的 函数 称为 合法的 核函数?

核函数 k(x,x ′ ) 是⼀个合法的核函数的充分必要条件是 Gram 矩阵(元素由 k(x n ,x m ) 给出)在所有的集合 {x n } 的选择下都是半正定的。注意,⼀个半正定的矩阵与元素全部⾮负的矩阵不同。

半定矩阵定义查看这里

类似于下面结构的 函数都是合法的。
在这里插入图片描述
比如
高斯函数,
在这里插入图片描述

平方展开:
在这里插入图片描述

在这里插入图片描述

通过上面的性质以及线性核 在这里插入图片描述的合法性,即可看到⾼斯核是⼀个合法的核。注意,对应于⾼斯核的特征向量有⽆穷的维数。那么你可以在此基础继续变化构造适合自己的核函数

注意:  x’ 这个很多新手看不懂 ,比如

总的数据 X是 m n 也就是m 行数据 n 个特征 x’ 我们可以抽取X其中的一行 n1 这样得出来 m*1 个数据出来

常用的核函数 是这几个。

kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";

径向基函数

原文查看这里
默认的是"RBF"; 详解这个 ,一般工程中这个效果都挺实用。 效果也非常好。
理解:就是通过训练集数据,我找到一个曲面,这个曲面可以完全覆盖这些训练点,那么找到这个曲面后就可以通过这个曲面取寻找其他的值了 。 由于所有的点到 曲面的中心点的距离都相等,由于距离是径向同性的,故函数被称为径向基函数

如图: 找到一个曲面 让点 全部映射到在 这个曲面上

在这里插入图片描述
考虑一个由N维输人空间到一维输出空间的映射。设N维空间有P个输人向量平,P=1,2,…,P,它们在输出空间相应的目标值为,P对输人一输出样本构成了训练样本集。插值的目的是寻找一个非线性映射函数F(X),使其满足下述插值条件:

步骤(1)
在这里插入图片描述在这里插入图片描述
式子中,函数F描述了一个插值曲面,所谓严格插值或精确插值,是一种完全内插,即该插值曲面必须通过所有训练数据点。

如果这个明白了 下面这个推导过程 就不用看了。

插值 求解曲面:

采用径向基函数技术解决插值问题的方法是,选择P个基函数个训练数据,各基函数的形式为:
步骤(2)
在这里插入图片描述在这里插入图片描述

式中,基函数 在这里插入图片描述为非线性函数,训练数据点 x^p是在这里插入图片描述中心。基函数以输人空间的点x与中心 x^p的距离作为函数的自变量。由于距离是径向同性的,故函数被称为径向基函数。基于径向基函数技术的差值函数定义为基函数的线性组合

步骤(3)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过上面大家可以看到为了使所有数据都在曲面还需要系数调节,此时求出系数向量就求出了整个的映射函数了

常见的几种径向基函数

(1)高斯径向基函数
在这里插入图片描述在这里插入图片描述
横轴就是到中心的距离用半径r表示,如上图,我们发现当距离等于0时,径向基函数等于1,距离越远衰减越快,其中高斯径向基的参数δ 在支持向量机中被称为到达率或者说函数跌落到零的速度。红色δ=1,蓝色δ=5,绿色δ=0.5,我们发现到达率越小其越窄。

(2) 反演S型函数

在这里插入图片描述

在这里插入图片描述

这个和径向基类似,只是极值为0.5.前面乘上系数就好了 ,红色δ=1,蓝色δ=5,绿色δ=0.5

(3)拟多二次函数

在这里插入图片描述

在这里插入图片描述

红色δ=1,蓝色δ=5,绿色δ=0.5,横轴为距离r。

(5)coef0:核函数中的独立项,‘RBF’ and 'Poly’有效; 这个就是调节这里的 r

近似线性可分

松弛就是我们对待问题的 容忍程度 。 特殊问题特殊对待。

描述如下:

现在我们已经把一个本来线性不可分的文本分类问题,通过映射到高维空间而变成了线性可分的。就像下图这样

在这里插入图片描述
圆形和方形的点各有成千上万个(毕竟,这就是我们训练集中文档的数量嘛,当然很大了)。现在想象我们有另一个训练集,只比原先这个训练集多了一篇文章,映射到高维空间以后(当然,也使用了相同的核函数),也就多了一个样本点,但是这个样本的位置是这样的:

在这里插入图片描述
就是图中黄色那个点,它是方形的,因而它是负类的一个样本,这单独的一个样本,使得原本线性可分的问题变成了线性不可分的。这样类似的问题(仅有少数点线性不可分)叫做“近似线性可分”的问题。

硬间隔分类法

以我们人类的常识来判断,说有一万个点都符合某种规律(因而线性可分),有一个点不符合,那这一个点是否就代表了分类规则中我们没有考虑到的方面呢(因而规则应该为它而做出修改)?

其实我们会觉得,更有可能的是,这个样本点压根就是错误,是噪声,是提供训练集的同学人工分类时一打瞌睡错放进去的。所以我们会简单的忽略这个样本点,仍然使用原来的分类器,其效果丝毫不受影响。

但这种对噪声的容错性是人的思维带来的,我们的程序可没有。由于我们原本的优化问题的表达式中,确实要考虑所有的样本点(不能忽略某一个,因为程序它怎么知道该忽略哪一个呢?),在此基础上寻找正负类之间的最大几何间隔,而几何间隔本身代表的是距离,是非负的,像上面这种有噪声的情况会使得整个问题无解。这种解法其实也叫做“硬间隔”分类法,因为他硬性的要求所有样本点都满足和分类平面间的距离必须大于某个值。

因此由上面的例子中也可以看出,硬间隔的分类法其结果容易受少数点的控制,这是很危险的(尽管有句话说真理总是掌握在少数人手中,但那不过是那一小撮人聊以自慰的词句罢了,咱还是得民主)。

松弛变量:

但解决方法也很明显,就是仿照人的思路,允许一些点到分类平面的距离不满足原先的要求。由于不同的训练集各点的间距尺度不太一样,因此用间隔(而不是几何间隔)来衡量有利于我们表达形式的简洁。我们原先对样本点的要求是:

在这里插入图片描述

意思是说离分类面最近的样本点函数间隔也要比1大。
如果要引入容错性,就给1这个硬性的阈值加一个松弛变量,即允许

在这里插入图片描述
因为松弛变量是非负的,因此最终的结果是要求间隔可以比1小。但是当某些点出现这种间隔比1小的情况时(这些点也叫离群点),意味着我们放弃了对这些点的精确分类,而这对我们的分类器来说是种损失。但是放弃这些点也带来了好处,那就是使分类面不必向这些点的方向移动,因而可以得到更大的几何间隔(在低维空间看来,分类边界也更平滑)。显然我们必须权衡这种损失和好处。好处很明显,我们得到的分类间隔越大,好处就越多

软间隔分类器与惩罚因子

回顾我们原始的硬间隔分类对应的优化问题:

在这里插入图片描述

||ω2||就是我们的目标函数(当然系数可有可无),希望它越小越好,因而损失就必然是一个能使之变大的量(能使它变小就不叫损失了,我们本来就希望目标函数值越小越好)。那如何来衡量损失,有两种常用的方式,有人喜欢用
在这里插入图片描述
其中l都是样本的数目。两种方法没有大的区别。如果选择了第一种,得到的方法的就叫做二阶软间隔分类器,第二种就叫做一阶软间隔分类器。把损失加入到目标函数里的时候,就需要一个惩罚因子(cost,也就是libSVM的诸多参数中的C),原来的优化问题就变成了下面这样:

在这里插入图片描述
这个式子有这么几点要注意:

1》 并非所有的样本点都有一个松弛变量与其对应。实际上只有“离群点”才有,或者也可以这么看,所有没离群的点松弛变量都等于0(对负类来说,离群点就是在前面图中,跑到H2右侧的那些负样本点,对正类来说,就是跑到H1左侧的那些正样本点)。
2》松弛变量的值实际上标示出了对应的点到底离群有多远,值越大,点就越远。

3》惩罚因子C决定了你有多重视离群点带来的损失,显然当所有离群点的松弛变量的和一定时,你定的C越大,对目标函数的损失也越大,此时就暗示着你非常不愿意放弃这些离群点,最极端的情况是你把C定为无限大,这样只要稍有一个点离群,目标函数的值马上变成无限大,马上让问题变成无解,这就退化成了硬间隔问题。
4》惩罚因子C不是一个变量,整个优化问题在解的时候,C是一个你必须事先指定的值,指定这个值以后,解一下,得到一个分类器,然后用测试数据看看结果怎么样,如果不够好,换一个C的值,再解一次优化问题,得到另一个分类器,再看看效果,如此就是一个参数寻优的过程,但这和优化问题本身决不是一回事,优化问题在解的过程中,C一直是定值,要记住

5》尽管加了松弛变量这么一说,但这个优化问题仍然是一个优化问题(汗,这不废话么),解它的过程比起原始的硬间隔问题来说,没有任何更加特殊的地方。

从大的方面说优化问题解的过程,就是先试着确定一下ω,也就是确定了前面图中的三条直线,这时看看间隔有多大,又有多少点离群,把目标函数的值算一算,再换一组三条直线(你可以看到,分类的直线位置如果移动了,有些原来离群的点会变得不再离群,而有的本来不离群的点会变成离群点),再把目标函数的值算一算,如此往复(迭代),直到最终找到目标函数最小时的ω。

读者一定可以马上自己总结出来,松弛变量也就是个解决线性不可分问题的方法罢了,但是回想一下,核函数的引入不也是为了解决线性不可分的问题么?为什么要为了一个问题使用两种方法呢?其实两者还有微妙的不同。

一般的过程应该是这样,还以文本分类为例。1. 在原始的低维空间中,样本相当的不可分,无论你怎么找分类平面,总会有大量的离群点,此时用核函数向高维空间映射一下,虽然结果仍然是不可分的,但比原始空间里的要更加接近线性可分的状态(就是达到了近似线性可分的状态),2. 此时再用松弛变量处理那些少数“冥顽不化”的离群点,就简单有效得多啦。

本节中的(式1)也确实是支持向量机最最常用的形式。至此一个比较完整的支持向量机框架就有了,简单说来,支持向量机就是使用了核函数的软间隔线性分类法。

还是看(式1),注意其中C的位置,也可以回想一下C所起的作用(表征你有多么重视离群点,C越大越重视,越不想丢掉它们)。这个式子是以前做SVM的人写的,大家也就这么用,但没有任何规定说必须对所有的松弛变量都使用同一个惩罚因子,我们完全可以给每一个离群点都使用不同的C,这时就意味着你对每个样本的重视程度都不一样,有些样本丢了也就丢了,错了也就错了,这些就给一个比较小的C;而有些样本很重要,决不能分类错误(比如中央下达的文件啥的,笑),就给一个很大的C。

啰嗦了这么多其实就是对 这个的解释。

(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;

参考文献

https://www.cnblogs.com/ghmgm/p/5615780.html
https://blog.csdn.net/weixin_42398658/article/details/83215916

http://www.blogjava.net/zhenandaci/category/31868.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值