SVM模型详解

初入菜鸟,希望能通过做笔记的方式记录下自己学到的东西,也希望能对同样入门的人有所帮助。希望大佬们帮忙指正错误~侵权立即删除。

内容

一、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个特征为例:

如下图:黑点和红点如何分类,我们直观的看到粉红色的线是最好的边界(因为超平面对训练样本的局部扰动的容忍度最好,也就是稳定性更高)

SVM模型详解

🌳原始待分类的数据:(x11,x12,y1),……,(xm1,xm2,ym)

x1,x2就是不同维的特征

y的取值为1或-1(因为2分类)

🌳目标超平面:w^{T}X+b = 0—— 求最优w和b

(其实这里的展开是w_{1}x_{1} + w_{2}x_{2}+b=0

w是法向量,决定了超平面的方向;

b是位移项,决定了超平面与原点间的距离)

🌳那么空间中任意一点(x1,x2)到目标超平面的距离则为:

r=\frac{\left|\omega^{T} x+b\right|}{|| \omega||}

🌳又有定义:(其中x^{(i)}y^{(i)}分别是第i个样本和第i个样本值所对应的目标值)

y_{i}(w^{T}x_{i} + b),i=1,.....,m为函数距离;

所以我们把函数距离和点到面的距离结合起来,就变成了:

\min\frac{y^{(i)}\left(w^{T} x^{(i)}+b\right)}{\|w\|}, i=1, \ldots, m是数据集与分离超平面的几何距离;

(1)这里用几何距离而不用函数距离的原因:

当w,b成倍增加时,函数距离也会相应的成倍的增加,但几何函数则不会

(2)我们刚刚不是说y的取值是1或-1嘛,这就保证了如果样本分类正确,则这个值是一个正数;如果样本分类错误,这个值是一个负数。这很好理解,分类对了就是同一边,就是正数嘛,即公式如下:

\left\{\begin{array}{ll} \omega^{T} x_{i}+b>0, & y_{i}=+1 \\ \omega^{T} x_{i}+b<0, & y_{i}=-1 \end{array}\right.

🌳但如果只以w^{T}X+b = 0来划分,那么它的容错性可能不是很好,所以SVM这里引入了这个:

\left\{\begin{array}{ll} \omega^{T} x_{i}+b>=1, & y_{i}=+1 \\ \omega^{T} x_{i}+b<=-1, & y_{i}=-1 \end{array}\right.

如图:(图里的换位符我懒得写了嘿嘿)

SVM模型详解

🌳 间隔

其中,支持向量使上式的等号为真。两个异构支持向量到超平面的距离之和,也称为区间:

\gamma=\frac{2}{\|\omega\|}(其实就是两条橙色线之间的距离)

🌳最大区间划分超平面

所以我们要找到对应的w和b让\gamma最大,即以下公式:

\max _{\omega, b} \frac{2}{\|\omega\|}, s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, m

条件来源于:

\left\{\begin{array}{ll} \omega^{T} x_{i}+b>=1, & y_{i}=+1 \\ \omega^{T} x_{i}+b<=-1, & y_{i}=-1 \end{array}\right.左右乘以y_{i}

(1)无松弛变量

🌳 上式的变体

要最大化区间,只需要最大化\frac{1}{\|\omega\|},相当于最小化\|\omega\|^2

\min _{\omega, b} \frac{\|\omega\|^2}{2}, s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, m

这就是SVM的基本型

🌳 我们将约束整合到优化目标函数中,建立拉格朗日公式

L(w, b, \alpha)=\frac{1}{2}\|w\|^{2}+\sum_{i=1}^{m} \alpha_{i}\left(1-y_{i}\left(w^{T} x_{i}+b\right)\right)

令 L(w,b,α)对 w和b的偏导为零,得到:

w =\sum_{i=1}^{m} \alpha_{i} y_{i} x_{i}\sum_{i=1}^{m} \alpha_{i} y_{i} = 0

代入L得

\max _{\alpha} \sum_{i=1}^{m} \alpha_{i}-\frac{1}{2} \sum_{i=1}^{m} \sum_{j=1}^{m} \alpha_{i} \alpha_{j} y_{i} y_{j} x_{i}^{T} x_{j} --s.t. \sum_{i=1}^{m} \alpha_{i} y_{i}=0, \alpha_{i} \geq 0, i=1,2, \ldots, m

求解\alpha后,子孙得到:

SVM模型详解(这里的x和y都是支持向量)

(2)带松弛变量\xi_{i}和惩罚因子C

\min \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{n} \xi_{i} -- s . t . y_{i}\left(\omega^{T} x_{i}+b\right) \geq 1-\xi_{i} , i=1,2, \ldots, m,\xi_{i}\geq0

其余同上

2、线性不可分

如果训练样本是线性不可分的,只要样本的属性是有限的,就可以将它们映射到一个高维特征空间,使这些样本线性可分。

Note:升维后不一定线性可分,不过一般情况下升维后会更接近线性可分

每当遇到线性不可分的情况,总是映射到高维空间,会出现维数爆炸,所以计算难度会很大。这时,我们可以使用核函数来简化计算。核函数虽然也将特征从低维转换为高维,但在低维计算,在高维显示实际效果,解决了维数爆炸的问题。

(1)核函数定义和应用背景

只要一个对称函数对应的核矩阵是半正定的,就可以作为核函数。

但是在不知道特征映射的形式时,我们并不知道什么样的核函数才是合适的。因此,核函数的选择成为SVM的最大变数。

要构建核函数,我们必须首先确定从输入空间到特征空间的映射。要获得从输入空间到映射空间的映射,我们需要弄清楚输入空间中数据的分布,但是在大多数情况下,我们并不知道我们在处理什么,因为数据的具体分布,通常很难构造一个完全符合输入空间的核函数。因此,我们使用几个常用的核函数来自己构造核函数。

(2)线性核函数 LINEAR

k(x,x_{i}) = x * x_{i}(内积)

LINEAR主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少,速度快。对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。

(3)高斯径向基核函数 RBF

k(x, x i)=\exp \left(-\frac{\|x-x i\|^{2}}{\delta^{2}}\right)

它是一个具有强局部性的核函数,可以将样本映射到更高维空间。它是使用最广泛的一种。无论大样本还是小样本,它都有更好的性能。多项式核函数的参数较少,所以在大多数情况下,当你不知道用什么核函数时,首选高斯核函数。

(4)多项式核函数 POLY

k(x,x_{i}) = ((x * x_{i})+1)^{d}

它还可以将低维输入空间映射到高维特征空间。然而,多项式核函数有很多参数。当多项式的阶数比较高时,核矩阵的元素值会趋向于无穷大或无穷小,计算复杂度会太大而无法计算。

(5)神经元的非线性作用核函数 Sigmoid

关于Sigmoid函数的介绍可以看往期文章中

基于分层softmax的CBoW模型详解_tt丫的博客-CSDN博客_分层softmax中有关逻辑回归Sigmoid函数的讲解

k\left(x, x_{i}\right)=\tanh \left(\eta<x, x_{i}>+\theta\right)

这样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

欢迎大家在评论区批评指正,谢谢~

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年4月2日 上午11:54
下一篇 2022年4月2日 下午12:13

相关推荐