ML ML Learning Lab
13 / 14
第 13 步 · 找最大间隔的分界线

SVM 支持向量机Support Vector Machine

找"最大间隔"的分类线 — 离分界线最近的点决定了模型

10 分钟
阅读 + 实操
1 个
交互演示
中级
难度

SVM · 交互演示

支持向量--
训练准确率--
C 1.0

为什么学这步?

分类问题里能分开两类的直线有无数条,哪条最好?SVM 的答案是:找最大间隔的那条 — 离两边数据都最远,对噪声最鲁棒。它在小样本、高维数据上表现优异,核技巧能把线性不可分的数据隐式映射到高维空间变可分。理解 SVM 也帮你建立"间隔"和"支持向量"这两个贯穿 ML 的关键直觉。

📌 发生了什么

  • 在所有能分开两类的直线中,找离两边数据最远的那条。
  • 落在间隔边界上的点就是支持向量,它们决定了模型。
  • 核技巧用核函数隐式把数据映射到高维,解决线性不可分问题。

⚠️ 常见陷阱

  • SVM 一定比其他模型准?不一定,大数据集上训练会变慢。
  • 调 C 比选核更重要?经常反过来,先选对核再调 C。
  • 不做特征缩放也行?不行,SVM 基于距离计算,必须先标准化。

本章小结

  • 最大间隔:找离两边数据最远的分界线。
  • 支持向量:落在间隔边界上的点决定了模型。
  • 核技巧:隐式映射到高维解决线性不可分。

📐 最大间隔与对偶问题

SVM 在所有能分开两类的直线中,找间隔(margin)最大的那条,让模型对噪声最鲁棒。

最大化间隔等价于最小化 ‖w‖,约束为所有点正确分类且在间隔边界之外:

引入拉格朗日乘子 α_i,得到对偶问题。只有支持向量 α_i > 0:

核技巧:用核函数 K(x_i, x_j) 替代内积,隐式映射到高维空间,无需显式计算 φ(x):

🎛 正则参数 C 对比

C 控制对误分类的容忍度。C 大 = 硬间隔(不容忍),C 小 = 软间隔(允许一些误分类)。

参数 C 表现 结果
C = 0.1 软间隔,容忍较多误分类 欠拟合
C = 1 间隔与误分类平衡 推荐
C = 10 接近硬间隔,间隔窄 易过拟合
C = 1000 几乎不容忍,严重过拟合 不推荐

💡 核函数选择优先于 C:线性可分用 Linear,非线性用 RBF,文本用 Linear 或 Sigmoid。

💻 核函数与 SVM 预测

常用核函数实现与基于支持向量的预测(Python):

import numpy as np

# 线性核
def linear_kernel(x1, x2):
    return np.dot(x1, x2)

# RBF 核(高斯核)
def rbf_kernel(x1, x2, gamma=0.5):
    s = 0.0
    for i in range(len(x1)):
        s += (x1[i] - x2[i]) ** 2
    return np.exp(-gamma * s)

# 多项式核
def poly_kernel(x1, x2, degree=3):
    return (np.dot(x1, x2) + 1) ** degree

# SVM 预测:只有支持向量参与计算
def svm_predict(x, alphas, sv_x, sv_y, b, kernel):
    s = b
    for i in range(len(sv_x)):
        if alphas[i] > 0:  # 支持向量
            s += alphas[i] * sv_y[i] * kernel(x, sv_x[i])
    return 1 if s >= 0 else -1

📚 参考文献与延伸阅读

  • Cortes, C. & Vapnik, V. (1995). Support-Vector Networks. Machine Learning — SVM 的奠基论文
  • Vapnik, V. (1998). Statistical Learning Theory. Wiley — 统计学习理论完整框架
  • scikit-learn: SVM — 各种核函数的工业实现
  • Wikipedia: Support vector machine — 最大间隔与核技巧的数学推导

📝 课后练习

检验你的理解——答对为止