初入菜鸟,希望能通过做笔记的方式记录下自己学到的东西,也希望能对同样入门的人有所帮助。希望大佬们帮忙指正错误~侵权立即删除。
内容
一、SVM定义与解决目标
二、SVM算法原理
1、线性可分
(1)无松弛变量
(2)带松弛变量和惩罚因子C
2、线性不可分
(1)核函数定义和应用背景
(2)线性核函数 LINEAR
(3)高斯径向基核函数 RBF
(4)多项式核函数 POLY
(5)神经元的非线性作用核函数 Sigmoid
(6)核函数选择技巧
三、SVM代码实现
一、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
其余同上
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
欢迎大家在评论区批评指正,谢谢~
文章出处登录后可见!