机器学习——支持向量机 (Support Vector Machine)

支持向量机

    • 一、引言
      • 1.1 什么是SVM
      • 1.2 SVM的重要性与应用领域
        • 1.2.1 SVM的重要性
        • 1.2.2 SVM的应用领域
      • 1.3 SVM与其他分类算法的对比
        • 1.3.1 核心思想
        • 1.3.2 适用性与性能
        • 1.3.3 劣势与限制
        • 1.3.4 总结
    • 二、理论
      • 2.1 线性可分与线性不可分
        • 2.1.1 线性可分的基本概念
        • 2.1.2 线性不可分与特征空间转换
      • 2.2 最优超平面
        • 2.2.1 最优超平面的定义
        • 2.2.2 间隔最大化的原理
      • 2.3 支持向量
        • 2.3.1 支持向量的定义
        • 2.3.2 支持向量对决策边界的影响
      • 2.4 凸优化与软间隔
        • 2.4.1 凸优化的基本概念
        • 2.4.2 软间隔的引入与意义
        • 2.4.3 松弛变量的作用
        • 2.4.4 松弛变量的解释与推导
      • 2.5 对偶问题与核函数
        • 2.5.1 对偶问题的具体推导
        • 无正则化的情况
        • 有正则化的情况
        • 2.5.2 核函数的概念与类型
        • 2.5.3 常用的核函数
        • 线性核函数(Linear Kernel)
        • 多项式核函数(Polynomial Kernel)
        • 径向基函数核(Radial Basis Function, RBF)或高斯核(Gaussian Kernel)
        • Sigmoid核函数
    • 三、代码实现
      • 3.1 库、数据集的导入
      • 3.2 训练数据集
      • 3.3 绘制决策边界
      • 3.4 绘制结果图
      • 3.5 模型评估
    • 四、结果分析
      • 4.1 实验结果
      • 4.2 评估结果
      • 4.3 分析
    • 五、总结

一、引言

1.1 什么是SVM

SVM的定义如下:

支持向量机(Support Vector Machine, SVM) 是一类按 监督学习(supervised learning) 方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplan)

下面举一个二维数据的例子,在以下数据点中,对于颜色不同的点,我们可以找一条线将二者分开,以实现分类的目的。
二类数据点图
然而,在实际应用中,我们不难发现能够区分两者的线条众多。那么,我们该选择哪一条呢?通过对比下方的两幅图,从直观感受上,右侧的线条显然优于左侧的线条。如果随机添加一些数据点,左侧的线条很有可能分错数据点,因为现有的数据点离线的距离非常的近,因此这个模型的容忍度就比较低,而右侧对比来说容忍度比较高,优于左侧

那么,该如何找到最优的那一条线呢?我们需要找到一个特殊的线,这个线距离最近的数据点最远,这个线就是我们所需要的。

这就是SVM的核心思想——间隔最大,如下图,其中这条实线就是决策边界,两个圈出来的离决策边界最近的点就是支持向量,这两个支持向量到决策边界距离的和(即两条虚线之间的距离)就是间隔,而这里的间隔要优化为最大,这样得出的决策边界就是SVM所需的。
在这里插入图片描述
当然,上述解释都仅仅在二维数据上呈现,但SVM是可以在多维数据上实现的,例如三维上决策边界就是一个平面,n维数据的决策边界就是一个学习样本求解的最大边距超平面(n-1维)

1.2 SVM的重要性与应用领域

1.2.1 SVM的重要性
  • 分类效果和泛化能力:SVM作为一种基于统计的自然语言理解方法,具有较好的分类效果和泛化能力,可以处理高维数据和非线性数据。
  • 广泛的应用场景:SVM可以应用于多种自然语言处理任务,例如文本分类、命名实体识别和情感分析等。此外,它还可以用于回归分析、异常值检测等任务。
  • 可解释性:SVM具有较好的可解释性,可以通过支持向量和超平面等概念来解释分类决策的过程,使得结果更易于理解和分析。
1.2.2 SVM的应用领域
  • 文本分类:SVM在文本分类领域有广泛应用,如情感分析、垃圾邮件识别、新闻分类等。通过提取文本特征并使用SVM进行分类,可以实现高效的文本分类系统。
  • 图像识别:SVM在图像识别领域也表现出色,如人脸识别、物体检测、图像分类等。通过提取图像特征并使用SVM进行分类,可以实现高效且准确的图像识别系统。
  • 医学诊断:在医学领域,SVM可以用于疾病诊断。通过对病人的医学图像、生化指标等数据进行特征提取,再使用SVM进行分类,可以帮助医生判断病情。
  • 金融风险评估:在金融领域,SVM可以用于信用评分和风险评估。通过分析客户的财务状况、信用记录等信息,SVM可以预测客户是否具有违约风险。

1.3 SVM与其他分类算法的对比

1.3.1 核心思想
  • SVM:基于最大间隔原理,寻找一个超平面将数据分为两类,同时最大化支持向量到超平面的距离。
  • 逻辑回归:基于概率模型,通过最大化似然函数来实现类别之间的分离。
  • 决策树:利用树形结构,根据样本属性划分节点,直到达到叶子节点,叶子节点即为类别。
1.3.2 适用性与性能
  • SVM
    • 适用性广泛:可用于各种数据类型和领域,如文本分类、图像识别等。
    • 鲁棒性强:对噪声和异常点有一定的鲁棒性。
    • 高效处理高维数据:通过核技巧将低维空间的非线性问题映射到高维空间。
    • 可避免陷入局部最优解:使用结构风险最小化原则。
  • 逻辑回归:主要用于二分类问题,输出为概率值,表示样本属于某类别的概率。
  • 决策树:易于理解和解释,对数据准备要求简单或不必要,能处理数据型和常规型属性。
1.3.3 劣势与限制
  • SVM
    • 计算复杂度高:在大规模数据集上的训练时间较长。
    • 参数选择敏感:需要仔细调优参数,并可能通过交叉验证来确定最佳参数。
    • 对缺失数据敏感:在含有大量缺失数据的情况下可能表现不佳。
    • 适用于二分类问题:原始SVM算法主要解决二分类问题,对多类别问题需要扩展。
  • 逻辑回归:主要用于二分类问题,对于多分类问题可能需要使用其他方法。
  • 决策树:可能会产生过拟合问题,特别是对于复杂数据集。
1.3.4 总结
  • SVM在分类问题中因其独特的最大间隔原理、对高维数据的处理能力以及鲁棒性而备受青睐。然而,其在大规模数据集上的计算复杂度和参数敏感性是需要考虑的问题。
  • 逻辑回归决策树则分别以其概率输出和易于理解的树形结构在某些场景下有独特的优势,但也各自存在一些限制。

二、理论

2.1 线性可分与线性不可分

2.1.1 线性可分的基本概念

在二分类问题中,给定训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) } D = \{(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\} D={(x1,y1),(x2,y2),,(xn,yn)}
其中:

  1. x i ∈ R d x_i \in \mathbb{R}^d xiRd d d d 维特征向量
  2. y i ∈ { − 1 , 1 } y_i \in \{-1, 1\} yi{1,1} 是类别标签

如果存在一个超平面 w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0 能够将这两类数据完全分开,即对于所有 y i = 1 y_i = 1 yi=1 的数据点有 w ⋅ x i + b > 0 w \cdot x_i + b > 0 wxi+b>0,对于所有 y i = − 1 y_i = -1 yi=1 的数据点有 w ⋅ x i + b < 0 w \cdot x_i + b < 0 wxi+b<0,则称这两类数据是线性可分的。

简单理解就是一组二类数据,如果能找到将二者分开的一个超平面,那么就是线性可分的。以下两张图中,前者是线性可分的,后者是线性不可分的,其中,后者找不到一条线来将两类数据分开。
在这里插入图片描述

在这里插入图片描述

2.1.2 线性不可分与特征空间转换

当数据在原始特征空间中不是线性可分时,可以通过一个映射函数 ϕ ( x ) \phi(x) ϕ(x) 将数据从原始空间映射到高维特征空间,然后在高维空间中寻找一个线性超平面来分隔数据。映射函数 ϕ ( x ) \phi(x) ϕ(x) 通常是通过核函数 K ( x , x ′ ) K(x, x') K(x,x) 隐式定义的,即 ϕ ( x ) ⋅ ϕ ( x ′ ) = K ( x , x ′ ) \phi(x) \cdot \phi(x') = K(x, x') ϕ(x)ϕ(x)=K(x,x)

下面是一个具体例子便于理解,首先我们有一个一维的二类数据点,要将一维的数据点分类我们需要找到一个点,显然,这里找不到这样的一个点,因此这个一维数据是线性不可分的。
在这里插入图片描述
但是,将一维数据映射到二维之后,这里做了平方处理,就可以很容易地找到决策边界将二者分类,使得数据变得线性可分。
在这里插入图片描述

2.2 最优超平面

2.2.1 最优超平面的定义

在支持向量机(SVM)中,最优超平面是一个能够将训练数据集中的正负样本完全正确划分,并且使得两类样本之间的间隔达到最大的超平面。这个间隔定义为样本点到超平面的最短距离的两倍。

给定一个数据集,其中每个样本点 x i x_i xi 都带有一个标签 y i y_i yi(通常 y i ∈ { − 1 , 1 } y_i \in \{-1, 1\} yi{1,1} 表示不同的类别),最优超平面可以表示为:

w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0

其中:

  1. w w w 是超平面的法向量
  2. b b b 是截距
2.2.2 间隔最大化的原理

在支持向量机(SVM)中,间隔最大化是核心思想,因为它有助于找到一个最优的超平面,这个超平面不仅可以将数据正确分类,而且具有最大的泛化能力。

对于任意一点 x i x_i xi,其到超平面 w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0 的距离 d i d_i di 可以用以下公式表示:
d i = ∣ w ⋅ x i + b ∣ ∥ w ∥ d_i = \frac{|w \cdot x_i + b|}{\|w\|} di=wwxi+b
其中:

  1. ∥ w ∥ \|w\| w w w w L 2 L_2 L2 范数(即欧几里得长度)。

间隔 margin \text{margin} margin 则是所有样本点中距离超平面最近的点到超平面的距离的两倍:
margin = 2 × min ⁡ i d i = 2 × min ⁡ i ( ∣ w ⋅ x i + b ∣ ∥ w ∥ ) \text{margin} = 2 \times \min_i d_i = 2 \times \min_i \left( \frac{|w \cdot x_i + b|}{\|w\|} \right) margin=2×imindi=2×imin(wwxi+b)

从间隔的公式可以看出,当 w w w 的范数 ∥ w ∥ \|w\| w 减小时,间隔 margin \text{margin} margin 会增大。这是因为分母 ∥ w ∥ \|w\| w 的减小会导致距离 d i d_i di 的增大,进而使得间隔 margin \text{margin} margin 增大。

这里为达到目的我们选择 最小化 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2 而不是最小化 ∥ w ∥ \|w\| w,有以下几个原因:

  • 凸优化:在优化问题中,我们通常更喜欢处理凸函数,因为凸函数具有全局最优解。 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2 是一个凸函数,而 ∥ w ∥ \|w\| w 则不是。
  • 可导性 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2 在整个定义域内都是可导的,这使得我们可以使用基于梯度的优化算法(如梯度下降)来求解。而 ∥ w ∥ \|w\| w w = 0 w=0 w=0 处不可导。
  • 计算简便 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2 的梯度是 w w w,这是一个线性函数,使得计算更加简便。

知道了最优化的公式,为了确保样本点被正确分类,我们还需要满足以下约束条件:
{ w ⋅ x i + b ≥ 1 , 如果  y i = 1 w ⋅ x i + b ≤ − 1 , 如果  y i = − 1 \begin{cases} w \cdot x_i + b \geq 1, & \text{如果 } y_i = 1 \\ w \cdot x_i + b \leq -1, & \text{如果 } y_i = -1 \end{cases} {wxi+b1,wxi+b1,如果 yi=1如果 yi=1
这两个条件可以合并为一个不等式约束:
y i ( w ⋅ x i + b ) ≥ 1 , ∀ i y_i(w \cdot x_i + b) \geq 1, \forall i yi(wxi+b)1,i

综合以上分析,间隔最大化的优化问题就可以表示为:
min ⁡ w , b 1 2 ∥ w ∥ 2 s.t. y i ( w ⋅ x i + b ) ≥ 1 , ∀ i \min_{w, b} \frac{1}{2} \|w\|^2 \quad \text{s.t.} \quad y_i(w \cdot x_i + b) \geq 1, \forall i w,bmin21w2s.t.yi(wxi+b)1,i

通过求解这个优化问题,我们可以找到最优的超平面参数 w w w b b b,从而得到一个具有最大间隔的分类器。

2.3 支持向量

2.3.1 支持向量的定义

支持向量是指那些距离分隔超平面最近的样本点,即样本点满足

y i ( w ⋅ x i + b ) = 1 (1) y_i(w \cdot x_i + b) = 1 \tag{1} yi(wxi+b)=1(1)

2.3.2 支持向量对决策边界的影响

在SVM中,最优超平面的确定完全依赖于支持向量。这是因为优化问题的目标函数是

min ⁡ w , b 1 2 ∥ w ∥ 2 (2) \min_{w, b} \frac{1}{2} \|w\|^2 \tag{2} w,bmin21w2(2)

受约束于

y i ( w ⋅ x i + b ) ≥ 1 , ∀ i (3) y_i(w \cdot x_i + b) \geq 1, \forall i \tag{3} yi(wxi+b)1,i(3)

从式(2)和式(3)可以看出,只有满足式(3)等号条件的样本点(即支持向量)才会对优化问题的解 w w w b b b 产生影响。

具体来说,假设我们有一个训练数据集,并且已经找到了一个最优超平面。如果我们去掉所有的非支持向量(即那些 y i ( w ⋅ x i + b ) > 1 y_i(w \cdot x_i + b) > 1 yi(wxi+b)>1 的样本点),并重新训练SVM模型,我们会发现得到的最优超平面与原来完全相同。

这是因为支持向量位于两类样本的边界上,它们之间的距离(即间隔)决定了最优超平面的位置。而非支持向量则位于这个边界之外,对最优超平面的确定没有贡献。

为了更清晰地解释这一点,我们可以考虑优化问题的几何意义。间隔定义为

间隔 = 2 ∥ w ∥ (4) \text{间隔} = \frac{2}{\|w\|} \tag{4} 间隔=w2(4)

间隔最大化等价于最小化 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2。而支持向量位于间隔边界上,即满足式(1)的样本点,它们决定了间隔的大小。因此,只有支持向量才会影响最优超平面的方向(由 w w w 确定)和位置(由 b b b 确定)。

通过最大化间隔和依赖支持向量,SVM能够在高维空间中有效地找到最优超平面,从而对新的未知样本具有良好的泛化能力。这是因为最优超平面仅由支持向量决定,对噪声和异常值具有鲁棒性。同时,由于最大化间隔,最优超平面在分类边界上留下了足够的空间,使得新的未知样本更容易被正确分类。
在这里插入图片描述

2.4 凸优化与软间隔

2.4.1 凸优化的基本概念

凸优化问题可以表示为:

min ⁡ x ∈ C f ( x ) \min_{x \in C} f(x) xCminf(x)

其中, f ( x ) f(x) f(x) 是凸函数, C C C 是凸集。凸函数满足:

f ( λ x + ( 1 − λ ) y ) ≤ λ f ( x ) + ( 1 − λ ) f ( y ) f(\lambda x + (1-\lambda)y) \leq \lambda f(x) + (1-\lambda)f(y) f(λx+(1λ)y)λf(x)+(1λ)f(y)

对于所有 x , y x, y x,y 在函数的定义域内,且 0 ≤ λ ≤ 1 0 \leq \lambda \leq 1 0λ1

在SVM中,我们的目标是找到一个超平面来最大化间隔,同时确保数据点被正确分类。这可以转化为一个凸优化问题。

2.4.2 软间隔的引入与意义

硬间隔SVM要求所有数据点满足:

y i ( w ⋅ x i + b ) ≥ 1 , ∀ i y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1, \quad \forall i yi(wxi+b)1,i

但在现实数据中,这往往难以实现。因此,引入软间隔,允许某些点不满足上述条件,使得有一些噪声点的数据也能运用SVM,但会给予相应的惩罚。下图是一个软间隔的示意图,可以看到有一些点不满足硬件隔的条件。
在这里插入图片描述

2.4.3 松弛变量的作用

引入软间隔之后就可以为每个数据点引入松弛变量 ξ i \xi_i ξi,则约束变为:

y i ( w ⋅ x i + b ) ≥ 1 − ξ i , ∀ i y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 - \xi_i, \quad \forall i yi(wxi+b)1ξi,i

同时,在目标函数中加入对松弛变量的惩罚项:

min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i \min_{\mathbf{w}, b, \xi} \frac{1}{2}||\mathbf{w}||^2 + C\sum_{i=1}^{n}\xi_i w,b,ξmin21w2+Ci=1nξi

这里, C > 0 C > 0 C>0 是惩罚参数,控制对误分类的惩罚程度。

2.4.4 松弛变量的解释与推导
  • ξ i = 0 \xi_i = 0 ξi=0 时,数据点满足硬间隔条件,即被正确分类且位于间隔之外。
  • 0 < ξ i < 1 0 < \xi_i < 1 0<ξi<1 时,数据点虽然被正确分类,但位于间隔之内,即接近决策边界。
  • ξ i ≥ 1 \xi_i \geq 1 ξi1 时,数据点被误分类。

为了更直观地理解,考虑以下推导:

  1. 硬间隔情况
    y i ( w ⋅ x i + b ) ≥ 1 y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 yi(wxi+b)1
    这意味着点 i i i 到决策边界的距离至少为 1 ∣ ∣ w ∣ ∣ \frac{1}{||\mathbf{w}||} w1
  2. 软间隔情况
    引入 ξ i \xi_i ξi 后,约束变为:
    y i ( w ⋅ x i + b ) ≥ 1 − ξ i y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 - \xi_i yi(wxi+b)1ξi
    这可以重写为:
    y i ( w ⋅ x i + b ) + ξ i ≥ 1 y_i(\mathbf{w} \cdot \mathbf{x}_i + b) + \xi_i \geq 1 yi(wxi+b)+ξi1
    从中我们可以看出,当 ξ i > 0 \xi_i > 0 ξi>0 时,点 i i i 可以更接近决策边界或被误分类,但会受到目标函数中 C ξ i C\xi_i Cξi 的惩罚。

继续推导,我们可以进一步解释松弛变量 ξ i \xi_i ξi 在软间隔SVM中的作用及其对优化问题的影响。

引入松弛变量 ξ i \xi_i ξi 后,我们的优化问题变为:

min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i \min_{\mathbf{w}, b, \xi} \frac{1}{2} ||\mathbf{w}||^2 + C\sum_{i=1}^{n}\xi_i w,b,ξmin21w2+Ci=1nξi

受约束于:

y i ( w ⋅ x i + b ) ≥ 1 − ξ i , ∀ i y_i(\mathbf{w} \cdot \mathbf{x}_i + b) \geq 1 - \xi_i, \forall i yi(wxi+b)1ξi,i

ξ i ≥ 0 , ∀ i \xi_i \geq 0, \forall i ξi0,i

这里的 C C C 是一个正则化参数,用于平衡间隔最大化(即最小化 ∣ ∣ w ∣ ∣ 2 ||\mathbf{w}||^2 w2)和误分类的惩罚(即最小化 ∑ i = 1 n ξ i \sum_{i=1}^{n}\xi_i i=1nξi)。

  • C C C 较大时,误分类的惩罚项在优化问题中占据主导地位,因此SVM会试图最小化误分类的数量,即使这意味着间隔可能会变小。
  • C C C 较小时,间隔最大化在优化问题中占据主导地位,因此SVM会试图找到一个较大的间隔,即使这意味着可能会误分类一些样本点。

通过调整 C C C 的值,我们可以控制SVM对误分类的容忍度。较大的 C C C 值意味着SVM对误分类更加敏感,而较小的 C C C 值则意味着SVM更注重间隔最大化。以下是不同C下的数据结果图。

C = 1 时:
在这里插入图片描述
C = 10 时:
在这里插入图片描述
C = 0.1 时:
在这里插入图片描述

现在,考虑松弛变量 ξ i \xi_i ξi 的直观意义:

  • ξ i = 0 \xi_i = 0 ξi=0 时,数据点 x i \mathbf{x}_i xi 满足硬间隔条件,即被正确分类且位于间隔之外。这种情况下,数据点对目标函数的贡献仅限于间隔最大化项。
  • 0 < ξ i < 1 0 < \xi_i < 1 0<ξi<1 时,数据点 x i \mathbf{x}_i xi 虽然被正确分类,但位于间隔之内。这意味着数据点靠近决策边界,但仍然在正确的一侧。这种情况下,数据点对目标函数的贡献包括间隔最大化项和误分类惩罚项(但惩罚较小)。
  • ξ i ≥ 1 \xi_i \geq 1 ξi1 时,数据点 x i \mathbf{x}_i xi 被误分类。这意味着数据点位于决策边界的错误一侧。这种情况下,数据点对目标函数的贡献包括间隔最大化项和较大的误分类惩罚项。

通过引入松弛变量和软间隔,SVM能够处理线性不可分的数据集,并在间隔最大化和误分类惩罚之间找到一个平衡。这种灵活性使得SVM在许多实际应用中成为一种有效的分类工具。

2.5 对偶问题与核函数

2.5.1 对偶问题的具体推导
无正则化的情况

在没有正则化项的情况下,SVM的原始优化问题可以表述为:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \min_{\mathbf{…

为了求解这个问题,我们可以引入拉格朗日乘子 α i ≥ 0 \alpha_i \geq 0 αi0,并构造拉格朗日函数:

L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 n α i [ y i ( w ⋅ x i + b ) − 1 ] L(\mathbf{w}, b, \alpha) = \frac{1}{2}||\mathbf{w}||^2 - \sum_{i=1}^{n}\alpha_i[y_i(\mathbf{w} \cdot \mathbf{x}_i + b) - 1] L(w,b,α)=21w2i=1nαi[yi(wxi+b)1]

w \mathbf{w} w b b b 求偏导,并令它们等于0:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\partial…

解得:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \mathbf{w} &= …

将这两个结果代回拉格朗日函数,得到对偶问题:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \max_{\alpha} …

有正则化的情况

在引入软间隔和正则化项后,SVM的原始优化问题变为:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \min_{\mathbf{…

同样引入拉格朗日乘子 α i ≥ 0 \alpha_i \geq 0 αi0 β i ≥ 0 \beta_i \geq 0 βi0,构造拉格朗日函数:

L ( w , b , ξ , α , β ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i − ∑ i = 1 n α i [ y i ( w ⋅ x i + b ) − 1 + ξ i ] − ∑ i = 1 n β i ξ i L(\mathbf{w}, b, \xi, \alpha, \beta) = \frac{1}{2}||\mathbf{w}||^2 + C\sum_{i=1}^{n}\xi_i - \sum_{i=1}^{n}\alpha_i[y_i(\mathbf{w} \cdot \mathbf{x}_i + b) - 1 + \xi_i] - \sum_{i=1}^{n}\beta_i\xi_i L(w,b,ξ,α,β)=21w2+Ci=1nξii=1nαi[yi(wxi+b)1+ξi]i=1nβiξi

w \mathbf{w} w, b b b, 和 ξ \xi ξ 求偏导,并令它们等于0:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\partial…

解得:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \mathbf{w} &= …

代入拉格朗日函数,得到对偶问题:

KaTeX parse error: No such environment: align* at position 7: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \max_{\alpha} …

这样,我们就得到了带有正则化项和软间隔的SVM的对偶问题。

2.5.2 核函数的概念与类型

核函数 K ( x , x ′ ) K(x, x') K(x,x) 是一个满足一定条件的函数,用于计算两个样本在特征空间中的内积,即 ϕ ( x ) ⋅ ϕ ( x ′ ) = K ( x , x ′ ) \phi(x) \cdot \phi(x') = K(x, x') ϕ(x)ϕ(x)=K(x,x)

2.5.3 常用的核函数

在支持向量机(SVM)中,核函数是一个非常重要的概念,它允许SVM处理非线性可分的数据。通过将数据映射到高维空间,核函数使得在高维空间中数据变得线性可分。以下是一些常用的核函数:

线性核函数(Linear Kernel)

K ( x i , x j ) = x i ⋅ x j K(x_i, x_j) = x_i \cdot x_j K(xi,xj)=xixj

线性核函数就是原始数据空间中的内积。它不改变数据的维度。

多项式核函数(Polynomial Kernel)

K ( x i , x j ) = ( γ x i ⋅ x j + r ) d K(x_i, x_j) = (\gamma x_i \cdot x_j + r)^d K(xi,xj)=(γxixj+r)d

其中, γ , r , d \gamma, r, d γ,r,d 是参数。多项式核函数可以将数据映射到更高维度的空间。

径向基函数核(Radial Basis Function, RBF)或高斯核(Gaussian Kernel)

K ( x i , x j ) = exp ⁡ ( − γ ∣ ∣ x i − x j ∣ ∣ 2 ) K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2) K(xi,xj)=exp(γxixj2)

其中, γ \gamma γ 是参数。高斯核函数是SVM中最常用的核函数之一,它可以将数据映射到无限维的空间。

Sigmoid核函数

K ( x i , x j ) = tanh ⁡ ( γ x i ⋅ x j + r ) K(x_i, x_j) = \tanh(\gamma x_i \cdot x_j + r) K(xi,xj)=tanh(γxixj+r)

其中, γ , r \gamma, r γ,r 是参数。Sigmoid核函数在某些情况下与神经网络中的激活函数类似。

在这里插入图片描述

三、代码实现

在此次实验中,我将通过实际代码来演示如何使用支持向量机(SVM)算法进行二分类任务。我将使用鸢尾花(Iris)数据集的一个子集,其中包含两个类别和两个特征。

3.1 库、数据集的导入

首先,我们导入了必要的Python库和鸢尾花数据集。我们选择数据集的两个类别(排除第三个类别)和两个特征(花萼长度和宽度)来进行训练。

import numpy as np  
import matplotlib.pyplot as plt  
from sklearn import svm, datasets  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report  

# 加载数据并选择两个类别和两个特征  
iris = datasets.load_iris()  
X = iris.data[iris.target != 2, :2]  # 选择前两个类别的前两个特征  
y = iris.target[iris.target != 2]  # 对应标签

# 分割数据集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  

# 标准化数据  
scaler = StandardScaler()  
X_train_scaled = scaler.fit_transform(X_train)  
X_test_scaled = scaler.transform(X_test)

3.2 训练数据集

接下来就可以使用Scikit-learn库中的SVC类来训练三个SVM模型:一个线性SVM(硬间隔,实际上Scikit-learn默认使用软间隔但可以通过设置C的值来模拟硬间隔),一个线性SVM(软间隔),和一个使用RBF核的非线性SVM。

# 训练线性SVM模型(硬间隔,实际上C为无穷大时接近硬间隔)  
clf_hard_margin = svm.SVC(kernel='linear', C=float(1e9))  # 大C值模拟硬间隔  
clf_hard_margin.fit(X_train_scaled, y_train)  

# 训练软间隔SVM模型  
clf_soft_margin = svm.SVC(kernel='linear', C=1.0)  
clf_soft_margin.fit(X_train_scaled, y_train)  

# 训练非线性SVM模型(使用RBF核进行升维)  
clf_rbf = svm.SVC(kernel='rbf', C=1.0)  
clf_rbf.fit(X_train_scaled, y_train)
  • 硬间隔SVM:理论上,当惩罚参数C设置为无穷大时,SVM会尝试找到一个完全分隔两个类别的决策边界(即硬间隔)。然而,在实际应用中,我们通常设置一个非常大的C值来模拟硬间隔。
  • 软间隔SVM:在软间隔SVM中,我们允许一些样本被错误分类,这些样本被称为支持向量。C参数控制了对错误分类样本的惩罚程度。C值越大,模型对错误分类的容忍度越低。
  • RBF核SVM:当数据不是线性可分时,我们可以使用核函数(如RBF核)将数据映射到更高维的空间,以找到一个能够分隔两个类别的决策边界。

3.3 绘制决策边界

为了可视化SVM的决策边界,我们定义了一个辅助函数plot_decision_boundary。这个函数创建一个网格来评估模型,并绘制决策边界和支持向量。

# 辅助函数:绘制决策边界
def plot_decision_boundary(clf, ax=None, colors='k', linewidth=2):  
    if ax is None:  
        ax = plt.gca()  
    xlim = ax.get_xlim()  
    ylim = ax.get_ylim()  
  
    # 创建网格来评估模型  
    xx = np.linspace(xlim[0], xlim[1], 30)  
    yy = np.linspace(ylim[0], ylim[1], 30)  
    YY, XX = np.meshgrid(yy, xx)  
    xy = np.vstack([XX.ravel(), YY.ravel()]).T  
    Z = clf.decision_function(xy).reshape(XX.shape)  
  
    # 绘制决策边界和间隔  
    ax.contour(XX, YY, Z, colors=colors, levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'], linewidths=linewidth)  
  
    # 绘制支持向量  
    ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, facecolors='none', edgecolors='r')
    

3.4 绘制结果图

使用前面定义的辅助函数,我们为三个SVM模型绘制了决策边界和支持向量。

# 绘制决策边界和支持向量
colors = ['blue', 'red']  

# 线性SVM(硬间隔)  
plt.figure(figsize=(5, 5))   
plt.scatter(X_train_scaled[:, 0], X_train_scaled[:, 1], c=[colors[i] for i in y_train], s=50)  
plot_decision_boundary(clf_hard_margin, ax=plt.gca(), colors='k', linewidth=2)  
plt.title('Hard Margin SVM (Linear)')  

# 线性SVM(软间隔)  
plt.figure(figsize=(5,1))
plt.scatter(X_train_scaled[:, 0], X_train_scaled[:, 1], c=[colors[i] for i in y_train], s=50)  
plot_decision_boundary(clf_soft_margin, ax=plt.gca(), colors='k', linewidth=2)  
plt.title('Soft Margin SVM (Linear)')  
  
# 非线性SVM(RBF核)  
plt.figure(figsize=(5,1)) 
plt.scatter(X_train_scaled[:, 0], X_train_scaled[:, 1], c=[colors[i] for i in y_train], s=50)  
plot_decision_boundary(clf_rbf, ax=plt.gca(), colors='k', linewidth=2)  
plt.title('SVM with RBF Kernel')  

plt.show()

从图中,我们可以看到三个模型如何根据训练数据学习决策边界。线性SVM模型(无论是硬间隔还是软间隔)都试图找到一条直线来分隔两个类别的样本,而RBF核SVM则能够学习一个更复杂的非线性边界。

3.5 模型评估

最后,我们计算了每个模型在测试集上的精确度(accuracy)和F1分数(F1 score),并打印了完整的分类报告。

# 预测测试集结果  
y_pred_hard = clf_hard_margin.predict(X_test_scaled)  
y_pred_soft = clf_soft_margin.predict(X_test_scaled)  
y_pred_rbf = clf_rbf.predict(X_test_scaled)  
  
# 计算评估指标  
# 精确度(accuracy)  
accuracy_hard = accuracy_score(y_test, y_pred_hard)  
accuracy_soft = accuracy_score(y_test, y_pred_soft)  
accuracy_rbf = accuracy_score(y_test, y_pred_rbf)  
  
# F1分数  
f1_hard = f1_score(y_test, y_pred_hard, average='macro')  # 或者 'weighted', 'micro', 'binary' 等  
f1_soft = f1_score(y_test, y_pred_soft, average='macro')  
f1_rbf = f1_score(y_test, y_pred_rbf, average='macro')  
  
# 打印评估指标  
print(f"Hard Margin SVM (Linear):")  
print(f"Accuracy: {accuracy_hard}")  
print(f"F1 Score: {f1_hard}")  
print(classification_report(y_test, y_pred_hard))  # 也可以打印完整的分类报告  
  
print(f"\nSoft Margin SVM (Linear):")  
print(f"Accuracy: {accuracy_soft}")  
print(f"F1 Score: {f1_soft}")  
print(classification_report(y_test, y_pred_soft))  
  
print(f"\nSVM with RBF Kernel:")  
print(f"Accuracy: {accuracy_rbf}")  
print(f"F1 Score: {f1_rbf}")  
print(classification_report(y_test, y_pred_rbf))

从评估结果中,我们可以了解到每个模型在测试集上的表现。精确度告诉我们模型正确分类了多少样本,而F1分数则是一个综合了精确度和召回率的指标,对于类别不平衡的数据集尤为重要。分类报告则提供了每个类别的精确率、召回率和F1分数,帮助我们更全面地了解模型的性能。

四、结果分析

4.1 实验结果

实验结果如下:分别是硬件隔,软间隔以及升维的结果
请添加图片描述
请添加图片描述

请添加图片描述

4.2 评估结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.3 分析

根据上述实验结果可知,这三个模型的评估性能都挺好的,这可能是因为数据量过少,数据中没有极端值导致的。同时也能看出各自的一些特点,对比分析可得:

  • 线性与非线性:线性SVM适用于数据完全线性可分的情况,而基于RBF核函数的SVM则能够处理非线性问题。当数据非线性可分时,RBF核函数通过映射到高维空间来找到最优决策边界,从而提高了分类性能。
  • 健壮性:软间隔SVM通过允许数据中存在一些错误分类的点来增加模型的健壮性。这在处理带有噪音或不完全可分的数据时非常有用。
  • 性能表现:从实验结果来看,基于RBF核函数的SVM在精确率、召回率和F1值方面均取得了优异的性能,表明它在处理非线性问题时的有效性。

综上所述,不同的SVM设置适用于不同的数据情况和问题需求。在选择使用哪种SVM时,需要根据数据的特性和问题的具体要求来进行权衡和选择。

五、总结

在本次机器学习实战中,我深入研究了支持向量机(SVM)算法,并通过实际操作多个数据集,体验了SVM在实际应用中的强大分类能力。SVM通过寻找最优决策超平面来分隔不同类别的样本,这一特性使得SVM在处理高维数据和复杂分类任务时表现出色。总的来说,通过本次SVM实战,我深入了解了SVM算法的原理和应用,提高了模型的实际应用能力。在未来的工作中,我将继续探索SVM在更多领域的应用,并尝试结合其他机器学习算法来构建更加高效、准确的分类模型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值