当前位置: 首页 > news >正文

机器学习(5)——支持向量机

1. 支持向量机(SVM)是什么?

支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面,使得不同类别的样本间隔(Margin)最大化,从而提高模型的泛化能力。

2. SVM的基本原理

2.1. 核心思想

  • 目标: 在特征空间中找到一个超平面(决策边界),使得两类样本的间隔最大化
  • 关键概念:
    • 支持向量(Support Vectors): 距离超平面最近的样本点,决定超平面的位置。这些点在定义分类边界时起着至关重要的作用,因此称为“支持向量”
    • 间隔(Margin): 支持向量到超平面的距离,越大表示分类器鲁棒性越强。SVM通过最大化这个间隔来选择最佳超平面。

3. 线性可分和非线性可分

  • 线性可分: 如果数据可以通过一个直线(二维空间)或超平面(高维空间)分开,则称数据是线性可分的。在这种情况下,SVM能够找到一个线性决策边界。

  • 非线性可分: 当数据不是线性可分时,我们可以通过核函数将数据映射到更高维的空间,使得在这个高维空间中数据变得线性可分。这个过程称为核技巧。

4. SVM的数学基础

4.1. 线性可分情况(硬间隔 SVM)

4.1.1. 间隔最大化

  • 在二维空间中,我们用一个线性决策边界(直线)来将数据分开。假设数据点可以被线性分开,则可以表示为:
    w ⋅ x + b = 0 w⋅x+b=0 wx+b=0

  • 其中:

    • w w w 是法向量,决定超平面的方向。
    • b b b 是偏置项,控制超平面与原点的距离。
    • x x x 是数据点。
  • 目标是找到一个决策边界,使得不同类别的数据点到该边界的距离尽量远。最大化间隔可以转化为如下的优化问题:

m a x i m i z e 2 ∥ w ∥ maximize \frac{2}{\|w\|} maximizew2

  • 其中, ∥ w ∥ \|w\| w是法向量的范数,优化的目标是使这个范数最小化,从而间隔最大化。

4.1.2. SVM 的优化目标

  • 假设数据线性可分,SVM 的优化目标是:
    最大化间隔 等价于 最小化 1 2 ∥ w ∥ 2 最大化间隔 \ 等价于 \ 最小化 \frac {1}{2}\|w\|^2 最大化间隔 等价于 最小化21w2

  • 约束条件: y i ( w T x i + b ) ≥ 1 , ∀ i y_i(w^T x_i + b) \geq 1, \quad \forall i yi(wTxi+b)1,i

  • 其中

    • w w w:是法向量。
    • b b b :是偏置项。
    • y i ∈ − 1 , + 1 y_i∈{−1,+1} yi1,+1:样本标签。
  • 几何解释:

    • 超平面方程: w T x + b = 0 w^Tx+b=0 wTx+b=0

    • 支持向量满足 y i ( w T x i + b ) = 1 y_i(w ^Tx_i +b)=1 yi(wTxi+b)=1

3. 线性不可分情况(软间隔 SVM)

当数据存在噪声或轻微重叠时,引入松弛变量(Slack Variables) ξ i ≥ 0 \xi_i≥0 ξi0,允许部分样本违反约束:
最大化间隔 等价于 min ⁡ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i 最大化间隔 \ 等价于 \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^{N} \xi_i 最大化间隔 等价于min21w2+Ci=1Nξi

  • ξ i \xi_i ξi是松弛变量,表示第 i i i个样本点与分类边界的偏差。

约束条件:
y i ( w T x i + b ) ≥ 1 − ξ i , ξ i ≥ 0 y_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i≥0 yi(wTxi+b)1ξi,ξi0

  • 参数 C C C:控制分类严格性:

    • C C C 大 → 更严格(可能过拟合)。

    • C C C 小 → 允许更多错误(提高泛化性)。

4. 非线性 SVM(核方法)

当数据非线性可分时,通过核函数(Kernel)将数据映射到高维空间,使其线性可分。

常用核函数

  • 线性核(无映射):
    K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi,xj)=xiTxj
  • 线性核(无映射):
    K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi,xj)=(xiTxj+c)d
  • 高斯核(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)
    • σ 控制样本间影响范围(小 → 过拟合,大 → 欠拟合)。
  • Sigmoid 核:
    K ( x i , x j ) = tanh ⁡ ( α x i T x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) K(xi,xj)=tanh(αxiTxj+c)

核技巧(Kernel Trick)

  • 无需显式计算高维映射 ϕ ( x ) ϕ(x) ϕ(x),直接通过核函数计算内积:
    ϕ ( x i ) T ϕ ( x j ) = K ( x i , x j ) \phi(x_i)^T \phi(x_j) = K(x_i, x_j) ϕ(xi)Tϕ(xj)=K(xi,xj)

5. 优化方法(对偶问题)

原始问题转化为拉格朗日对偶问题,通过求解:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) \max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j K(x_i, x_j) αmaxi=1nαi21i,jαiαjyiyjK(xi,xj)
约束:
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C \sum_{i=1}^{n} \alpha_i y_i = 0, \quad 0 \leq \alpha_i \leq C i=1nαiyi=0,0αiC

α i α_i αi:拉格朗日乘子,非零 α i α_i αi 对应支持向量。

最终决策函数:
f ( x ) = sign ( ∑ i ∈ S V α i y i K ( x i , x ) + b ) f(x) = \text{sign} \left( \sum_{i \in SV} \alpha_i y_i K(x_i, x) + b \right) f(x)=sign(iSVαiyiK(xi,x)+b)

6. 优缺点

  • ✅ 优点

    • 高维数据有效(尤其适合文本、图像)。

    • 核方法处理非线性问题。

    • 泛化能力强(最大化间隔)。

    • 对过拟合有一定鲁棒性(通过 C C C 控制)。

  • ❌ 缺点

    • 计算复杂度高(训练时间随样本数增长)。

    • 对参数( C C C、核参数)敏感。

    • 不直接提供概率输出(需额外校准)。

7. Python 示例(Scikit-learn)

7.1. 线性 SVM

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 训练线性SVM(C=1.0)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)

# 评估
print("Accuracy:", model.score(X_test, y_test))

7.2. 非线性 SVM(RBF 核)

from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler

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

# 训练RBF核SVM(C=1.0, gamma='scale')
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)

# 预测
print("Accuracy:", model.score(X_test_scaled, y_test))

7.3. 支持向量可视化

import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay

# 仅用前两特征简化可视化
X_2d = X[:, :2]
model = SVC(kernel='linear').fit(X_2d, y)

disp = DecisionBoundaryDisplay.from_estimator(
    model, X_2d, response_method="predict",
    plot_method="pcolormesh", alpha=0.3,
)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolor='k')
plt.title("SVM Decision Boundary")
plt.show()

8. 关键参数调优

  • C C C:平衡分类严格性与泛化能力。

    • 网格搜索:GridSearchCV(param_grid={‘C’: [0.1, 1, 10]})
  • 核函数选择

    • 线性:kernel=‘linear’

    • RBF:kernel=‘rbf’(需调 gamma)

  • γ γ γ(RBF核):

    • 小 → 决策边界平滑,大 → 复杂(过拟合风险)。

9. 总结

  • SVM 核心:最大化间隔的超平面,支持核方法处理非线性。

  • 关键参数:

    • 正则化参数 C C C

    • 核函数类型(RBF/线性/多项式)。

    • RBF 核的 γ γ γ

  • 适用场景:

    • 中小规模高维数据(如文本分类、图像识别)。

    • 需强泛化能力的分类任务。

相关文章:

  • 基于ssm网络游戏推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
  • stm32week11
  • ASR评测全方位指标解析:准确性与实时性的平衡-ASR评测
  • 啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!
  • Sentinel规则持久化pull模式核心源码解析
  • 多线程与Tkinter界面交互
  • transformer的基本结构和工作原理,多头自注意力机制的作用是什么,为什么使用位置编码?
  • 《算法笔记》3.6小节——入门模拟->字符串处理
  • 扩散模型 Diffusion Model 整体流程详解
  • 我拿Cursor复现了Manus的效果
  • 上层 Makefile 控制下层 Makefile ---- 第二部分(补充一些例子与细节)
  • URL结构、HTTP协议报文
  • Redis for Windows 后台服务运行
  • 【6】深入学习http模块(万字)-Nodejs开发入门
  • javascript专题2 ---- 在 JavaScript 列表(数组)的第一个位置插入数据
  • 【Linux C】简单bash设计
  • 重返JAVA之路——面向对象
  • 论文:Generalized Category Discovery with Large Language Models in the Loop
  • 玩转ChatGPT:使用深入研究功能梳理思路
  • 最大公约数和最小倍数 java
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?
  • 大风+暴雨,中央气象台双预警齐发
  • 一旅客因上错车阻挡车门关闭 ,株洲西高铁站发布通报
  • 乌称苏梅州一公共汽车遭俄军袭击,致9死4伤
  • 江西4人拟任县(市、区)委书记,其中一人为“80后”
  • 首次带人形机器人走科技节红毯,傅利叶顾捷:没太多包袱,很多事都能从零开始