入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。
目录
一、SVM定义与解决目标
SVM是一个二类分类器。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化成一个凸二次规划问题的求解。即找到一个超平面,使两类数据离超平面越远越好,这样就可以让模型对新的数据分类更准确,即分类器更加稳定。
🎈支持向量:离分隔超平面最近的一些点
🎈间隔最大化:寻找最大化支持向量到分隔超平面的距离,以此为目标来求出分隔超平面
🎈数据分类的类别
(1)线性可分
(2)线性不可分
二、SVM算法原理
1、线性可分
分为2种:无松弛变量和带松弛变量
以2个特征为例:
如下图所示:如何分类黑点点和红点点,我们直观来看粉色那条线作为分界最好(因为该超平面对训练样本局部扰动的容忍性最好,即稳定性更高)
🌳原始待分类的数据:(x11,x12,y1),……,(xm1,xm2,ym)
x1,x2就是不同维的特征
y的取值为1或-1(因为2分类)
🌳目标超平面: —— 求最优w和b
(这里其实展开就是;
w是法向量,决定了超平面的方向;
b是位移项,决定了超平面与原点间的距离)
🌳那么空间中任意一点(x1,x2)到目标超平面的距离则为:
🌳又有定义:(其中和分别是第i个样本和第i个样本值所对应的目标值)
为函数距离;
所以我们把函数距离和点到面的距离进行一个综合,就变成了:
为数据集与分隔超平面的几何距离;
(1)这里用几何距离而不用函数距离的原因:
当w,b成倍增加时,函数距离也会相应的成倍的增加,但几何函数则不会
(2)我们刚刚不是说y的取值是1或-1嘛,这就保证了如果样本分类正确,则这个值是一个正数;如果样本分类错误,这个值是一个负数。这很好理解,分类对了就是同一边,就是正数嘛,即公式如下:
🌳但如果只以来划分,那么它的容错性可能不是很好,所以SVM这里引入了这个:
如图所示:(图里的转置符号我就懒得写上去了嘻嘻)
🌳间隔
其中,支持向量使上式的等号成立。两个异类支持向量到超平面的距离之和,也称为间隔:
(其实就是那两条橙色的线的距离)
🌳最大间隔划分超平面
所以我们要找到对应的w和b让最大,即以下公式:
条件由以下所得:
左右乘上
(1)无松弛变量
🌳由上式进行变式
为了最大化间隔,仅需最大化 ,这等价于最小化
这就是SVM的基本型
🌳我们把约束条件融合到优化目标函数中,建立拉格朗日公式
令 L(w,b,α)对 w和b的偏导为零,得到:
代入L得
解出后代入得:
(这里的x和y都是支持向量)
(2)带松弛变量和惩罚因子C
当C趋近于无穷大时,基本等价于无松弛变量的时候,当C取有限值的时允许一些样本不满足约束。
其余与上述一样
2、线性不可分
如果训练样本线性不可分,那么只要样本的属性是有限个,就可以将其映射到高维特征空间,使这些样本线性可分。
Note:升维后不一定线性可分,不过一般情况下升维后会更接近线性可分
凡是遇到线性不可分的情况,一律映射到高维度空间,会出现维度爆炸的情况,那么计算难度会很大的。此时我们可以使用核函数来简化计算,核函数虽然也是将特征进行从低维到高维的转化 但是是在低维上进行计算 而实际的效果表现在高维上 解决了维度爆炸的问题
(1)核函数定义和应用背景
只要一个对称函数所对应的核矩阵半正定,它就能作为核函数使用。
但是在不知道特征映射的形式时,我们并不知道什么样的核函数才是合适的。因此,核函数的选择成为SVM的最大变数。
构建核函数首先要确定输入空间到特征空间的映射,想要获取输入空间到映射空间的映射,我们需要明确输入空间内数据的分布情况,但大多数情况下,我们并不知道自己所处理的数据的具体分布,故一般很难构造出完全符合输入空间的核函数,因此我们用几种常用的核函数来代替自己构造核函数
(2)线性核函数 LINEAR
(内积)
LINEAR主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少,速度快。对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。
(3)高斯径向基核函数 RBF
它是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间,它是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数
(4)多项式核函数 POLY
它也可以实现将低维的输入空间映射到高维的特征空间。但多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算
(5)神经元的非线性作用核函数 Sigmoid
关于Sigmoid函数的介绍可以看往期文章中
基于分层softmax的CBoW模型详解_tt丫的博客-CSDN博客_分层softmax中有关逻辑回归Sigmoid函数的讲解
这样SVM实现的就是一种多层神经网络
(6)核函数选择技巧
如果我们对数据有个初步的分布了解等等,就根据这些特点去选择核函数
如果我们不清楚的话,可以使用交叉验证的方法来试用不同的核函数,误差最小的就是效果最好的核函数;或者也可以将多个核函数结合起来,形成混合核函数。
如果特征的数量大到和样本数量差不多,则选用线性核SVM;
如果特征的数量小,样本的数量正常,则选用高斯核函数SVM;
如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。
三、SVM代码实现
我们可以调用sklearn库中的SVM
比如说
model=sklearn.svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')
参数说明:
(1)C:C-SVC的惩罚参数C默认是1.0。C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,这样对训练集测试时准确率很高,但相对的,模型的泛化能力就会变弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
(2)kernel :核函数,默认是rbf,可以是
0 —— 'linear';1 —— 'poly';2 —— 'rbf';3 —— 'sigmoid'
(3)degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略
(4)gamma :'rbf','poly'和'sigmoid'的核系数。当前默认值为'auto',它使用1 / n_features,如果gamma='scale'传递,则使用1 /(n_features * X.std())作为gamma的值。
(5)coef0 :核函数的常数项。对于'poly'和 'sigmoid'有用
(6) tol :默认为1e-3,停止训练的误差值大小
主要调节的参数有:C、kernel、degree、gamma、coef0
欢迎大家在评论区批评指正,谢谢~