首页 / 经典分类 / 支持向量机

支持向量机:把间隔撑到最宽

Logistic 回归找的是「一条能分开的线」,SVM 找的是「离两边都最远的那条线」。 这个"最远"的要求,最后只由少数几个点决定——它们叫支持向量。 当一条直线实在分不开时,核技巧把数据悄悄搬到高维,在那里一刀切开。

决策边界与间隔带
底色是决策函数 的取值: 深色是确信的一侧(|f| > 1), 浅色是间隔带内部(|f| ≤ 1)——SVM 尽量让这条带子变宽且不夹住点。 带圈的点是支持向量,整条边界只由它们决定。
每个样本的 α(对偶变量)
绝大多数 α 是 0——这就是「稀疏性」:只有支持向量在起作用。 α = C 的点是被放弃的点(落在间隔内或分错了),模型不再为它们继续加码。
训练过程

                
              
①段是你现在这组参数的 sklearn 写法(数值是页面上真跑出来的); ②段是它内部真正在解的东西——对偶问题。本页的 α 就是自己解出来的。

① 要的不是"能分开",是"分得最稳"

能分开的直线有无数条。SVM 挑那条离最近的点最远的——把间隔撑到最宽, 模型对噪声的容忍度就最大:

约束取 1 是人为约定的(w、b 可以整体缩放);间隔宽度就是 ,所以最小化 就是最大化间隔。

② 分不开怎么办:软间隔与 C

现实数据总有重叠。给每个样本一个松弛量 ,允许它越界,但要罚:

C 就是"容忍度"的反面:C 大 → 几乎不容忍错分 → 间隔窄、容易被噪声带偏; C 小 → 宽容 → 间隔宽、更稳。这是 SVM 最重要的一个超参数。

③ 对偶:整条边界只由少数点决定

约束是 与 。 解出来以后 —— 只有 αᵢ > 0 的样本进入这个求和,它们就是支持向量。 KKT 条件把话说得更清楚:

  • :在间隔外,随便怎么动都不影响边界
  • :正好压在间隔边界上,撑出了间隔
  • :在间隔内甚至分错了,模型"放弃"继续为它调整

这就是为什么 200 个样本里往往只有十几个是支持向量——页面上那张 α 图看得最清楚。

④ 核技巧:直线分不开,就换一把尺子

对偶式里数据只以点积 ⟨xᵢ, xⱼ⟩ 的形式出现。把点积换成一个核函数, 等价于把数据映射到高维再算点积,却不用真去算那个映射:

本页提供三种:

  • 线性:,就是原来的 SVM
  • RBF: , 每个样本周围点了一盏"高斯灯",γ 决定灯罩多大
  • 多项式: , 显式构造出所有 d 阶交叉项
γ 是 RBF 核的"视野半径"。 γ 太小 → 灯照得太远,所有点看起来都差不多,边界被拉成近似直线, 连训练集都分不好(同心圆上 γ=0.01 只有 69% 准确率, 而且 200 个样本一个不落全成了支持向量); γ 太大 → 每盏灯只照到自己,边界绕着单个样本走,训练集上很漂亮但泛化风险大。 切到「同心圆」,把 γ 从 0.01 慢慢拖到 1,看准确率怎么跳上去、支持向量怎么掉下来。
1. 200 个样本里只有十几个是支持向量——为什么丢掉其余 190 个,边界一点不变?
因为在对偶形式里 , 非支持向量的 αᵢ = 0,根本不进入求和。 KKT 条件说明了它们为什么可以是 0:这些点已经在间隔外、被正确分类了, 再让步长怎么变都轮不到它们来约束边界。 所以"删掉它们"不是近似——是严格的等价。这也是 SVM 比很多模型省内存的原因: 预测时只需要留支持向量。
2. 线性核在「月牙」上把 C 调到 10000 也分不开,为什么?
因为线性核的决策边界永远是一条直线(在原始空间里)。 月牙是两道交错的弧,任何一条直线都会切错一批点——这不是 C 不够大, 而是假设空间里压根没有正确答案。 C 调大只会让模型为了少数几个难分点把边界扭来扭去(虽然它扭不动), 结果间隔变窄、对噪声更敏感。换成 RBF 核后,准确率直接从 87% 上到 98%—— 这就是核技巧的价值:换的不是参数,是假设空间。
3. αᵢ = C 的点被称为"被放弃的点",为什么?
因为对偶约束 是一堵墙。 当一个点很难分(在间隔内或分错了)时,算法想不断加大它的 αᵢ 来"讨好"它, 但撞到上界 C 就加不动了。此时 KKT 条件允许 ——也就是容忍它错着。 C 越大,这堵墙越高,模型越不肯放弃任何一个点, 这正是过拟合的来源之一。把 C 从 0.1 拖到 100,看 α 图里有多少根柱子顶到上界。
4. 为什么把 C 调小,支持向量反而变得更多?
因为 C 是"错分要罚多重"。C 小意味着惩罚轻,模型宁可把间隔撑得很宽、 容忍一批点越界,也不愿为了个别难点把边界挤窄。 间隔越宽,压在间隔边界上的点就越多——它们全是支持向量(0 < αᵢ < C)。 本页「线性可分」数据集上最直观:C=0.01 时有 79 个支持向量、间隔宽度 2.64; C=100 时只剩 3 个、间隔 0.66。 反过来,C 大时惩罚重,边界被推到"勉强刚好分开"的位置,只有极少数点还有约束力。
5. 本页的 α 是自己解出来的,怎么确认解得对?
两条独立的证据。第一,KKT 条件自检:最优解必须让每个样本都满足 「α=0 时 yf ≥ 1、0<α<C 时 yf = 1、α=C 时 yf ≤ 1」,本页解完后残差是 0 量级。 第二,与 libsvm 对拍:18 组(5 个数据集 × 三种核 × 几档 C/γ)配置下, 对偶目标值的最大相对差是 8e-9,支持向量个数与 sklearn 完全一致。 凸二次规划的最优值是唯一的,所以这两条都成立时,解就是对的。