支持向量机(SVM)
时间:2026-09-22 来源:华清远见
一、从一条分界线说起
想象教室里坐了两拨同学,左边是 Python 班,右边是 Java 班,现在要在地上画一条线把他们分开。画法有无数种:紧贴着左边画、紧贴着右边画、歪着画都可以。但有一条线最稳——它离两边的人都尽量远。将来来了个新同学站在线附近,我们也不容易分错。支持向量机(Support Vector Machine,SVM)找的就是这条“最稳的分界线”,学术一点说,叫最大间隔超平面。
二、支持向量:只有“边缘人”说了算
仔细看这条最优分界线会发现:它的位置其实只由两拨人里离对方最近的几个点决定,中间坐得远远的人挪一挪座位,线纹丝不动。这几个关键的“边缘点”就叫支持向量——这也是算法名字的由来。这是个很省事的性质:训练完成后,模型只记住这几个点就够了,预测时拿新点和它们比一比即可。
三、核技巧:把“分不开”变成“分得开”
如果两拨人混坐在一起,一条直线怎么都画不开怎么办?SVM 的答案是升维:把桌子上的点“抛”到更高的空间里去看,在低维纠缠的数据,到高维往往就能用一个平面切开。妙处在于,这个升维操作有捷径——核函数(kernel)。它让算法不必真的计算高维坐标,只通过一个函数就得到等价的结果,计算量几乎没涨。最常用的是高斯核(RBF),配合前面讲过的标准化预处理,能应付绝大多数非线性数据。
四、软间隔:容忍几个“刺头”
真实数据总有几个站错队的刺头。如果强行要求所有点都分对,边界可能被个别异常点带偏。软间隔的思路是:允许少数点越界,但要“罚款”。罚款力度由参数 C 控制:C 越大,越不容忍错误,边界容易被异常点扭曲;C 越小,边界越舒展,泛化通常更好。调 C 就是在“训练集全对”和“测试集更稳”之间找平衡。
五、上手代码(sklearn)
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
# SVM 对特征尺度敏感,必须先标准化
model = make_pipeline(StandardScaler(), SVC(kernel='rbf', C=1.0))
model.fit(X_train, y_train)
print(model.score(X_test, y_test))
六、小结与面试要点
SVM 的精髓可以浓缩成三句话:找最大间隔的边界;只由支持向量决定;分不开就升维(核技巧)。面试常被追问三点:一是 SVM 为什么必须做标准化——因为间隔和核函数都基于距离,量纲大的特征会独大;二是 C 和 gamma 的含义——C 管罚款力度、gamma 管核的弯曲程度,都过大易过拟合;三是小样本高维数据为什么首选 SVM——决策只依赖支持向量,样本少、维度高时依然稳。理解了“让边界离谁都远一点”这句话,SVM 就入门了。

