张芷铭的个人博客

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

概述

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

发展历程

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

数学原理

线性可分情况

寻找最优分离超平面

$$w^Tx + b = 0$$

优化目标:最大化间隔

$$\max \frac{2}{|w|} \quad \text{s.t.} \quad y_i(w^Tx_i + b) \geq 1$$

软间隔与松弛变量

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

$$\min \frac{1}{2}|w|^2 + C\sum_{i=1}^n \xi_i$$

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

核技巧

通过核函数 $\phi(x)$ 将数据映射到高维空间:

$$K(x_i, x_j) = \phi(x_i)^T\phi(x_j)$$

常用核函数:

核函数公式
线性核$K(x_i, x_j) = x_i^Tx_j$
多项式核$K(x_i, x_j) = (x_i^Tx_j + c)^d$
RBF 核$K(x_i, x_j) = \exp(-\gamma|x_i - x_j|^2)$

适用场景

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

实践指南

数据预处理

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

参数调优

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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)

代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 文档

Comments