NLP深入学习(十二):支持向量机(SVM)


0. 引言

前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》
《NLP深入学习(七):词向量》
《NLP深入学习(八):感知机学习》
《NLP深入学习(九):KNN 算法及分类用法》
《NLP深入学习(十):决策树(ID3、C4.5以及CART)》
《NLP深入学习(十一):逻辑回归(logistic regression)》

1. 什么是支持向量机

支持向量机(Support Vector Machine, SVM)是一种监督学习模型,主要用于分类和回归分析任务,但最常用于二分类问题。其核心思想是通过构建一个能够最大化类别间隔(margin)的超平面来划分不同类别的数据点。

在二维或三维空间中,超平面是一个线性决策边界,而在高维特征空间中,则是一个多维的分割面。SVM的目标是最小化误分类点到这个超平面的距离(即找到最大间隔超平面),这样不仅可以使得模型具有很好的泛化能力,而且对未知样本的预测更加稳定。

对于非线性可分的数据集,SVM使用核函数(Kernel Trick)将原始输入数据映射到高维特征空间,在这个新的空间中寻找最优的超平面。常用的核函数包括线性核、多项式核、高斯核(径向基函数,RBF)等。
在这里插入图片描述

2. 线性 SVM

线性可分支持向量机(Linearly Separable Support Vector Machine)是 SVM 的一个特例,它假设训练数据是线性可分的,即存在一个超平面能够将正类别和负类别的样本完全分开。

以下是线性可分支持向量机的推导过程:

  1. 假设我们有训练数据集: { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} {(x1,y1),(x2,y2),...,(xn,yn)},其中 x i x_i xi 是输入样本, y i y_i yi 是对应的类别标签(+1 或 -1)。

  2. 我们的目标是找到一个超平面,表示为 w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0,其中 w w w 是法向量(weights), b b b 是偏置(bias)。

  3. 超平面将空间分成两个区域:正类别和负类别。我们希望对于所有的 i i i,如果 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

  4. SVM 的优化目标是最大化超平面到最近的正类别和负类别样本之间的间隔。这个间隔由超平面到最近的支持向量(支持向量是离超平面最近的训练样本)的距离决定。

  5. 支持向量到超平面的距离公式是: distance = ∣ w ⋅ x + b ∣ ∥ w ∥ \text{distance} = \frac{|w \cdot x + b|}{\|w\|} distance=wwx+b

  6. 为了最大化间隔,我们需要最小化 ∥ w ∥ \|w\| w,即最小化 1 2 ∥ w ∥ 2 \frac{1}{2} \|w\|^2 21w2(这个因子出现是为了方便后续求导)。

  7. SVM 的目标函数为:
    min 1 2 ∥ w ∥ 2 \text{min} \quad \frac{1}{2} \|w\|^2 min21w2
    约束条件为:
    y i ( w ⋅ x i + b ) ≥ 1 , for all  i = 1 , 2 , . . . , n y_i(w \cdot x_i + b) \geq 1, \quad \text{for all} \ i = 1, 2, ..., n yi(wxi+b)1,for all i=1,2,...,n

  8. 利用拉格朗日乘子法,我们将目标函数和约束条件转化为拉格朗日函数:
    L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i [ y i ( w ⋅ x i + b ) − 1 ] \mathcal{L}(w, b, \alpha) = \frac{1}{2} \|w\|^2 - \sum_{i=1}^{n} \alpha_i \left[ y_i(w \cdot x_i + b) - 1 \right] L(w,b,α)=21w2i=1nαi[yi(wxi+b)1]
    其中, α i \alpha_i αi 是拉格朗日乘子。

  9. L \mathcal{L} L 分别对 w w w b b b 求偏导数并令其等于零,得到:
    w = ∑ i = 1 n α i y i x i w = \sum_{i=1}^{n} \alpha_i y_i x_i w=i=1nαiyixi
    ∑ i = 1 n α i y i = 0 \sum_{i=1}^{n} \alpha_i y_i = 0 i=1nαiyi=0

  10. 将以上结果代入拉格朗日函数,得到拉格朗日对偶问题:
    max ∑ i = 1 n α i − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ( x i ⋅ x j ) \text{max} \quad \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (x_i \cdot x_j) maxi=1nαi21i=1nj=1nαiαjyiyj(xixj)
    约束条件为:
    α i ≥ 0 , ∑ i = 1 n α i y i = 0 \alpha_i \geq 0, \quad \sum_{i=1}^{n} \alpha_i y_i = 0 αi0,i=1nαiyi=0

  11. 最优解 α ∗ \alpha^* α 被找到后,可以通过 w ∗ = ∑ i = 1 n α i ∗ y i x i w^* = \sum_{i=1}^{n} \alpha_i^* y_i x_i w=i=1nαiyixi 计算得到超平面的法向量, b ∗ b^* b 由支持向量计算得到。

3. 非线性 SVM

3.1 推导过程

非线性支持向量机(Nonlinear Support Vector Machine)通过引入核函数来处理非线性可分的情况。核函数允许我们将数据映射到高维空间,使得在高维空间中数据变得线性可分。以下是非线性支持向量机的推导过程:

假设我们有训练数据集: { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} {(x1,y1),(x2,y2),...,(xn,yn)},其中 x i x_i xi 是输入样本, y i y_i yi 是对应的类别标签(+1 或 -1)。

  1. 我们引入一个映射函数 ϕ : R d → R D \phi: \mathbb{R}^d \rightarrow \mathbb{R}^D ϕ:RdRD,将原始输入空间映射到更高维的特征空间,其中 D D D 是高维空间的维数。

  2. 我们的目标是在特征空间中找到一个线性可分的超平面。超平面表示为 w ⋅ ϕ ( x ) + b = 0 w \cdot \phi(x) + b = 0 wϕ(x)+b=0,其中 w w w 是法向量(weights), b b b 是偏置(bias)。

  3. SVM 的优化目标是最大化间隔,即最小化 ∥ w ∥ \|w\| w。目标函数为:
    min 1 2 ∥ w ∥ 2 \text{min} \quad \frac{1}{2} \|w\|^2 min21w2
    约束条件为:
    y i ( w ⋅ ϕ ( x i ) + b ) ≥ 1 , for all  i = 1 , 2 , . . . , n y_i(w \cdot \phi(x_i) + b) \geq 1, \quad \text{for all} \ i = 1, 2, ..., n yi(wϕ(xi)+b)1,for all i=1,2,...,n

  4. 利用拉格朗日乘子法,我们将目标函数和约束条件转化为拉格朗日函数:
    L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i [ y i ( w ⋅ ϕ ( x i ) + b ) − 1 ] \mathcal{L}(w, b, \alpha) = \frac{1}{2} \|w\|^2 - \sum_{i=1}^{n} \alpha_i \left[ y_i(w \cdot \phi(x_i) + b) - 1 \right] L(w,b,α)=21w2i=1nαi[yi(wϕ(xi)+b)1]
    其中, α i \alpha_i αi 是拉格朗日乘子。

  5. L \mathcal{L} L 分别对 w w w b b b 求偏导数并令其等于零,得到:
    w = ∑ i = 1 n α i y i ϕ ( x i ) w = \sum_{i=1}^{n} \alpha_i y_i \phi(x_i) w=i=1nαiyiϕ(xi)
    ∑ i = 1 n α i y i = 0 \sum_{i=1}^{n} \alpha_i y_i = 0 i=1nαiyi=0

  6. 将以上结果代入拉格朗日函数,得到拉格朗日对偶问题:
    max ∑ i = 1 n α i − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j K ( x i , x j ) \text{max} \quad \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j K(x_i, x_j) maxi=1nαi21i=1nj=1nαiαjyiyjK(xi,xj)
    约束条件为:
    α i ≥ 0 , ∑ i = 1 n α i y i = 0 \alpha_i \geq 0, \quad \sum_{i=1}^{n} \alpha_i y_i = 0 αi0,i=1nαiyi=0

    这里, K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是核函数,它表示在特征空间中点 x i x_i xi x j x_j xj 的内积。

  7. 选择适当的核函数,如线性核、多项式核、高斯核等,根据问题的性质来进行非线性映射。

  8. 最优解 α ∗ \alpha^* α 被找到后,可以通过 w ∗ = ∑ i = 1 n α i ∗ y i ϕ ( x i ) w^* = \sum_{i=1}^{n} \alpha_i^* y_i \phi(x_i) w=i=1nαiyiϕ(xi) 计算得到超平面的法向量, b ∗ b^* b 由支持向量计算得到。

这样,通过引入核函数,我们可以处理非线性可分的情况,将数据映射到高维空间中,然后在高维空间中寻找线性可分的超平面。

3.2 常用核函数

核函数在非线性支持向量机中扮演着关键的角色,它用于将输入数据映射到高维空间,从而使得在高维空间中的数据更容易被线性分割。以下是一些常用的核函数:

  1. 线性核函数(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
    简单的内积操作,适用于线性可分的情况。

  2. 多项式核函数(Polynomial Kernel):
    K ( x i , x j ) = ( x i ⋅ x j + c ) d K(x_i, x_j) = (x_i \cdot x_j + c)^d K(xi,xj)=(xixj+c)d
    其中, c c c 是常数, d d d 是多项式的次数。通过调整 c c c d d d 可以实现不同程度的非线性映射。

  3. 高斯径向基核函数(Gaussian Radial Basis Function, RBF):
    K ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp\left(-\frac{\|x_i - x_j\|^2}{2\sigma^2}\right) K(xi,xj)=exp(2σ2xixj2)
    其中, σ \sigma σ 是控制函数宽度的参数。常用于处理复杂的非线性关系,对于很多问题表现良好。

  4. Sigmoid核函数:
    K ( x i , x j ) = tanh ⁡ ( α x i ⋅ x j + c ) K(x_i, x_j) = \tanh(\alpha x_i \cdot x_j + c) K(xi,xj)=tanh(αxixj+c)
    其中, α \alpha α c c c 是调节参数。它类似于神经网络中的激活函数。

  5. 拉普拉斯核函数(Laplacian Kernel):
    K ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ σ ) K(x_i, x_j) = \exp\left(-\frac{\|x_i - x_j\|}{\sigma}\right) K(xi,xj)=exp(σxixj)
    类似于高斯核函数,但它对离中心点较远的数据点的惩罚更加明显。

  6. 多项式Spline核函数:
    K ( x i , x j ) = ( 1 + x i ⋅ x j + ( x i ⋅ x j ) 2 2 ) d K(x_i, x_j) = \left(1 + x_i \cdot x_j + \frac{(x_i \cdot x_j)^2}{2}\right)^d K(xi,xj)=(1+xixj+2(xixj)2)d
    这是一种非线性的核函数,可以通过调整参数 d d d 来实现不同程度的非线性映射。

4. 参考

《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》
《NLP深入学习(七):词向量》
《NLP深入学习(八):感知机学习》
《NLP深入学习(九):KNN 算法及分类用法》
《NLP深入学习(十):决策树(ID3、C4.5以及CART)》
《NLP深入学习(十一):逻辑回归(logistic regression)》

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

也欢迎关注我的wx公众号:一个比特定乾坤

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值