【空间代谢】深入解析`scikit-learn`库中支持向量机(SVM)模型的原理

在这里插入图片描述

scikit - learn库中的支持向量机(SVM)是一种强大且广泛应用的机器学习模型,可用于分类和回归任务。下面详细介绍其原理,包括基本概念、线性可分情况、非线性情况以及核技巧等方面。

基本概念

支持向量机的核心目标是在特征空间中找到一个最优的超平面,使得不同类别的样本能够被尽可能准确地分开,并且这个超平面到各类别样本的间隔最大。这个间隔被称为“边际”,具有最大边际的超平面被认为是最优的决策边界,因为它能够在未知数据上具有较好的泛化能力。

线性可分情况

硬间隔 SVM

假设我们有一个二分类问题,训练数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x n , y n ) } D = \{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), \cdots, (\mathbf{x}_n, y_n)\} D={(x1,y1),(x2,y2),,(xn,yn)},其中 x i ∈ R d \mathbf{x}_i \in \mathbb{R}^d xiRd 是第 i i i 个样本的特征向量, y i ∈ { − 1 , + 1 } y_i \in \{-1, +1\} yi{1,+1} 是对应的类别标签。如果存在一个超平面 w T x + b = 0 w^T\mathbf{x}+b = 0 wTx+b=0 能够将正类和负类样本完全分开,即对于所有正类样本 x i \mathbf{x}_i xi w T x i + b > 0 w^T\mathbf{x}_i + b>0 wTxi+b>0,对于所有负类样本 x j \mathbf{x}_j xj w T x j + b < 0 w^T\mathbf{x}_j + b < 0 wTxj+b<0,则称数据集是线性可分的。

硬间隔 SVM 的目标是找到一个超平面 w T x + b = 0 w^T\mathbf{x}+b = 0 wTx+b=0,使得它到最近样本点的距离(边际)最大。这个问题可以转化为一个约束优化问题:

目标函数
min ⁡ w , b 1 2 ∥ w ∥ 2 \min_{w, b} \frac{1}{2}\|w\|^2 w,bmin21w2

约束条件
y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , ⋯   , n y_i(w^T\mathbf{x}_i + b) \geq 1, \quad i = 1, 2, \cdots, n yi(wTxi+b)1,i=1,2,,n

通过求解这个优化问题,可以得到最优的 w w w b b b,从而确定最优超平面。在求解过程中,那些使得约束条件 y i ( w T x i + b ) = 1 y_i(w^T\mathbf{x}_i + b) = 1 yi(wTxi+b)=1 成立的样本点被称为“支持向量”,它们决定了最优超平面的位置和方向。

软间隔 SVM

在实际应用中,大多数数据集并不是完全线性可分的,可能存在一些噪声或异常点。为了处理这种情况,引入了软间隔 SVM。软间隔 SVM 允许一些样本点违反间隔约束,通过引入松弛变量 ξ i ≥ 0 \xi_i \geq 0 ξi0 来衡量样本点违反约束的程度。

目标函数
min ⁡ w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 n ξ i \min_{w, b, \xi} \frac{1}{2}\|w\|^2 + C\sum_{i = 1}^{n}\xi_i w,b,ξmin21w2+Ci=1nξi

约束条件
y i ( w T x i + b ) ≥ 1 − ξ i , ξ i ≥ 0 , i = 1 , 2 , ⋯   , n y_i(w^T\mathbf{x}_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad i = 1, 2, \cdots, n yi(wTxi+b)1ξi,ξi0,i=1,2,,n

其中 C > 0 C>0 C>0 是一个惩罚参数,用于控制对违反间隔约束的样本点的惩罚程度。 C C C 值越大,对违反约束的惩罚越严重,模型会尽量减少违反约束的样本点; C C C 值越小,对违反约束的容忍度越高,模型更注重最大化边际。

非线性情况与核技巧

当数据集是非线性可分的时候,在原始特征空间中找不到一个线性超平面来分开不同类别的样本。此时,可以通过一个非线性映射 ϕ ( ⋅ ) \phi(\cdot) ϕ() 将原始特征空间 R d \mathbb{R}^d Rd 映射到一个更高维的特征空间 F \mathbb{F} F,使得数据在新的特征空间中变得线性可分。

然而,直接计算 ϕ ( x ) \phi(\mathbf{x}) ϕ(x) 可能会导致计算复杂度非常高,甚至不可行。为了解决这个问题,引入了核技巧。核函数 K ( x i , x j ) K(\mathbf{x}_i, \mathbf{x}_j) K(xi,xj) 定义为:
K ( x i , x j ) = ϕ ( x i ) T ϕ ( x j ) K(\mathbf{x}_i, \mathbf{x}_j) = \phi(\mathbf{x}_i)^T\phi(\mathbf{x}_j) K(xi,xj)=ϕ(xi)Tϕ(xj)

通过核函数,我们可以在原始特征空间中计算样本点在高维特征空间中的内积,而不需要显式地计算 ϕ ( x ) \phi(\mathbf{x}) ϕ(x)。常见的核函数有:

  • 线性核函数 K ( x i , x j ) = x i T x j K(\mathbf{x}_i, \mathbf{x}_j)=\mathbf{x}_i^T\mathbf{x}_j K(xi,xj)=xiTxj
  • 多项式核函数 K ( x i , x j ) = ( γ x i T x j + r ) d K(\mathbf{x}_i, \mathbf{x}_j)=(\gamma\mathbf{x}_i^T\mathbf{x}_j + r)^d K(xi,xj)=(γxiTxj+r)d,其中 γ > 0 \gamma > 0 γ>0 r r r 是偏移量, d d d 是多项式的次数。
  • 径向基核函数(RBF) K ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 2 ) K(\mathbf{x}_i, \mathbf{x}_j)=\exp(-\gamma\|\mathbf{x}_i - \mathbf{x}_j\|^2) K(xi,xj)=exp(γxixj2),其中 γ > 0 \gamma > 0 γ>0
  • Sigmoid 核函数 K ( x i , x j ) = tanh ⁡ ( γ x i T x j + r ) K(\mathbf{x}_i, \mathbf{x}_j)=\tanh(\gamma\mathbf{x}_i^T\mathbf{x}_j + r) K(xi,xj)=tanh(γxiTxj+r),其中 γ > 0 \gamma > 0 γ>0 r r r 是偏移量。

在使用核函数时,软间隔 SVM 的优化问题可以改写为:

目标函数
min ⁡ α 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j K ( x i , x j ) − ∑ i = 1 n α i \min_{\alpha} \frac{1}{2}\sum_{i = 1}^{n}\sum_{j = 1}^{n}\alpha_i\alpha_jy_iy_jK(\mathbf{x}_i, \mathbf{x}_j) - \sum_{i = 1}^{n}\alpha_i αmin21i=1nj=1nαiαjyiyjK(xi,xj)i=1nαi

约束条件
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C , i = 1 , 2 , ⋯   , n \sum_{i = 1}^{n}\alpha_iy_i = 0, \quad 0 \leq \alpha_i \leq C, \quad i = 1, 2, \cdots, n i=1nαiyi=0,0αiC,i=1,2,,n

求解上述优化问题得到最优的拉格朗日乘子 α ∗ \alpha^* α 后,决策函数可以表示为:
f ( x ) = sign ( ∑ i = 1 n α i ∗ y i K ( x i , x ) + b ∗ ) f(\mathbf{x}) = \text{sign}\left(\sum_{i = 1}^{n}\alpha_i^*y_iK(\mathbf{x}_i, \mathbf{x})+b^*\right) f(x)=sign(i=1nαiyiK(xi,x)+b)

scikit - learn 中的实现

scikit - learn 库中,支持向量机模型主要通过 SVC(用于分类)和 SVR(用于回归)类来实现。以下是一个简单的二分类示例:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两个特征
y = iris.target
y = (y == 0).astype(int)  # 二分类问题

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建 SVM 分类器
svm = SVC(kernel='linear', C=1.0)

# 训练模型
svm.fit(X_train, y_train)

# 预测
y_pred = svm.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy}")

在这个示例中,我们使用线性核函数和惩罚参数 C = 1.0 C = 1.0 C=1.0 来训练 SVM 分类器,并在测试集上评估其性能。

综上所述,scikit - learn 中的 SVM 模型基于最优超平面和核技巧的原理,通过求解约束优化问题来找到最优的决策边界,能够有效地处理线性和非线性分类与回归问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值