支持向量机(SVM)是经典的监督学习算法,在小样本、非线性及高维模式识别中表现出色,广泛应用于分类和回归任务。

概述

支持向量机(Support Vector Machine, SVM)由 Vapnik 等人于 1992 年正式提出。

发展历程

时间里程碑
1963 年Vapnik 提出最大间隔分类器
1992 年引入核技巧(Kernel Trick)
1995 年Cortes 和 Vapnik 发表经典论文
2000 年后成为机器学习主流算法之一

数学原理

线性可分情况

寻找最优分离超平面

优化目标:最大化间隔

软间隔与松弛变量

对于线性不可分数据,引入松弛变量

其中 是惩罚参数,控制分类错误的容忍度。

核技巧

通过核函数 将数据映射到高维空间:

常用核函数:

核函数公式
线性核
多项式核
RBF 核

适用场景

场景适用性备注
小样本数据★★★★★SVM 的优势领域
高维数据★★★★☆文本分类、基因分析
非线性问题★★★★☆需配合核函数
大规模数据★★☆☆☆训练复杂度 O(n²)~O(n³)

实践指南

数据预处理

  1. 标准化:SVM 对特征尺度敏感
  2. 特征选择:高维数据可考虑 PCA 降维

参数调优

from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
 
param_grid = {
    'C': [0.1, 1, 10],
    'gamma': [0.01, 0.1, 1],
    'kernel': ['rbf', 'linear']
}
grid_search = GridSearchCV(SVC(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

代码示例

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
 
iris = datasets.load_iris()
X, y = iris.data, iris.target
 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
 
clf = SVC(kernel='rbf', C=1.0, gamma='scale')
clf.fit(X_train, y_train)
 
print("Accuracy:", clf.score(X_test, y_test))

常见问题

Q:如何选择核函数?

A:线性核适合高维数据,RBF 核适合低维非线性数据。

Q:SVM 对缺失值敏感吗?

A:非常敏感,需要提前处理缺失值。

参考文献

  1. Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning.
  2. scikit-learn SVM 文档