SVM:找一条最宽的分界线
约 14 分钟
如果两类数据能被一条直线分开,可以画出无数条。支持向量机问的问题是:哪一条最好?
答案:留出最宽「街道」的那条
SVM 不满足于「分开」,它要找间隔最大的那条分界线。
想象在两类点之间修一条尽可能宽的街道,分界线就是街道的中线。街道越宽,对新数据的容错就越大——这直接对应更好的泛化能力。
支持向量就是恰好压在街道边缘上的那几个样本。
一个重要事实:只有支持向量决定分界线的位置。 把其他样本删掉,模型完全不变。这让 SVM 在小样本场景下特别有效。
数学形式
分界线是 ,间隔宽度是 。最大化间隔等价于:
这是一个凸二次规划问题——意味着它有唯一的全局最优解,不像神经网络那样可能陷入局部最优。这是 SVM 理论上的一大优点。
软间隔:允许犯错
真实数据往往线性不可分,或者有噪声点。硬性要求全部分对,会让分界线被一个离群点带偏。
引入松弛变量,允许一些样本越界,但要付出代价:
是最重要的超参数:
| C | 含义 | 结果 |
|---|---|---|
| C 大 | 犯错代价高 | 街道窄,尽量分对,容易过拟合 |
| C 小 | 容忍犯错 | 街道宽,容易欠拟合 |
本质上就是正则化强度的倒数。
核技巧:SVM 最精彩的部分
如果数据根本不能用直线分开怎么办?比如一类在圆心、另一类在圆环上。
思路:升到更高维,让它在高维空间里线性可分。 二维分不开的圆环,映射到三维(加一维 )就能用一个平面切开。
问题:显式做高维映射,计算量会爆炸。
核技巧的巧妙之处:SVM 的求解过程中,特征只以内积 的形式出现。所以我们根本不需要真的把数据映射上去,只需要一个能直接算出「高维空间中内积」的函数——这就是核函数。
高维映射从未真正发生,但效果达到了。
三个常用核:
| 核 | 表达式 | 用途 |
|---|---|---|
| 线性 | 特征多、样本少(如文本) | |
| RBF(高斯) | 默认首选,能拟合复杂边界 | |
| 多项式 | 特定结构 |
RBF 的 :越大,单个样本影响范围越小,边界越弯曲,越容易过拟合。 和 通常一起用网格搜索调。
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(SVC(kernel='rbf'),
{'C': [0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1]}, cv=5)
别忘了 SVM 也必须做特征缩放(它同样依赖距离和内积)。
SVM 今天的位置
2012 年之前,SVM 是分类任务的王者。深度学习兴起后,在图像、语音、文本上被全面超越。
但它在小样本、中等维度的表格数据上依然很有竞争力,而且理论优美——最大间隔、凸优化、核技巧这三个思想,值得每个学机器学习的人理解一次。
练习:解释核技巧为什么能「不做高维映射却达到高维的效果」。
SVM 找的是什么样的分界线?核技巧的精妙之处在哪里?参数 C 大和小分别意味着什么?
登录 后可看答案