支持向量机(support vector machine):简称 SVM。机,即机器,指的是这个模型是一个机器,它的作用是分类,所以可以理解为一个分类用的机器。通俗来讲,它是一种二类分类模型。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

SVM是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。

  • 当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分SVM;
  • 当训练样本近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性SVM;
  • 当训练样本线性不可分时,通过使用核技巧及软间隔最大化,学习非线性SVM;
  • 目前,数据挖掘类工作使用SVM比较多;直接做图像的SVM分类器已经过时,但是在其他领域没有过时;
  • 如果数据集过大,SVM算法运行会比较慢。

一、SVM算法导引

在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏。

魔鬼在桌子上似乎有规律放了两种颜色的球,说:

“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”

于是大侠这样放,干的不错?

然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。

怎么办??

把分解的小棍儿变粗。

SVM就是试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。

现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。

然后,在SVM 工具箱中有另一个更加重要的技巧( trick)。 魔鬼看到大侠已经学会了一个trick,于是魔鬼给了大侠一个新的挑战。

现在,大侠没有棍可以很好帮他分开两种球了,现在怎么办呢?

当然像所有武侠片中一样大侠桌子一拍,球飞到空中。然后,凭借大侠的轻功,大侠抓起一张纸,插到了两种球的中间。

现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。


再之后,无聊的大人们,把上面的物体起了别名:
球—— 「data」数据
棍子—— 「classifier」分类
最大间隙——「optimization」最优化
拍桌子——「kernelling」核方法
纸——「hyperplane」超平面

二、SVM算法定义

SVM:SVM全称是supported vector machine(支持向量机),即寻找到一个超平面使样本分成两类,并且间隔最大
SVM能够执行线性或非线性分类、回归,甚至是异常值检测任务。它是机器学习领域最受欢迎的模型之一。SVM特别适用于中小型复杂数据集的分类。 如果数据集过大,SVM算法运行会比较慢。

  • 线性可分SVM:硬间隔最大化,硬间隔SVM;
  • 线性SVM:软间隔最大化,软间隔SVM;
  • 非线性SVM:核函数;

1、 超平面最大间隔


上左图显示了三种可能的线性分类器的决策边界:

  1. 虚线所代表的模型表现非常糟糕,甚至都无法正确实现分类。
  2. 其余两个模型在这个训练集上表现堪称完美,但是它们的决策边界与实例过于接近,导致在面对新实例时,表现可能不会太好

上右图中的实线代表SVM分类器的决策边界,不仅分离了两个类别,且尽可能远离最近的训练实例

2、硬间隔和软间隔

2.1 硬间隔分类

在上面我们使用超平面进行分割数据的过程中,如果我们严格地让所有实例都不在最大间隔之间,并且位于正确的一边,这就是硬间隔分类。

硬间隔分类有两个问题,首先,它只在数据是线性可分离的时候才有效;其次,它对异常值非常敏感

当有一个额外异常值的鸢尾花数据:左图例子①的数据根本找不出硬间隔,而右图例子②最终显示的决策边界与我们之前所看到的无异常值时的决策边界也大不相同,可能无法很好地泛化。

2.2 软间隔分类

要避免这些问题,最好使用更灵活的模型。目标是尽可能在保持最大间隔宽阔和限制间隔违例(即位于最大间隔之上,甚至在错误的一边的实例)之间找到良好的平衡,这就是软间隔分类。

要避免这些问题,最好使用更灵活的模型。目标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡,这就是软间隔分类


在Scikit-Learn的SVM类中,可以通过超参数 C来控制这个平衡:C值越小,则间隔越宽,但是间隔违例也会越多。上图显示了在一个非线性可分离数据集上,两个软间隔SVM分类器各自的决策边界和间隔。

  • 左边使用了高C值,分类器的错误样本(间隔违例)较少,但是间隔也较小,落在中间过渡带上的样本数量较少,就是说使用了较少的样本进行分类,训练精度较高,但是容易过拟合;
  • 右边使用了低C值,间隔大了很多,但是位于间隔上的实例也更多。看起来第二个分类器的泛化效果更好,因为大多数间隔违例实际上都位于决策边界正确的一边,所以即便是在该训练集上,它做出的错误预测也会更少。

超参数 γγγ 越大,分类边界越扭曲、越不光滑,分类准确率上升,

  • γγγ 足够大的话,高斯核退化成为k-紧邻;
  • γγγ 足够大的话,可以使分类准确率达到100%;
  • γγγ 足够小的话,高斯核退化成为线性核。

三、SVM算法原理

1、定义输入数据

假设给定一个特征空间上的训练集为:
T={(x1,y1),(x2,y2),...,(xi,yi),...,(xm,ym)}T=\{(\textbf{x}_1,y_1),(\textbf{x}_2,y_2),...,(\textbf{x}_i,y_i),...,(\textbf{x}_m,y_m)\}T={(x1​,y1​),(x2​,y2​),...,(xi​,yi​),...,(xm​,ym​)}

其中:

  • xi∈Rn,yi∈{−1,1}\textbf{x}_i∈R^n,y_i∈\{-1,1\}xi​∈Rn,yi​∈{−1,1};
  • (xi,yi)(\textbf{x}_i,y_i)(xi​,yi​)称为样本点;
  • xi=(x1,x2,...,xn)\textbf{x}_i=(x_1,x_2,...,x_n)xi​=(x1​,x2​,...,xn​) 为第 iii 个样本;
  • yiy_iyi​ 为 xi\textbf{x}_ixi​的目标值:
    • 当 yi=1y_i=1yi​=1 时,样本 xi\textbf{x}_ixi​为正例;
    • 当 yi=−1y_i=-1yi​=−1 时,样本 xi\textbf{x}_ixi​为负例;

至于为什么正负用(-1,1)表示呢?其实这里没有太多原理,就是一个标记,你也可以用(2,-3)来标记。只是为了方便,​​ yi/yj=yi×yjy_i/y_j=y_i×y_jyi​/yj​=yi​×yj​ 的过程中刚好可以相等,便于之后的计算。

2、线性可分支持向量机

给定了上面提出的线性可分训练数据集,定义一个超平面为: y(x)=Φ(x)⋅ω+b\color{violet}{y(\textbf{x})=Φ(\textbf{x})·\textbf{ω}+b}y(x)=Φ(x)⋅ω+b ,其相应的分类决策函数 f(x)=sign[Φ(x)⋅ω+b]\color{violet}{f(\textbf{x})=sign[Φ(\textbf{x})·\textbf{ω}+b]}f(x)=sign[Φ(x)⋅ω+b] 就称为 可线性分类的“支持向量机”

其中:

  • sign又叫sgn,称为符号函数。其功能是取某个数的符号(正或负):

    • 当 x>0,sign(x)=1x>0,sign(x)=1x>0,sign(x)=1;
    • 当 x=0,sign(x)=0x=0,sign(x)=0x=0,sign(x)=0;
    • 当 x<0,sign(x)=−1x<0, sign(x)=-1x<0,sign(x)=−1。
  • Φ(x)\Phi(\textbf{x})Φ(x) 是某个确定的特征空间转换函数,它的作用是将 x=(x1,x2,...xn)\textbf{x}=(x_1,x_2,...x_n)x=(x1​,x2​,...xn​) 映射到更高的维度Φ(x)=(x1,x2,...xn,xn+1,...,xn+j)\Phi(\textbf{x})=(x_1,x_2,...x_n,x_{n+1},...,x_{n+j})Φ(x)=(x1​,x2​,...xn​,xn+1​,...,xn+j​),它有一个专有称号:核函数

    比如我们看到的特征有 2 个:x1x_1x1​,x2x_2x2​,组成的线性函数可以是 w1x1+w2x2w_1x_1+w_2x_2w1​x1​+w2​x2​,但是也许这两个特征并不能很好地描述数据,于是我们进行维度的转化,变成了 w1x1+w2x2+w3x1x2+w4x12+w5x22w_1x_1+w_2x_2+w_3x_1x_2+w_4x_1^2+w_5x_2^2w1​x1​+w2​x2​+w3​x1​x2​+w4​x12​+w5​x22​,于是我们多了三个特征。而这个Φ(x)\Phi(\textbf{x})Φ(x) 就是描述 x\textbf{x}x 的这种从低维度向高维度映射的函数。

以上就是线性可分支持向量机的模型表达式。我们要去求出这样一个模型,或者说要去求出这样一个超平面 y(x)=Φ(x)⋅ω+by(x)=Φ(\textbf{x})·\textbf{ω}+by(x)=Φ(x)⋅ω+b, 使得它能够最优地分离两个集合。

其实也就是我们要去求一组参数 (ω,b)(\textbf{ω},b)(ω,b),使其构建的超平面函数 y(x)=Φ(x)⋅ω+by(x)=Φ(\textbf{x})·\textbf{ω}+by(x)=Φ(x)⋅ω+b 能够最优地分离两个集合。

如下就是一个最优超平面:


又比如说这样:


阴影部分是一个“过渡带”,“过渡带”的边界是集合中离超平面最近的样本点落在的地方。

3、SVM的计算过程与算法步骤

3.1 推导目标函数

我们知道了支持向量机是个什么东西了。现在我们要去寻找这个支持向量机,也就是寻找一个最优的超平面。

于是我们要建立一个目标函数。那么如何建立呢?

再来看一下我们的超平面表达式: y(x)=Φ(x)⋅ω+by(\textbf{x})=Φ(\textbf{x})·\textbf{ω}+by(x)=Φ(x)⋅ω+b ,

为了方便讨论,令 Φ(x)=xΦ(\textbf{x})=\textbf{x}Φ(x)=x

则超平面表达式: y(x)=x⋅ω+by(\textbf{x})=\textbf{x}·\textbf{ω}+by(x)=x⋅ω+b ,

则在样本空间中,y(x)=0y(\textbf{x})=0y(x)=0 时的用来划分空间的超平面可通过如下线性方程来描述:

x⋅ω+b=0\textbf{x}·\textbf{ω}+b=0x⋅ω+b=0

其中:

  • x=(x1,x2,...,xn)\textbf{x}=(x_1,x_2,...,x_n)x=(x1​,x2​,...,xn​) 为样品特征数据值;

  • ω=(ω1ω2⋮ωn)\textbf{ω}=\begin{pmatrix}ω_1 \\ ω_2 \\\vdots \\ ω_n \end{pmatrix}ω=⎝⎜⎜⎜⎛​ω1​ω2​⋮ωn​​⎠⎟⎟⎟⎞​ 为超平面的法向量,决定了超平面的方向;

  • bbb 为位移项,决定了超平面和原点之间的距离;

  • 超平面可被法向量 ω\textbf{ω}ω 和位移 bbb 唯一确定,我们把该超平面 x⋅ω+b=0\textbf{x}·\textbf{ω}+b=0x⋅ω+b=0 记为 (ω,b)(\textbf{ω},b)(ω,b);

样本空间中任意点 x\textbf{x}x 到超平面 (ω,b)(\textbf{ω},b)(ω,b) 的距离:

r=∣x⋅ω+b∣∣∣ω∣∣;∣∣ω∣∣=ω12+ω22+...+ωn2\begin{aligned}r=\cfrac{|\textbf{x}·\textbf{ω}+b|}{||\textbf{ω}||}\end{aligned};||\textbf{ω}||=\sqrt{ω_1^2+ω_2^2+...+ω_n^2}r=∣∣ω∣∣∣x⋅ω+b∣​​;∣∣ω∣∣=ω12​+ω22​+...+ωn2​​

假设超平面 (ω,b)(\textbf{ω},b)(ω,b) 能将训练样本正确分类,则对于样本空间中任意点 (xi,yi)(\textbf{x}_i,y_i)(xi​,yi​):

  • 若 xi⋅ω+b>0\textbf{x}_i·\textbf{ω}+b>0xi​⋅ω+b>0,则: yi=+1y_i=+1yi​=+1
  • 若 xi⋅ω+b<0\textbf{x}_i·\textbf{ω}+b<0xi​⋅ω+b<0,则: yi=−1y_i=-1yi​=−1

为了将样本空间中的超平面 (ω,b)(\textbf{ω},b)(ω,b) 附近形成一个“隔离带”,令:

{xi⋅ω+b≥+1,yi=+1xi⋅ω+b≤−1,yi=−1\begin{cases} \textbf{x}_i·\textbf{ω}+b≥+1,& y_i=+1 \\ \textbf{x}_i·\textbf{ω}+b≤-1,& y_i=-1 \end{cases}{xi​⋅ω+b≥+1,xi​⋅ω+b≤−1,​yi​=+1yi​=−1​

样本空间中,

  • 满足: xi⋅ω+b=±1\textbf{x}_i·\textbf{ω}+b=±1xi​⋅ω+b=±1 的 所有“样本点” 称为: 支持向量
  • 每个支持向量到超平面 (ω,b)(\textbf{ω},b)(ω,b) 的距离都为: γ=γ=γ= 1∣∣ω∣∣\begin{aligned}\cfrac{1}{||\textbf{ω}||}\end{aligned}∣∣ω∣∣1​​;
  • 两个异号支持向量到超平面的距离之和为:γ=γ=γ= 2∣∣ω∣∣\begin{aligned}\cfrac{2}{||\textbf{ω}||}\end{aligned}∣∣ω∣∣2​​,被称为 “间隔”

    欲找到具有最大间隔的划分超平面,也就是要找到能满足下式条件的参数 www 和 bbb,使得 γ=γ=γ= 2∣∣ω∣∣\begin{aligned}\cfrac{2}{||\textbf{ω}||}\end{aligned}∣∣ω∣∣2​​ 最大。

{xi⋅ω+b≥+1,yi=+1xj⋅ω+b≤−1,yj=−1⟺yi⋅(xi⋅ω+b)≥1\begin{aligned} \begin{cases} \textbf{x}_i·\textbf{ω}+b≥+1,& y_i=+1 \\ \textbf{x}_j·\textbf{ω}+b≤-1,& y_j=-1 \end{cases} \iff y_i·(\textbf{x}_i·\textbf{ω}+b)≥1 \end{aligned}{xi​⋅ω+b≥+1,xj​⋅ω+b≤−1,​yi​=+1yj​=−1​⟺yi​⋅(xi​⋅ω+b)≥1​

所以:找具有最大间隔的划分超平面的问题等价于:求 yi⋅(xi⋅ω+b)≥1条件下,12∣∣ω∣∣2的极小值。\begin{aligned}y_i·(\textbf{x}_i·\textbf{ω}+b)≥1条件下,\cfrac12||\textbf{ω}||^2的极小值。\end{aligned}yi​⋅(xi​⋅ω+b)≥1条件下,21​∣∣ω∣∣2的极小值。​

3.2 目标函数的求解

拉格朗日乘子法 (Lagrange multipliers)是一种寻找多元函数在一组约束下的极值的方法,通过引入拉格朗日乘子,可将有 ddd 个变量与 kkk 个约束条件的最优化问题转化为具有 d+kd + kd+k 个变量的无约束优化问题求解。

根据拉格朗日乘子法

  • 原函数为:12∣∣ω∣∣2\begin{aligned}\cfrac12||\textbf{ω}||^2\end{aligned}21​∣∣ω∣∣2​;
  • 有2个附加约束条件:
    • 附加条件①:yi⋅(xi⋅ω+b)−1=0y_i·(\textbf{x}_i·\textbf{ω}+b)-1=0yi​⋅(xi​⋅ω+b)−1=0;
    • 附加条件②:yj⋅(xj⋅ω+b)−1=0y_j·(\textbf{x}_j·\textbf{ω}+b)-1=0yj​⋅(xj​⋅ω+b)−1=0

可得拉格朗日函数为:
L(ω,b)=12∣∣ω∣∣2−α1[yi⋅(xi⋅ω+b)−1]−α2[yj⋅(xj⋅ω+b)−1]L(\textbf{ω},b)=\cfrac12||\textbf{ω}||^2-α_1[y_i·(\textbf{x}_i·\textbf{ω}+b)-1]-α_2[y_j·(\textbf{x}_j·\textbf{ω}+b)-1]L(ω,b)=21​∣∣ω∣∣2−α1​[yi​⋅(xi​⋅ω+b)−1]−α2​[yj​⋅(xj​⋅ω+b)−1]

L(ω,b)L(\textbf{ω},b)L(ω,b) 对 ω\textbf{ω}ω 求偏导:∂L(ω,b)∂ω=ωT−(α1⋅yi⋅xi+α2⋅yj⋅xj)\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial \textbf{ω}}=\textbf{ω}^T-(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)\end{aligned}∂ω∂L(ω,b)​=ωT−(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)​

L(ω,b)L(\textbf{ω},b)L(ω,b) 对 bbb 求偏导:∂L(ω,b)∂b=−(α1⋅yi+α2⋅yj)\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial b}=-(α_1·y_i+α_2·y_j)\end{aligned}∂b∂L(ω,b)​=−(α1​⋅yi​+α2​⋅yj​)​

3.2.1 方程组求解法

令:∂L(ω,b)∂ω=0\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial \textbf{ω}}=0\end{aligned}∂ω∂L(ω,b)​=0​,∂L(ω,b)∂b=0\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial b}=0\end{aligned}∂b∂L(ω,b)​=0​

得到方程组:

{ωT−(α1⋅yi⋅xi+α2⋅yj⋅xj)=0α1⋅yi+α2⋅yj=0yi⋅(xi⋅ω+b)−1=0yj⋅(xj⋅ω+b)−1=0\begin{cases} \textbf{ω}^T-(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)=0 \\ α_1·y_i+α_2·y_j=0 \\ y_i·(\textbf{x}_i·\textbf{ω}+b)-1=0 \\ y_j·(\textbf{x}_j·\textbf{ω}+b)-1=0 \end{cases}⎩⎪⎪⎪⎨⎪⎪⎪⎧​ωT−(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)=0α1​⋅yi​+α2​⋅yj​=0yi​⋅(xi​⋅ω+b)−1=0yj​⋅(xj​⋅ω+b)−1=0​

其中 xi\textbf{x}_ixi​、 yiy_iyi​、xj\textbf{x}_jxj​、 yjy_jyj​ 为样品提供的数据,求解该方程组即可求得(ω,b)(\textbf{ω},b)(ω,b)。

3.2.2 对偶函数求解法

令:∂L(ω,b)∂ω=0\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial \textbf{ω}}=0\end{aligned}∂ω∂L(ω,b)​=0​,∂L(ω,b)∂b=0\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial b}=0\end{aligned}∂b∂L(ω,b)​=0​


{ωT=α1⋅yi⋅xi+α2⋅yj⋅xj0=α1⋅yi+α2⋅yj\begin{cases} \begin{aligned}\textbf{ω}^T=α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j\end{aligned} \\ \begin{aligned}0=α_1·y_i+α_2·y_j\end{aligned} \end{cases}{ωT=α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​​0=α1​⋅yi​+α2​⋅yj​​​
代入拉格朗日函数 L(ω,b)L(\textbf{ω},b)L(ω,b) 中,求解 12∣∣ω∣∣2\begin{aligned}\cfrac12||\textbf{ω}||^2\end{aligned}21​∣∣ω∣∣2​ 极小值的问题转为求解 L(ω,b)L(\textbf{ω},b)L(ω,b) 的对偶函数L′(ω,b)L^{'}(\textbf{ω},b)L′(ω,b)的极大值问题。

拉格朗日函数:

L(ω,b)=12∣∣ω∣∣2−α1[yi⋅(xi⋅ω+b)−1]−α2[yj⋅(xj⋅ω+b)−1]=12ωTω−α1⋅yi⋅xi⋅ω−α1⋅yi⋅b+α1−α2⋅yj⋅xj⋅ω−α2⋅yj⋅b+α2=12ωTω−(α1⋅yi⋅xi+α2⋅yj⋅xj)⋅ω−(α1⋅yi+α2⋅yj)⋅b+(α1+α2)\begin{aligned} L(\textbf{ω},b) &=\cfrac12||\textbf{ω}||^2-α_1[y_i·(\textbf{x}_i·\textbf{ω}+b)-1]-α_2[y_j·(\textbf{x}_j·\textbf{ω}+b)-1]\\ &=\cfrac12\textbf{ω}^T\textbf{ω}-α_1·y_i·\textbf{x}_i·\textbf{ω}-α_1·y_i·b+α_1-α_2·y_j·\textbf{x}_j·\textbf{ω}-α_2·y_j·b+α_2\\ &=\cfrac12\textbf{ω}^T\textbf{ω}-(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)·\textbf{ω}-(α_1·y_i+α_2·y_j)·b+(α_1+α_2) \end{aligned} L(ω,b)​=21​∣∣ω∣∣2−α1​[yi​⋅(xi​⋅ω+b)−1]−α2​[yj​⋅(xj​⋅ω+b)−1]=21​ωTω−α1​⋅yi​⋅xi​⋅ω−α1​⋅yi​⋅b+α1​−α2​⋅yj​⋅xj​⋅ω−α2​⋅yj​⋅b+α2​=21​ωTω−(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)⋅ω−(α1​⋅yi​+α2​⋅yj​)⋅b+(α1​+α2​)​

拉格朗日函数的对偶函数
L′(ω,b)=0=α1⋅yi+α2⋅yjωT=α1⋅yi⋅xi+α2⋅yj⋅xj12(α1⋅yi⋅xi+α2⋅yj⋅xj)ω−(α1⋅yi⋅xi+α2⋅yj⋅xj)⋅ω−0⋅b+(α1+α2)=(α1+α2)−12(α1⋅yi⋅xi+α2⋅yj⋅xj)ω=(α1+α2)−12(α1⋅yi⋅xi+α2⋅yj⋅xj)(α1⋅yi⋅xi+α2⋅yj⋅xj)T=(α1+α2)−12(α1⋅yi⋅xi+α2⋅yj⋅xj)(α1⋅yi⋅xiT+α2⋅yj⋅xjT)=∑i=12ai−12∑i=12∑j=12aiajyiyjxixjT\begin{aligned} L^{'}(\textbf{ω},b) &\xlongequal[0=α_1·y_i+α_2·y_j]{\textbf{ω}^T=α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j}\cfrac12(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)\textbf{ω}-(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)·\textbf{ω}-0·b+(α_1+α_2)\\ &=(α_1+α_2)-\cfrac12(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)\textbf{ω}\\ &=(α_1+α_2)-\cfrac12(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)^T\\ &=(α_1+α_2)-\cfrac12(α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j)(α_1·y_i·\textbf{x}_i^T+α_2·y_j·\textbf{x}_j^T)\\ &=\sum_{i=1}^2a_i-\cfrac12\sum^2_{i=1}\sum^2_{j=1}a_ia_jy_iy_j\textbf{x}_i\textbf{x}_j^T \end{aligned} L′(ω,b)​ωT=α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​0=α1​⋅yi​+α2​⋅yj​​21​(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)ω−(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)⋅ω−0⋅b+(α1​+α2​)=(α1​+α2​)−21​(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)ω=(α1​+α2​)−21​(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)T=(α1​+α2​)−21​(α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​)(α1​⋅yi​⋅xiT​+α2​⋅yj​⋅xjT​)=i=1∑2​ai​−21​i=1∑2​j=1∑2​ai​aj​yi​yj​xi​xjT​​

其中 xi\textbf{x}_ixi​ 为样品特征数据值,yiy_iyi​ 为样品目标值,yi∈{−1,+1}y_i∈\{-1,+1\}yi​∈{−1,+1}

求出 L′(ω,b)L^{'}(\textbf{ω},b)L′(ω,b) 的极大值对应的 α1α_1α1​、α2α_2α2​,代入 ωT=α1⋅yi⋅xi+α2⋅yj⋅xj\begin{aligned}\textbf{ω}^T=α_1·y_i·\textbf{x}_i+α_2·y_j·\textbf{x}_j\end{aligned}ωT=α1​⋅yi​⋅xi​+α2​⋅yj​⋅xj​​ 即可求出 ω\textbf{ω}ω,再将求出的 ω\textbf{ω}ω 代入 x⋅ω+b=0\textbf{x}·\textbf{ω}+b=0x⋅ω+b=0,即可求出 bbb 值。

3.2.3 整体流程确定

  1. 确认拉格朗日的对偶函数:L′(ω,b)=∑i=1nai−12∑i=1n∑j=1naiajyiyjΦ(xi)Φ(xj)T\begin{aligned}L^{'}(\textbf{ω},b)&=\sum_{i=1}^na_i-\cfrac12\sum_{i=1}^n\sum_{j=1}^na_ia_jy_iy_jΦ(\textbf{x}_i)Φ(\textbf{x}_j)^T\end{aligned}L′(ω,b)​=i=1∑n​ai​−21​i=1∑n​j=1∑n​ai​aj​yi​yj​Φ(xi​)Φ(xj​)T​, 其中:Φ(xi)Φ(\textbf{x}_i)Φ(xi​) 为 xi\textbf{x}_ixi​ 用于提升维度的核函数,nnn 表示有 nnn 个附加条件;

  2. 整理拉格朗日的对偶函数后得目标函数:LT(ω,b)=−L′(ω,b)=12∑i=1n∑j=1naiajyiyjΦ(xi)Φ(xj)T−∑i=1nai\begin{aligned}L^T(\textbf{ω},b)=-L^{'}(\textbf{ω},b)=\cfrac12\sum_{i=1}^n\sum_{j=1}^na_ia_jy_iy_jΦ(\textbf{x}_i)Φ(\textbf{x}_j)^T-\sum_{i=1}^na_i\end{aligned}LT(ω,b)=−L′(ω,b)=21​i=1∑n​j=1∑n​ai​aj​yi​yj​Φ(xi​)Φ(xj​)T−i=1∑n​ai​​

  3. 计算上面式子的极小值点处对应的 α1α_1α1​, α2α_2α2​, …, αnα_nαn​;

  4. 将 α1α_1α1​, α2α_2α2​, …, αnα_nαn​ 代入 ωT=∑i=1nαiyiΦ(xi)\begin{aligned}\textbf{ω}^T=\sum_{i=1}^nα_iy_iΦ(\textbf{x}_i)\end{aligned}ωT=i=1∑n​αi​yi​Φ(xi​)​ 求出 ω\textbf{ω}ω;

  5. 将 ω\textbf{ω}ω 代入 Φ(xi)⋅ω+b=yiΦ(\textbf{x}_i)·\textbf{ω}+b=y_iΦ(xi​)⋅ω+b=yi​,即可求出 bbb 值;

  6. 得划分超平面超平面模型:Φ(x)⋅ω+b=0Φ(\textbf{x})·\textbf{ω}+b=0Φ(x)⋅ω+b=0;

  7. 求得分类决策函数:f(x)=sign[Φ(x)⋅ω+b]\color{violet}{f(\textbf{x})=sign[Φ(\textbf{x})·\textbf{ω}+b]}f(x)=sign[Φ(x)⋅ω+b]

四、SVM算法举例

已知一个如图所示的训练数据集,给定3个数据点:正例点 x1=(3,3)\textbf{x}_1=(3,3)x1​=(3,3),x2=(4,3)\textbf{x}_2=(4,3)x2​=(4,3),负例点 x3=(1,1)\textbf{x}_3=(1,1)x3​=(1,1),试求最大间隔分离超平面,线性可分支持向量机。

解:

1、确认目标函数

由于 x1\textbf{x}_1x1​,x2\textbf{x}_2x2​ 是正例点,x3\textbf{x}_3x3​ 是负例点,所以 y1=+1y_1=+1y1​=+1,y2=+1y_2=+1y2​=+1,y3=−1y_3=-1y3​=−1

由图可知,即使不使用核函数提高维度,也能找到一个线性可分支持向量机

设最大间隔分离超平面为:Φ(x)⋅ω+b=x⋅ω+b=0Φ(\textbf{x})·\textbf{ω}+b=\textbf{x}·\textbf{ω}+b=0Φ(x)⋅ω+b=x⋅ω+b=0

∵∵∵
题目给出 x1=[3,3]\textbf{x}_1=[3,3]x1​=[3,3],x2=[4,3]\textbf{x}_2=[4,3]x2​=[4,3] 为正例点,x3=[1,1]\textbf{x}_3=[1,1]x3​=[1,1] 为负例点,

∴∴∴

有3个约束条件,各自系数记为:a1a_1a1​、a2a_2a2​、a3a_3a3​,且 ai≥0,i=1,2,3a_i≥0,i=1,2,3ai​≥0,i=1,2,3;

拉格朗日函数为
L(ω,b)=12∣∣ω∣∣2−α1[y1⋅(x1⋅ω+b)−1]−α2[y2⋅(x2⋅ω+b)−1]−α3[y3⋅(x3⋅ω+b)−1]\begin{aligned} L(\textbf{ω},b) &=\cfrac12||\textbf{ω}||^2-α_1[y_1·(\textbf{x}_1·\textbf{ω}+b)-1]-α_2[y_2·(\textbf{x}_2·\textbf{ω}+b)-1]-α_3[y_3·(\textbf{x}_3·\textbf{ω}+b)-1] \end{aligned} L(ω,b)​=21​∣∣ω∣∣2−α1​[y1​⋅(x1​⋅ω+b)−1]−α2​[y2​⋅(x2​⋅ω+b)−1]−α3​[y3​⋅(x3​⋅ω+b)−1]​
令:∂L(ω,b)∂ω=0\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial \textbf{ω}}=0\end{aligned}∂ω∂L(ω,b)​=0​,∂L(ω,b)∂b=0\begin{aligned}\cfrac{\partial L(\textbf{ω},b)}{\partial b}=0\end{aligned}∂b∂L(ω,b)​=0​


{ωT=α1⋅y1⋅x1+α2⋅y2⋅x2+α3⋅y3⋅x30=α1⋅y1+α2⋅y2+a3y3=a1⋅1+a2⋅1+a3⋅(−1)⟺{ωT=α1⋅y1⋅x1+α2⋅y2⋅x2+α3⋅y3⋅x3;①a3=a1+a2;②\begin{aligned} \begin{cases} \begin{aligned}\textbf{ω}^T=α_1·y_1·\textbf{x}_1+α_2·y_2·\textbf{x}_2+α_3·y_3·\textbf{x}_3\end{aligned} \\ \begin{aligned}0=α_1·y_1+α_2·y_2+a_3y_3=a_1·1+a_2·1+a_3·(-1) \end{aligned} \end{cases} \iff \begin{cases} \begin{aligned}\textbf{ω}^T=α_1·y_1·\textbf{x}_1+α_2·y_2·\textbf{x}_2+α_3·y_3·\textbf{x}_3\end{aligned} ;①\\ \begin{aligned}a_3=a_1+a_2\end{aligned};② \end{cases} \end{aligned}{ωT=α1​⋅y1​⋅x1​+α2​⋅y2​⋅x2​+α3​⋅y3​⋅x3​​0=α1​⋅y1​+α2​⋅y2​+a3​y3​=a1​⋅1+a2​⋅1+a3​⋅(−1)​​⟺{ωT=α1​⋅y1​⋅x1​+α2​⋅y2​⋅x2​+α3​⋅y3​⋅x3​​;①a3​=a1​+a2​​;②​​

目标函数:
LT(ω,b)=12∑i=13∑j=13aiajyiyjΦ(xi)Φ(xj)T−∑i=13ai=12∑i=1n∑j=1naiajyiyjxixjT−∑i=1nai=12(a1a1y1y1x1x1T+a1a2y1y2x1x2T+a1a3y1y3x1x3T+a2a1y2y1x2x1T+a2a2y2y2x2x2T+a2a3y2y3x2x3T+a3a2y3y2x3x2T+a3a1y3y1x3x1T+a3a3y3y3x3x3T)−∑i=1nai=12(a12⋅1⋅1⋅[3,3]⋅[33]+a1⋅a2⋅1⋅1⋅[3,3]⋅[43]+a1⋅a3⋅1⋅(−1)⋅[3,3]⋅[11]+a2⋅a1⋅1⋅1⋅[4,3]⋅[33]+a22⋅1⋅1⋅[4,3]⋅[43]+a2⋅a3⋅1⋅(−1)⋅[4,3]⋅[11]+a3⋅a1⋅(−1)⋅1⋅[1,1]⋅[33]+a3⋅a2⋅(−1)⋅1⋅[1,1]⋅[43]+a32⋅1⋅1⋅[1,1]⋅[11]))−∑i=1nai=12(18a12+21a1a2−6a1a3+21a2a1+25a22−7a2a3−6a3a1−7a3a2+2a32)−∑i=1nai=12(18a12+25a22+2a32+42a1a2−12a1a3−14a2a3)−(a1+a2+a3)=a3=a1+a2(4a12+10a1a2+132a22)−(2a1+2a2)\begin{aligned} L^T(\textbf{ω},b)&=\cfrac12\sum_{i=1}^3\sum_{j=1}^3a_ia_jy_iy_jΦ(\textbf{x}_i)Φ(\textbf{x}_j)^T-\sum_{i=1}^3a_i\\ &=\cfrac12\sum_{i=1}^n\sum_{j=1}^na_ia_jy_iy_j\textbf{x}_i\textbf{x}_j^T-\sum_{i=1}^na_i\\ &=\cfrac12(a_1a_1y_1y_1\textbf{x}_1\textbf{x}_1^T+a_1a_2y_1y_2\textbf{x}_1\textbf{x}_2^T+a_1a_3y_1y_3\textbf{x}_1\textbf{x}_3^T\\ &+a_2a_1y_2y_1\textbf{x}_2\textbf{x}_1^T+a_2a_2y_2y_2\textbf{x}_2\textbf{x}_2^T+a_2a_3y_2y_3\textbf{x}_2\textbf{x}_3^T\\ &+a_3a_2y_3y_2\textbf{x}_3\textbf{x}_2^T+a_3a_1y_3y_1\textbf{x}_3\textbf{x}_1^T+a_3a_3y_3y_3\textbf{x}_3\textbf{x}_3^T)-\sum_{i=1}^na_i\\ &=\cfrac12(a_1^2·1·1·[3,3]·\begin{bmatrix}3\\3\end{bmatrix}+a_1·a_2·1·1·[3,3]·\begin{bmatrix}4\\3\end{bmatrix}+a_1·a_3·1·(-1)·[3,3]·\begin{bmatrix}1\\1\end{bmatrix}\\ &+a_2·a_1·1·1·[4,3]·\begin{bmatrix}3\\3\end{bmatrix}+a_2^2·1·1·[4,3]·\begin{bmatrix}4\\3\end{bmatrix}+a_2·a_3·1·(-1)·[4,3]·\begin{bmatrix}1\\1\end{bmatrix}\\ &+a_3·a_1·(-1)·1·[1,1]·\begin{bmatrix}3\\3\end{bmatrix}+a_3·a_2·(-1)·1·[1,1]·\begin{bmatrix}4\\3\end{bmatrix}+a_3^2·1·1·[1,1]·\begin{bmatrix}1\\1\end{bmatrix}))-\sum_{i=1}^na_i\\ &=\cfrac12(18a_1^2+21a_1a_2-6a_1a_3+21a_2a_1+25a_2^2-7a_2a_3-6a_3a_1-7a_3a_2+2a_3^2)-\sum_{i=1}^na_i\\ &=\cfrac12(18a_1^2+25a_2^2+2a_3^2+42a_1a_2-12a_1a_3-14a_2a_3)-(a_1+a_2+a_3)\\ &\xlongequal[]{a_3=a_1+a_2}(4a_1^2+10a_1a_2+\cfrac{13}{2}a_2^2)-(2a_1+2a_2) \end{aligned}LT(ω,b)​=21​i=1∑3​j=1∑3​ai​aj​yi​yj​Φ(xi​)Φ(xj​)T−i=1∑3​ai​=21​i=1∑n​j=1∑n​ai​aj​yi​yj​xi​xjT​−i=1∑n​ai​=21​(a1​a1​y1​y1​x1​x1T​+a1​a2​y1​y2​x1​x2T​+a1​a3​y1​y3​x1​x3T​+a2​a1​y2​y1​x2​x1T​+a2​a2​y2​y2​x2​x2T​+a2​a3​y2​y3​x2​x3T​+a3​a2​y3​y2​x3​x2T​+a3​a1​y3​y1​x3​x1T​+a3​a3​y3​y3​x3​x3T​)−i=1∑n​ai​=21​(a12​⋅1⋅1⋅[3,3]⋅[33​]+a1​⋅a2​⋅1⋅1⋅[3,3]⋅[43​]+a1​⋅a3​⋅1⋅(−1)⋅[3,3]⋅[11​]+a2​⋅a1​⋅1⋅1⋅[4,3]⋅[33​]+a22​⋅1⋅1⋅[4,3]⋅[43​]+a2​⋅a3​⋅1⋅(−1)⋅[4,3]⋅[11​]+a3​⋅a1​⋅(−1)⋅1⋅[1,1]⋅[33​]+a3​⋅a2​⋅(−1)⋅1⋅[1,1]⋅[43​]+a32​⋅1⋅1⋅[1,1]⋅[11​]))−i=1∑n​ai​=21​(18a12​+21a1​a2​−6a1​a3​+21a2​a1​+25a22​−7a2​a3​−6a3​a1​−7a3​a2​+2a32​)−i=1∑n​ai​=21​(18a12​+25a22​+2a32​+42a1​a2​−12a1​a3​−14a2​a3​)−(a1​+a2​+a3​)a3​=a1​+a2​​(4a12​+10a1​a2​+213​a22​)−(2a1​+2a2​)​

2、计算拉格朗日目标函数极值点处对应的 α1α_1α1​, α2α_2α2​, …, αnα_nαn​;

L(ω,b)L(\textbf{ω},b)L(ω,b) 对 a1a_1a1​、a2a_2a2​ 求偏导并令其为0

{8a1+10a2−2=010a1+13a2−2=0⟺{a1=1.5a2=−1\begin{aligned} \begin{cases} \begin{aligned}8a_1+10a_2-2=0\end{aligned} \\ \begin{aligned}10a_1+13a_2-2=0 \end{aligned} \end{cases} \iff \begin{cases} \begin{aligned}a_1=1.5\end{aligned} \\ \begin{aligned}a_2=-1\end{aligned} \end{cases} \end{aligned}{8a1​+10a2​−2=0​10a1​+13a2​−2=0​​⟺{a1​=1.5​a2​=−1​​​

而该点不满足条件 a2>=0a_2 >=0a2​>=0,所以,最小值在边界上达到。

  • 当 a1=0a_1=0a1​=0 时,LT(ω,b)=(0+0+132a22)−(0+2a2)=132a22−2a2\begin{aligned}L^T(\textbf{ω},b)=(0+0+\cfrac{13}{2}a_2^2)-(0+2a_2)=\cfrac{13}{2}a_2^2-2a_2\end{aligned}LT(ω,b)=(0+0+213​a22​)−(0+2a2​)=213​a22​−2a2​​
    LT(ω,b)L^T(\textbf{ω},b)LT(ω,b) 对 a2a_2a2​ 求偏导并令其为0,得 13a2−2=0⟺a2=21313a_2-2=0\iff\begin{aligned}a_2=\cfrac{2}{13}\end{aligned}13a2​−2=0⟺a2​=132​​,
    此时,Lmaxa1=0;a2=213(ω,b)=213\begin{aligned}L_{max}^{a_1=0;a_2=\cfrac{2}{13}}(\textbf{ω},b)=\cfrac{2}{13}\end{aligned}Lmaxa1​=0;a2​=132​​(ω,b)=132​​
  • 当 a2=0a_2=0a2​=0 时,LT(ω,b)=4a12−(2a1+0)=4a12−2a1\begin{aligned}L^T(\textbf{ω},b)=4a_1^2-(2a_1+0)=4a_1^2-2a_1\end{aligned}LT(ω,b)=4a12​−(2a1​+0)=4a12​−2a1​​,LT(ω,b)L^T(\textbf{ω},b)LT(ω,b) 对 a1a_1a1​ 求偏导并令其为0,得 8a1−2=0⟺a1=148a_1-2=0\iff\begin{aligned}a_1=\cfrac14\end{aligned}8a1​−2=0⟺a1​=41​​,
    此时,Lmaxa1=14;a2=0(ω,b)=14\begin{aligned}L_{max}^{a_1=\cfrac14;a_2=0}(\textbf{ω},b)=\cfrac14\end{aligned}Lmaxa1​=41​;a2​=0​(ω,b)=41​​
  • 比较 Lmaxa1=0;a2=213(ω,b)=213\begin{aligned}L_{max}^{a_1=0;a_2=\cfrac{2}{13}}(\textbf{ω},b)=\cfrac{2}{13}\end{aligned}Lmaxa1​=0;a2​=132​​(ω,b)=132​​ 与 Lmaxa1=14;a2=0(ω,b)=14\begin{aligned}L_{max}^{a_1=\cfrac14;a_2=0}(\textbf{ω},b)=\cfrac14\end{aligned}Lmaxa1​=41​;a2​=0​(ω,b)=41​​ 可知,当 a1=14;a2=0a_1=\cfrac14;a_2=0a1​=41​;a2​=0 时 L(ω,b)L(\textbf{ω},b)L(ω,b) 达到最大值,此时 a1=14;a2=0;a3=a1+a2=14\begin{aligned}a_1=\cfrac14;a_2=0;a_3=a_1+a_2=\cfrac14\end{aligned}a1​=41​;a2​=0;a3​=a1​+a2​=41​​

3、求出 ω\textbf{ω}ω;

ωT=α1⋅y1⋅x1+α2⋅y2⋅x2+α3⋅y3⋅x3=14⋅1⋅[3,3]+0+14⋅(−1)⋅[1,1]=[12,12]\begin{aligned} \textbf{ω}^T &=α_1·y_1·\textbf{x}_1+α_2·y_2·\textbf{x}_2+α_3·y_3·\textbf{x}_3\\ &=\cfrac14·1·[3,3]+0+\cfrac14·(-1)·[1,1]\\ &=[\cfrac12,\cfrac12] \end{aligned} ωT​=α1​⋅y1​⋅x1​+α2​⋅y2​⋅x2​+α3​⋅y3​⋅x3​=41​⋅1⋅[3,3]+0+41​⋅(−1)⋅[1,1]=[21​,21​]​

4、求出 bbb 值

将 ω\textbf{ω}ω 代入超平面表达式:xi⋅ω+b=yi\textbf{x}_i·\textbf{ω}+b=y_ixi​⋅ω+b=yi​,当 i=1i=1i=1 时,x1=[3,3]\textbf{x}_1=[3,3]x1​=[3,3],ω=[1212]\begin{aligned}\textbf{ω}=\begin{bmatrix}\cfrac12 \\ \cfrac12\end{bmatrix}\end{aligned}ω=⎣⎢⎡​21​21​​⎦⎥⎤​​,y1=1y_1=1y1​=1

所以 b=1−xi⋅ω=1−[3,3]⋅[1212]=−2\begin{aligned}b=1-\textbf{x}_i·\textbf{ω}=1-[3,3]·\begin{bmatrix}\cfrac12\\\cfrac12\end{bmatrix}=-2\end{aligned}b=1−xi​⋅ω=1−[3,3]⋅⎣⎢⎡​21​21​​⎦⎥⎤​=−2​

5、得到划分超平面:

x⋅ω+b=0⟺[x1,x2]⋅[1212]+(−2)=0⟺0.5x1+0.5x2−2=0\textbf{x}·\textbf{ω}+b=0\iff[x_1,x_2]·\begin{bmatrix}\cfrac12 \\ \cfrac12\end{bmatrix}+(-2)=0\iff\color{violet}{0.5x_1+0.5x_2-2=0}x⋅ω+b=0⟺[x1​,x2​]⋅⎣⎢⎡​21​21​​⎦⎥⎤​+(−2)=0⟺0.5x1​+0.5x2​−2=0

6、得到分离决策函数为:

f(x)=sign(0.5x1+0.5x2−2)\color{violet}{f(x)=sign(0.5x_1+0.5x_2-2)}f(x)=sign(0.5x1​+0.5x2​−2)

7、本案例代码

from sklearn import svmX = [[3, 3], [4, 3], [1, 1]]
y = [1, 1, -1]svc_linear = svm.SVC(kernel='linear')  # 默认:kernel='rbf' 高斯核
svc_linear.fit(X, y)
coef = svc_linear._get_coef()
print('svc_linear =\n', svc_linear)
print('支持向量机算法-线性核-求出最优模型的参数:coef.shape = ', coef.shape, 'coef =', coef)predict11 = svc_linear.predict([[1, 1]])
predict21 = svc_linear.predict([[2, 1]])
predict22 = svc_linear.predict([[2, 2]])
predict23 = svc_linear.predict([[2, 3]])
print('predict11 = ', predict11)
print('predict21 = ', predict21)
print('predict22 = ', predict22)
print('predict23 = ', predict23)

打印结果:

svc_linear =SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',max_iter=-1, probability=False, random_state=None, shrinking=True,tol=0.001, verbose=False)
支持向量机算法-线性核-求出最优模型的参数:coef.shape =  (1, 2) coef = [[0.5 0.5]]
predict11 =  [-1]
predict21 =  [-1]
predict22 =  [1]
predict23 =  [1]

五、线性(可分 )支持向量机

  • 不一定分类完全正确的超平面就是最好的;
  • 样本数据身线性不可分

若数据线性不可分,则增加松弛因子 ξi≥0ξ_i≥0ξi​≥0,使函数间隔加上松弛变量大于等于1。这样,约束条件变成
yi[Φ(xi)⋅ω+b]≥1−ξiy_i[Φ(\textbf{x}_i)·\textbf{ω}+b]≥1-ξ_iyi​[Φ(xi​)⋅ω+b]≥1−ξi​
目标函数:
min⁡ω,b12∣∣ω∣∣2+C∑i=1Nξi\min \limits_{\textbf{ω},b}\cfrac12||\textbf{ω}||^2+C\sum^N_{i=1}ξ_iω,bmin​21​∣∣ω∣∣2+Ci=1∑N​ξi​
此处的 CCC 就是Api里的超参数 CCC。

六、SVM的核函数【解决“线性不可分”问题】

核函数并不是SVM特有的,核函数可以和其他算法也进行结合,只是核函数与SVM结合的优势非常大。使用核函数解决线性不可分

1、核函数概念

核函数,是将原始输入空间映射到新的特征空间,从而,使得原本线性不可分的样本可能在核空间可分。


下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时该如何把这两类数据分开呢?

假设

  • 空间 XXX 是输入空间,
  • 空间 HHH 是特征空间,
  • 存在一个映射 ϕϕϕ 使得 XXX 空间中的点 xxx 能够计算得到 HHH 空间中的点 hhh ,
  • 对于所有 XXX 空间中的点都满足:h=Φ(x)h=Φ(x)h=Φ(x)

若 xxx , zzz 是 XXX 空间中的任意点,且函数k(x,z)满足下述条件:
k(x,z)=Φ(x)⋅Φ(z)k(x,z)=Φ(x)·Φ(z)k(x,z)=Φ(x)⋅Φ(z)
则称 kkk 为核函数,而 ϕϕϕ 为映射函数

2、常见核函数

一般情况下,使用核函数后一定可分;

名称 表达式 参数
线性核 κ(xi,xj)=xiTxjκ(\textbf{x}_i,\textbf{x}_j)=\textbf{x}^T_i\textbf{x}_jκ(xi​,xj​)=xiT​xj​
多项式核 κ(xi,xj)=(xiTxj)dκ(\textbf{x}_i,\textbf{x}_j)=(\textbf{x}^T_i\textbf{x}_j)^dκ(xi​,xj​)=(xiT​xj​)d d≥1d≥1d≥1 为多项式的次数
高斯核 κ(xi,xj)=exp(−∥xi−xj∥22σ2)κ(\textbf{x}_i,\textbf{x}_j)=exp(-\cfrac{\|\textbf{x}_i-\textbf{x}_j\|^2}{2σ^2})κ(xi​,xj​)=exp(−2σ2∥xi​−xj​∥2​) σ>0σ>0σ>0 为高斯核的宽度(width)
拉普拉斯核 κ(xi,xj)=exp(−∥xi−xj∥σ)κ(\textbf{x}_i,\textbf{x}_j)=exp(-\cfrac{\|\textbf{x}_i-\textbf{x}_j\|}{σ})κ(xi​,xj​)=exp(−σ∥xi​−xj​∥​) σ>0σ>0σ>0
Sigmoid核 κ(xi,xj)=tanh(βxiTxj+θ)κ(\textbf{x}_i,\textbf{x}_j)=tanh(β\textbf{x}^T_i\textbf{x}_j+θ)κ(xi​,xj​)=tanh(βxiT​xj​+θ) tanhtanhtanh 为双曲正切函数,β>0,θ<0β>0,θ<0β>0,θ<0

2.1 线性核和多项式核

  • 多项核中,d=1时,退化为线性核;
  • 多项核计算实例:
    κ(x,y)=(xTy)d=2阶d=2(xTy)2=n为x、y的维度(∑i=1nxiyi)2=∑i=1n∑j=1nxixjyiyj=∑i=1n∑j=1n(xixj)(yiyj)=x、y的维度n=2∑i=12∑j=12(xixj)(yiyj)=∑i=12[(xix1)(yiy1)+(xix2)(yiy2)]=[(x1x1)(y1y1)+(x1x2)(y1y2)]+[(x2x1)(y2y1)+(x2x2)(y2y2)]=[(x1x1)(y1y1)+(x1x2)(y1y2)+(x2x1)(y2y1)+(x2x2)(y2y2)]=向量内积[[x1x1x1x2x2x1x2x2],[y1y1y1y2y2y1y2y2]]=[Φ(x),Φ(y)]\begin{aligned}κ(\textbf{x},\textbf{y})=(\textbf{x}^T\textbf{y})^d&\xlongequal[2阶]{d=2}(\textbf{x}^T\textbf{y})^2 \\&\xlongequal{n为\textbf{x}、\textbf{y}的维度}(\sum^n_{i=1}x_iy_i)^2=\sum^n_{i=1}\sum^n_{j=1}x_ix_jy_iy_j=\sum^n_{i=1}\sum^n_{j=1}(x_ix_j)(y_iy_j) \\&\xlongequal{\textbf{x}、\textbf{y}的维度n=2}\sum^2_{i=1}\sum^2_{j=1}(x_ix_j)(y_iy_j)=\sum^2_{i=1}[(x_ix_1)(y_iy_1)+(x_ix_2)(y_iy_2)] \\&=[(x_1x_1)(y_1y_1)+(x_1x_2)(y_1y_2)]+[(x_2x_1)(y_2y_1)+(x_2x_2)(y_2y_2)] \\&=[(x_1x_1)(y_1y_1)+(x_1x_2)(y_1y_2)+(x_2x_1)(y_2y_1)+(x_2x_2)(y_2y_2)] \\&\xlongequal{向量内积}[\begin{bmatrix}x_1x_1\\x_1x_2\\x_2x_1\\ x_2x_2\end{bmatrix},\begin{bmatrix}y_1y_1\\y_1y_2\\y_2y_1\\ y_2y_2\end{bmatrix}] \\&=[Φ(\textbf{x}),Φ(\textbf{y})] \end{aligned}κ(x,y)=(xTy)d​d=22阶​(xTy)2n为x、y的维度(i=1∑n​xi​yi​)2=i=1∑n​j=1∑n​xi​xj​yi​yj​=i=1∑n​j=1∑n​(xi​xj​)(yi​yj​)x、y的维度n=2i=1∑2​j=1∑2​(xi​xj​)(yi​yj​)=i=1∑2​[(xi​x1​)(yi​y1​)+(xi​x2​)(yi​y2​)]=[(x1​x1​)(y1​y1​)+(x1​x2​)(y1​y2​)]+[(x2​x1​)(y2​y1​)+(x2​x2​)(y2​y2​)]=[(x1​x1​)(y1​y1​)+(x1​x2​)(y1​y2​)+(x2​x1​)(y2​y1​)+(x2​x2​)(y2​y2​)]向量内积[⎣⎢⎢⎡​x1​x1​x1​x2​x2​x1​x2​x2​​⎦⎥⎥⎤​,⎣⎢⎢⎡​y1​y1​y1​y2​y2​y1​y2​y2​​⎦⎥⎥⎤​]=[Φ(x),Φ(y)]​
    其中:Φ(x)=[x1x1x1x2x2x1x2x2]Φ(\textbf{x})=\begin{bmatrix}x_1x_1\\x_1x_2\\x_2x_1\\ x_2x_2\end{bmatrix}Φ(x)=⎣⎢⎢⎡​x1​x1​x1​x2​x2​x1​x2​x2​​⎦⎥⎥⎤​,Φ(y)=[y1y1y1y2y2y1y2y2]Φ(\textbf{y})=\begin{bmatrix}y_1y_1\\y_1y_2\\y_2y_1\\ y_2y_2\end{bmatrix}Φ(y)=⎣⎢⎢⎡​y1​y1​y1​y2​y2​y1​y2​y2​​⎦⎥⎥⎤​ ;x\textbf{x}x, y\textbf{y}y 分别由二维升维到四维。
  • 线性核和多项式核的作用是首先在属性空间中找到一些点,这些点可以是也可以不是样本点,把这些点当做base,核函数的作用就是找与该点距离和角度满足某种关系的样本点。
  • 当样本点与该点的夹角近乎垂直时,两个样本的欧式长度必须非常长才能保证满足线性核函数大于0;而当样本点与base点的方向相同时,长度就不必很长;而当方向相反时,核函数值就是负的,被判为反类。即,它在空间上划分出一个梭形,按照梭形来进行正反类划分。

2.2 高斯核(RBF核)

  • 高斯核亦称为RBF核。
  • 高斯核是无穷维的。
  • 高斯核函数就是在属性空间中找到一些点,这些点可以是也可以不是样本点,把这些点当做base,以这些base为圆心向外扩展,扩展半径即为带宽,即可划分数据。
  • 换句话说,在属性空间中找到一些超圆,用这些超圆来判定正反类。

2.3 Sigmoid核:

  • 同样地是定义一些base,
  • 核函数就是将线性核函数经过一个tanh函数进行处理,把值域限制在了-1到1上。

总之,都是在定义距离,大于该距离,判为正,小于该距离,判为负。至于选择哪一种核函数,要根据具体的样本分布情况来确定。

3、核函数举例

3.1 核方法举例一:

3.2 核方法举例二:

下面这张图位于第一、二象限内。我们关注红色的门,以及“北京四合院”这几个字和下面的紫色的字母。
我们把红色的门上的点看成是“+”数据,字母上的点看成是“-”数据,它们的横、纵坐标是两个特征。
显然,在这个二维空间内,“+”“-”两类数据不是线性可分的。

绿色的平面可以完美地分割红色和紫色,两类数据在三维空间中变成线性可分的了。

三维中的这个判决边界,再映射回二维空间中:是一条双曲线,它不是线性的
核函数的作用就是一个从低维空间到高维空间的映射,而这个映射可以把低维空间中线性不可分的两类点变成线性可分的。

4、核函数的选择指导规则:

  1. 如果特征的数量很大,甚至和样本数量差不多时,往往线性可分,这时选用“逻辑回归”或者“线性核SVM”;
  2. 如果特征的数量很小,样本数量正常,不算多也不算少,这时选用“RBF核SVM”;
  3. 如果特征的数量很小,而样本的数量很大,这时手动添加一些特征,使得线性可分,然后选用“逻辑回归”或者“线性核SVM”;
  4. 多项式核一般很少使用,效率不高,结果也不优于RBF;
  5. Linear核参数少,速度快;RBF核参数多,分类结果非常依赖于参数,需要交叉验证或网格搜索最佳参数,比较耗时;
  6. 应用最广的应该就是RBF核,无论是小样本还是大样本,高维还是低维等情况,RBF核函数均适用

七、SVM的损失函数

在SVM中,我们主要讨论三种损失函数:

1、0/1损失(绿色)

  • 当正例的点落在y=0这个超平面的下边,说明是分类正确,无论距离超平面所远多近,误差都是0.
  • 当这个正例的样本点落在y=0的上方的时候,说明分类错误,无论距离多远多近,误差都为1.
  • 图像就是上图绿色线。

L(y,y^)=∑m=1Mδ(ym≠y^m)L(\textbf{y},\hat{\textbf{y}})=\sum^M_{m=1}δ(y_m≠\hat{y}_m)L(y,y^​)=m=1∑M​δ(ym​​=y^​m​)
其中,

  • 如果 ym≠y^my_m≠\hat{y}_mym​​=y^​m​,则 δ(ym≠y^m)=1δ(y_m≠\hat{y}_m)=1δ(ym​​=y^​m​)=1;
  • 如果 ym=y^my_m=\hat{y}_mym​=y^​m​,则 δ(ym=y^m)=0δ(y_m=\hat{y}_m)=0δ(ym​=y^​m​)=0;

2、Hinge/合页损失函数(蓝色;SVM使用)

  • 当一个正例的点落在y=1的直线上,距离超平面长度1,那么1-ξ=1,ξ=0,也就是说误差为0;
  • 当它落在距离超平面0.5的地方,1-ξ=0.5,ξ=0.5,也就是说误差为0.5;
  • 当它落在y=0上的时候,距离为0,1-ξ=0,ξ=1,误差为1;
  • 当这个点落在了y=0的上方,被误分到了负例中,距离算出来应该是负的,比如-0.5,那么1-ξ=-0.5,ξ=-1.5.误差为1.5.
  • 以此类推,画在二维坐标上就是上图中蓝色那根线了。

  • 第一项为经验风险,度量了模型对训练数据的拟合程度;
  • 第二项为结构风险,也称正则化项,度量了模型自身的复杂度,可以降低过拟合风险,由于该项为二次幂形式,所以又叫作 L2L2L2 正则项。 λλλ 是一个可调参数,用来权衡经验风险和结构风险,以加大某一项的惩罚力度。
  • 分类器的经验风险描述了分类器所给出的分类结果的准确程度;
  • 结构风险描述了分类器自身的稳定程度,复杂的分类器容易产生过拟合,因此是不稳定的。

3、Logistic损失函数(红色)

损失函数的公式为:ln(1+e−yi)ln(1+e^{-y_i})ln(1+e−yi​)

  • 当yi=0y_i=0yi​=0时,损失等于ln2ln2ln2,这样真丑,所以我们给这个损失函数除以ln2ln2ln2.
  • 这样到yi=0y_i=0yi​=0时,损失为1,即损失函数过(0,1)点
  • 即上图中的红色线。

八、SVM算法Api

1、SVM算法api综述

  • SVM算法既可以用于分类(二/多分类),也可用于回归和异常值检测。
  • SVM具有良好的鲁棒性,对未知数据拥有很强的泛化能力,特别是在数据量较少的情况下,相较其他传统机器学习算法具有更优的性能。

使用SVM作为模型时,通常采用如下流程:

  1. 对样本数据进行归一化;
  2. 应用核函数对样本进行映射**(最常采用和核函数是RBF和Linear,在样本线性可分时,Linear效果要比RBF好)**;
  3. 用cross-validation和grid-search对超参数进行优选;
  4. 用最优参数训练得到模型;
  5. 测试

sklearn中支持向量分类主要有三种方法:SVC、NuSVC、LinearSVC,扩展为三个支持向量回归方法:SVR、NuSVR、LinearSVR。

  • SVC和NuSVC方法基本一致,唯一区别就是损失函数的度量方式不同

    • NuSVC中的nu参数和SVC中的C参数;
  • LinearSVC是实现线性核函数的支持向量分类,没有kernel参数。

2、SVC

 class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3,coef0=0.0,random_state=None)
  • C: 惩罚系数,用来控制损失函数的惩罚系数,类似于线性回归中的正则化系数。

    • C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样会出现训练集测试时准确率很高,但泛化能力弱,容易导致过拟合。
    • C值小,对误分类的惩罚减小,容错能力增强,泛化能力较强,但也可能欠拟合。
  • kernel: 算法中采用的核函数类型,核函数是用来将非线性问题转化为线性问题的一种方法。

    • 参数选择有RBF, Linear, Poly, Sigmoid或者自定义一个核函数。

      • 默认的是"RBF",即径向基核,也就是高斯核函数;
      • 而Linear指的是线性核函数,
      • Poly指的是多项式核,
      • Sigmoid指的是双曲正切函数tanh核;。
  • degree:

    • 当指定kernel为’poly’时,表示选择的多项式的最高次数,默认为三次多项式;
    • 若指定kernel不是’poly’,则忽略,即该参数只对’poly’有用。
      • 多项式核函数是将低维的输入空间映射到高维的特征空间。
  • coef0: 核函数常数值(y=kx+b中的b值),

    • 只有‘poly’和‘sigmoid’核函数有,默认值是0。

3、NuSVC

class sklearn.svm.NuSVC(nu=0.5)

nu: 训练误差部分的上限和支持向量部分的下限,取值在(0,1)之间,默认是0.5

4、LinearSVC

class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)
  • penalty:正则化参数,

    • L1和L2两种参数可选,仅LinearSVC有。
  • loss:损失函数,
    • 有hinge和squared_hinge两种可选,前者又称L1损失,后者称为L2损失,默认是squared_hinge,
    • 其中hinge是SVM的标准损失,squared_hinge是hinge的平方
  • dual:是否转化为对偶问题求解,默认是True。
  • C:惩罚系数,
    • 用来控制损失函数的惩罚系数,类似于线性回归中的正则化系数。

九、案例:手写数字分类

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.model_selection import train_test_split
import time
from sklearn.decomposition import PCAdef my_svm():# 一、获取数据集train = pd.read_csv("I:/AI_Data/digit_recognizer/train.csv")print('train.shape =', train.shape, '---->train.head() =\n', train.head())# 1.1 获取目标值train_label = train.iloc[:, 0]print('train_label.shape =', train_label.shape, '---->train_label.head() =\n', train_label.head())# 1.2 获取目特征数据值train_image = train.iloc[:, 1:]print('train_image.shape =', train_image.shape, '---->train_image.head() =\n', train_image.head())# 1.3 查看train_image数据集中第n行样本具体图像to_plot(40, train_image)# 二、特征工程# 2.1 对数据特征值归一化处理train_label = train_label.valuesprint('train_label.shape =', train_label.shape, '---->train_label =\n', train_label)train_image = train_image.values / 255print('train_image.shape =', train_image.shape, '---->train_image =\n', train_image)# 2.2 数据集分割x_train, x_test, y_train, y_test = train_test_split(train_image, train_label, train_size=0.8, random_state=0)print('x_train.shape =', x_train.shape, '---->x_test.shape =', x_test.shape)# 传递多个n_components,寻找合理的n_components:print("\n---->通过循环尝试,找出PCA参数n_components一个合适的值")n_s = np.linspace(0.70, 0.85, num=5)accuracy = []for n in n_s:tmp = n_components_analysis(n, x_train, y_train, x_test, y_test)accuracy.append(tmp)# 准确率可视化展示plt.plot(n_s, np.array(accuracy), "r")plt.show()# 三、确定最优模型(经过图形展示,选择合理的n_components, 最后综合考虑确定结果为:0.80)print("\n---->开始使用n_components=0.80参数进行训练")pca = PCA(n_components=0.80)  # 实例化一个PCA算法估计器print('降维前的数据形状:x_train.shape = ', x_train.shape, '----x_test.shape =', x_test.shape)pca.fit(x_train)print('降维后的特征数量:pca.n_components_ = ', pca.n_components_)x_train_pca = pca.transform(x_train)x_test_pca = pca.transform(x_test)print('降维后的数据形状:x_train_pca.shape = ', x_train_pca.shape, '----x_test_pca.shape =', x_test_pca.shape)# 训练比较优的模型,计算accuracyss1 = svm.SVC(kernel='linear')  # 默认:kernel='rbf' 高斯核ss1.fit(x_train_pca, y_train)coef = ss1._get_coef()print('coef.shape = ', coef.shape, "---->训练后的模型参数:coef =\n", coef)# 四、模型评估y_test_predict = ss1.predict(x_test_pca)print("测试集每一行的数字为:", y_test_predict)score = ss1.score(x_test_pca, y_test)print("模型准确率:score = ", score)def to_plot(n, train_image):num = train_image.iloc[n, :].values.reshape(28, 28)plt.imshow(num)plt.axis("off")plt.show()# 多次使用pca,确定最后的最优模型
num = 1
def n_components_analysis(n, x_train, y_train, x_test, y_test):global numprint("\n第{}次进入n_components_analysis函数".format(num))num = num + 1# 记录开始时间start = time.time()# pca降维实现pca = PCA(n_components=n)print("特征降维,传递的参数 n= {}".format(n))print('降维前的数据形状:x_train.shape = ', x_train.shape)pca.fit(x_train)print('降维后的特征数量:pca.n_components_ = ', pca.n_components_)# 在训练集和测试集进行降维x_train_pca = pca.transform(x_train)print('降维后的数据形状:x_train_pca.shape = ', x_train_pca.shape)x_test_pca = pca.transform(x_test)# 利用svc进行训练print("开始使用svc进行训练")ss = svm.SVC()ss.fit(x_train_pca, y_train)ss_coef = ss._get_coef()print('训练后的模型参数形状:ss_coef.shape = ', ss_coef.shape)# 获取accuracy结果accuracy = ss.score(x_test_pca, y_test)# 记录结束时间end = time.time()print("准确率是:{}, 消耗时间是:{}s".format(accuracy, int(end - start)), '\n')return accuracyif __name__ == "__main__":my_svm()

打印结果:

train.shape = (42000, 785) ---->train.head() =label  pixel0  pixel1    ...     pixel781  pixel782  pixel783
0      1       0       0    ...            0         0         0
1      0       0       0    ...            0         0         0
2      1       0       0    ...            0         0         0
3      4       0       0    ...            0         0         0
4      0       0       0    ...            0         0         0
[5 rows x 785 columns]
train_label.shape = (42000,) ---->train_label.head() =0    1
1    0
2    1
3    4
4    0
Name: label, dtype: int64
train_image.shape = (42000, 784) ---->train_image.head() =pixel0  pixel1  pixel2    ...     pixel781  pixel782  pixel783
0       0       0       0    ...            0         0         0
1       0       0       0    ...            0         0         0
2       0       0       0    ...            0         0         0
3       0       0       0    ...            0         0         0
4       0       0       0    ...            0         0         0
[5 rows x 784 columns]
train_label.shape = (42000,) ---->train_label =[1 0 1 ... 7 6 9]
train_image.shape = (42000, 784) ---->train_image =[[0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.]...[0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.][0. 0. 0. ... 0. 0. 0.]]
x_train.shape = (33600, 784) ---->x_test.shape = (8400, 784)
---->通过循环尝试,找出PCA参数n_components一个合适的值
第1次进入n_components_analysis函数
特征降维,传递的参数 n= 0.7
降维前的数据形状:x_train.shape =  (33600, 784)
降维后的特征数量:pca.n_components_ =  26
降维后的数据形状:x_train_pca.shape =  (33600, 26)
开始使用svc进行训练
训练后的模型参数形状:ss_coef.shape =  (45, 26)
准确率是:0.9786904761904762, 消耗时间是:13s
第2次进入n_components_analysis函数
特征降维,传递的参数 n= 0.7374999999999999
降维前的数据形状:x_train.shape =  (33600, 784)
降维后的特征数量:pca.n_components_ =  31
降维后的数据形状:x_train_pca.shape =  (33600, 31)
开始使用svc进行训练
训练后的模型参数形状:ss_coef.shape =  (45, 31)
准确率是:0.9794047619047619, 消耗时间是:15s
第3次进入n_components_analysis函数
特征降维,传递的参数 n= 0.7749999999999999
降维前的数据形状:x_train.shape =  (33600, 784)
降维后的特征数量:pca.n_components_ =  38
降维后的数据形状:x_train_pca.shape =  (33600, 38)
开始使用svc进行训练
训练后的模型参数形状:ss_coef.shape =  (45, 38)
准确率是:0.9791666666666666, 消耗时间是:16s
第4次进入n_components_analysis函数
特征降维,传递的参数 n= 0.8125
降维前的数据形状:x_train.shape =  (33600, 784)
降维后的特征数量:pca.n_components_ =  47
降维后的数据形状:x_train_pca.shape =  (33600, 47)
开始使用svc进行训练
训练后的模型参数形状:ss_coef.shape =  (45, 47)
准确率是:0.9796428571428571, 消耗时间是:18s
第5次进入n_components_analysis函数
特征降维,传递的参数 n= 0.85
降维前的数据形状:x_train.shape =  (33600, 784)
降维后的特征数量:pca.n_components_ =  59
降维后的数据形状:x_train_pca.shape =  (33600, 59)
开始使用svc进行训练
训练后的模型参数形状:ss_coef.shape =  (45, 59)
准确率是:0.9780952380952381, 消耗时间是:22s
---->开始使用n_components=0.80参数进行训练
降维前的数据形状:x_train.shape =  (33600, 784) ----x_test.shape = (8400, 784)
降维后的特征数量:pca.n_components_ =  43
降维后的数据形状:x_train_pca.shape =  (33600, 43) ----x_test_pca.shape = (8400, 43)
coef.shape =  (45, 43) ---->训练后的模型参数:coef =[[ 1.27346108  0.44837052  0.21394343 ...  0.12094835  0.269388910.00786958][ 1.06670209  0.71798313  0.04271257 ...  0.55552765  0.275755350.32580642][ 1.28427377  1.09383679  0.790079   ...  0.7509089  -0.095839910.49066483]...[-0.98119567  1.3462044   0.05352872 ...  0.40358219 -0.4984337-0.30262477][-0.22536158  0.06303362  0.05919198 ...  0.02616964  0.055581350.48910023][ 0.24957349 -1.55194936  0.11671045 ... -0.47762716  0.767510620.23714344]]
测试集每一行的数字为: [3 6 9 ... 2 7 2]
模型准确率:score =  0.9302380952380952

十、SVM用于多分类

  • 直接多分类;
  • 多个二分类SVM组成多分类SVM(1 v.s. rest / 1 v.s. 1)

十一、SVM优缺点

SVM的优点:

  • 在高维空间中非常高效;
  • 即使在数据维度比样本数量大的情况下仍然有效;
  • 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的;
  • 通用性:不同的核函数与特定的决策函数一一对应;

SVM的缺点:

  • 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合;
  • 对缺失数据敏感;
  • 对于核函数的高维映射解释力不强;
  • SVM就没那么稳健,SVM算法的参数取值里只有少数几个值能使得模型效果不错,参数稍微改动一下,模型效果就千差万别,相对不容易把握。相对比的,随机森林模型是稳健的:随机森林分类器比较容易调参,参数在一个很宽的范围内都能达到差不多的效果。

十二、LR(逻辑回归) v.s. SVM(支持向量机)

1、相同点:

  1. 都是线性分类器。本质上都是求一个最佳分类超平面。
  2. 都是监督分类算法;
  3. 都是判别模型。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。
  4. LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题);
  5. 两个方法都可以增加不同的正则化项,如L1、L2等等。所以在很多实验中,两种算法的结果是很接近的。

2、不同点

  1. 本质上是其 Loss function不同;
      区别在于逻辑回归采用的是Logistical Loss,SVM采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
      逻辑回归损失函数:
      
      SVM损失函数:
      
      LR方法基于概率理论,假设样本为0或者1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值,或者从信息论的角度来看,其是让模型产生的分布P(Y|X)P(Y|X)尽可能接近训练数据的分布;支持向量机​基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面 。

  2. SVM只考虑分类面上的点,而LR考虑所有点(远离的点对边界线的确定也起作用)
      SVM中,在支持向量之外添加减少任何点都对结果没有影响,而LR则是每一个点都会影响决策。
      Linear SVM不直接依赖于数据分布,分类平面不受一类点影响 ;LR则是受所有数据点的影响,所以受数据本身分布影响的,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。​

  3. 在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。
      SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算量。 而LR则每个点都需要两两计算核函数,计算量太过庞大。

  4. SVM依赖于数据的测度,而LR则不受影响
      因为SVM是基于距离的,而LR是基于概率的,所以LR是不受数据不同维度测度不同的影响,而SVM因为要最小化12||w||212||w||2所以其依赖于不同维度测度的不同,如果差别较大需要做normalization 。当然如果LR要加上正则化时,也是需要normalization一下的 。
      使用梯度下降算法,一般都要 feature scaling,如果不归一化,各维特征的跨度差距很大,目标函数就会是“扁”的,在进行梯度下降的时候,梯度的方向就会偏离最小值的方向,走很多弯路。

  5. SVM自带结构风险最小化,LR则是经验风险最小化
      SVM的损失函数就自带正则!!!(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因!!!而LR必须另外在损失函数上添加正则项!!!
      以前一直不理解为什么SVM叫做结构风险最小化算法,所谓结构风险最小化,意思就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,从而达到真实误差的最小化。来达到结构风险最小化的目的,最常用的方法就是添加正则项,而SVM自带正则项。

  6. LR和SVM在实际应用的区别
      根据经验来看,对于小规模数据集,SVM的效果要好于LR,但是大数据中,SVM的计算复杂度受到限制,而LR因为训练简单,可以在线训练,所以经常会被大量采用【听今日头条的同学说,他们用LR用的就非常的多】




参考资料:
【转载】铰链损失函数(Hinge Loss)的理解

机器学习-有监督学习-分类算法:SVM/支持向量机【SVM:高维空间里用于二分类的超平面;支持向量:超平面附近隔离带边界上的样本】【求参数(ω,b)使超平面y(x)=Φ(x)·ω+b能最优分隔两集合】相关推荐

  1. 算法模型---支持向量机(SVM)

    来源:JerryLead 支持向量机的特点 支持向量机的用途 SVM一般是用来分类的(一般先分为两类,再向多类推广) 支持向量机的适用范围 数据类型 自变量可以数值型和标称型数据 因变量是二分类,通过 ...

  2. 机器学习算法の03 支持向量机SVM

    机器学习算法の03 支持向量机SVM SVM的基本概念 线性可分支持向量机 非线性支持向量机和核函数 线性支持向量机与松弛变量 LR与SVM的区别与联系 SVM的基本概念 基本概念: 支持向量机(su ...

  3. 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)

    文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...

  4. 分类问题常用算法之支持向量机SVM

    支持向量机 SVM(Support Vector Machines,支持向量机)是核变换技术的代表算法之一,是一种具有精度高.运算速度快.泛化能力强等优点的统计学习新算法,其主要思想是将低维空间中的线 ...

  5. 【SVM分类】基于matlab哈里斯鹰算法优化支持向量机SVM分类【含Matlab源码 2243期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[SVM分类]基于matlab哈里斯鹰算法优化支持向量机SVM分类[含Matlab源码 2243期] 获取代码方式2: 付费专栏Matla ...

  6. 【SVM时序预测】基于matlab鲸鱼算法优化支持向量机SVM时序数据预测【含Matlab源码 2250期】

    ⛄一.鲸鱼算法优化支持向量机SVM 1 鲸鱼优化算法 WOA是由Mirjalili和Lewis在2016年提出的一种较为新颖的元启发式群体智能优化算法,该算法模仿座头鲸的"螺旋气泡网&quo ...

  7. 【视频】支持向量机SVM、支持向量回归SVR和R语言网格搜索超参数优化实例

    最近我们被客户要求撰写关于SVM的研究报告,包括一些图形和统计输出. 什么是支持向量机 (SVM)? 我们将从简单的理解 SVM 开始. [视频]支持向量机SVM.支持向量回归SVR和R语言网格搜索超 ...

  8. ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测

    ML之分类预测:基于sklearn库的七八种机器学习算法利用糖尿病(diabetes)数据集(8→1)实现二分类预测 目录 输出结果 数据集展示 输出结果 1.k-NN 2.LoR 4.DT 5.RF ...

  9. 机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类

    机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类 一.界面实现 from tkinter import * from tkinter import ttk import NBdef ma ...

  10. 分类算法列一下有多少种?应用场景?分类算法介绍、常见分类算法优缺点、如何选择分类算法、分类算法评估

    分类算法 分类算法介绍 概念 分类算法 常见分类算法 NBS LR SVM算法 ID3算法 C4.5 算法 C5.0算法 KNN 算法 ANN 算法 选择分类算法 分类算法性能评估 分类算法介绍 概念 ...

最新文章

  1. MySQL Server-id踩到的坑
  2. 分享-WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking的使用
  3. C语言字符串-字符串排序
  4. 工作112:vue路由跳转错误:Error: Redirected when going from “/login“ to “/home“ via a navigation guard.
  5. STL源码剖析 heap堆结构
  6. html中怎么修改黑体,css怎样设置黑体?
  7. 在 Mac 上用输入法如何以另一种语言键入?
  8. 唯有自己变得强大_强大自己!(经典)
  9. java long 1 000_Java-基本数据类型
  10. 微软enchange服务器安装,Exchange 2010 图文安装详解
  11. 网页视频之ACC格式解析
  12. android鲁班压缩
  13. 普歌-码上鸿鹄团队-复习系统模块
  14. 趋势科技安全威胁病毒预警(本周十大病毒排名)
  15. win10无法连接到这个网络_win10以太网已连接无法上网怎么办?
  16. 数论-Lucas(卢卡斯定理)
  17. 手机屏幕xy坐标软件_软件工程中的xy问题
  18. 跳出“套路”泥沼,让在线教育回归本心
  19. 小台灯内部电路原理图,仅供参考(实际测量自己的台灯的输入电压是直流135V。时间2021.3.9)
  20. 索尼sr621sw和索尼sr626sw规格一样吗

热门文章

  1. win10进程太多怎么优化_教你优化Windows7后台进程,让你的电脑启动更快、运行更流畅...
  2. onkeyup+onafterpaste 限制文本框只能输入数字 在thinkPHP框架中某些不触发的现象
  3. TAOUP初译稿_HOOK
  4. Aras Innovator: 如何在Form中放入图片
  5. HTML和CSS小知识点笔记
  6. 如何选一款软件助力企业腾飞
  7. linux内核一直输出系统日志,系统日志出现大量:kernel: printk: xxxx messages suppressed...
  8. Java数据结构与算法(一)
  9. AMD处理器与INTEL的区别
  10. 打开Word提示向程序发送命令时出现问题怎么办