1. 支持向量机(SVM)是什么?
支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面,使得不同类别的样本间隔(Margin)最大化,从而提高模型的泛化能力。
2. SVM的基本原理
2.1. 核心思想
- 目标: 在特征空间中找到一个超平面(决策边界),使得两类样本的间隔最大化。
- 关键概念:
- 支持向量(Support Vectors): 距离超平面最近的样本点,决定超平面的位置。这些点在定义分类边界时起着至关重要的作用,因此称为“支持向量”
- 间隔(Margin): 支持向量到超平面的距离,越大表示分类器鲁棒性越强。SVM通过最大化这个间隔来选择最佳超平面。
3. 线性可分和非线性可分
线性可分: 如果数据可以通过一个直线(二维空间)或超平面(高维空间)分开,则称数据是线性可分的。在这种情况下,SVM能够找到一个线性决策边界。
非线性可分: 当数据不是线性可分时,我们可以通过核函数将数据映射到更高维的空间,使得在这个高维空间中数据变得线性可分。这个过程称为核技巧。
4. SVM的数学基础
4.1. 线性可分情况(硬间隔 SVM)
4.1.1. 间隔最大化
在二维空间中,我们用一个线性决策边界(直线)来将数据分开。假设数据点可以被线性分开,则可以表示为:
w ⋅ x + b = 0 w⋅x+b=0 w⋅x+b=0其中:
- w w w 是法向量,决定超平面的方向。
- b b b 是偏置项,控制超平面与原点的距离。
- x x x 是数据点。
目标是找到一个决策边界,使得不同类别的数据点到该边界的距离尽量远。最大化间隔可以转化为如下的优化问题:
m a x i m i z e 2 ∥ w ∥ maximize \frac{2}{\|w\|} maximize∥w∥2
- 其中, ∥ w ∥ \|w\| ∥w∥是法向量的范数,优化的目标是使这个范数最小化,从而间隔最大化。
4.1.2. SVM 的优化目标
假设数据线性可分,SVM 的优化目标是:
最大化间隔 等价于 最小化 1 2 ∥ w ∥ 2 最大化间隔 \ 等价于 \ 最小化 \frac {1}{2}\|w\|^2 最大化间隔 等价于 最小化21∥w∥2约束条件: y i ( w T x i + b ) ≥ 1 , ∀ i y_i(w^T x_i + b) \geq 1, \quad \forall i yi(wTxi+b)≥1,∀i
其中
- w w w:是法向量。
- b b b :是偏置项。
- y i ∈ − 1 , + 1 y_i∈{−1,+1} yi∈−1,+1:样本标签。
几何解释:
超平面方程: w T x + b = 0 w^Tx+b=0 wTx+b=0。
支持向量满足 y i ( w T x i + b ) = 1 y_i(w ^Tx_i +b)=1 yi(wTxi+b)=1。
3. 线性不可分情况(软间隔 SVM)
当数据存在噪声或轻微重叠时,引入松弛变量(Slack Variables) ξ i ≥ 0 \xi_i≥0 ξi≥0,允许部分样本违反约束:
最大化间隔 等价于 min 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i 最大化间隔 \ 等价于 \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^{N} \xi_i 最大化间隔 等价于min21∥w∥2+Ci=1∑Nξi
- ξ i \xi_i ξi是松弛变量,表示第 i i i个样本点与分类边界的偏差。
约束条件:
y i ( w T x i + b ) ≥ 1 − ξ i , ξ i ≥ 0 y_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i≥0 yi(wTxi+b)≥1−ξi,ξi≥0
参数 C C C:控制分类严格性:
C C C 大 → 更严格(可能过拟合)。
C C C 小 → 允许更多错误(提高泛化性)。
4. 非线性 SVM(核方法)
当数据非线性可分时,通过核函数(Kernel)将数据映射到高维空间,使其线性可分。
常用核函数
- 线性核(无映射):
K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi,xj)=xiTxj - 线性核(无映射):
K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi,xj)=(xiTxj+c)d - 高斯核(RBF)(最常用):
K ( x i , x j ) = exp ( − ∥ x i − x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp \left( -\frac{\|x_i - x_j\|^2}{2\sigma^2} \right) K(xi,xj)=exp(−2σ2∥xi−xj∥2)- σ 控制样本间影响范围(小 → 过拟合,大 → 欠拟合)。
- Sigmoid 核:
K ( x i , x j ) = tanh ( α x i T x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) K(xi,xj)=tanh(αxiTxj+c)
核技巧(Kernel Trick)
- 无需显式计算高维映射 ϕ ( x ) ϕ(x) ϕ(x),直接通过核函数计算内积:
ϕ ( x i ) T ϕ ( x j ) = K ( x i , x j ) \phi(x_i)^T \phi(x_j) = K(x_i, x_j) ϕ(xi)Tϕ(xj)=K(xi,xj)
5. 优化方法(对偶问题)
原始问题转化为拉格朗日对偶问题,通过求解:
max α ∑ i = 1 n α i − 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) \max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j K(x_i, x_j) αmaxi=1∑nαi−21i,j∑αiαjyiyjK(xi,xj)
约束:
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C \sum_{i=1}^{n} \alpha_i y_i = 0, \quad 0 \leq \alpha_i \leq C i=1∑nαiyi=0,0≤αi≤C
α i α_i αi:拉格朗日乘子,非零 α i α_i αi 对应支持向量。
最终决策函数:
f ( x ) = sign ( ∑ i ∈ S V α i y i K ( x i , x ) + b ) f(x) = \text{sign} \left( \sum_{i \in SV} \alpha_i y_i K(x_i, x) + b \right) f(x)=sign(i∈SV∑αiyiK(xi,x)+b)
6. 优缺点
✅ 优点
高维数据有效(尤其适合文本、图像)。
核方法处理非线性问题。
泛化能力强(最大化间隔)。
对过拟合有一定鲁棒性(通过 C C C 控制)。
❌ 缺点
计算复杂度高(训练时间随样本数增长)。
对参数( C C C、核参数)敏感。
不直接提供概率输出(需额外校准)。
7. Python 示例(Scikit-learn)
7.1. 线性 SVM
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练线性SVM(C=1.0)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)
# 评估
print("Accuracy:", model.score(X_test, y_test))
7.2. 非线性 SVM(RBF 核)
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
# 标准化数据
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 训练RBF核SVM(C=1.0, gamma='scale')
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)
# 预测
print("Accuracy:", model.score(X_test_scaled, y_test))
7.3. 支持向量可视化
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
# 仅用前两特征简化可视化
X_2d = X[:, :2]
model = SVC(kernel='linear').fit(X_2d, y)
disp = DecisionBoundaryDisplay.from_estimator(
model, X_2d, response_method="predict",
plot_method="pcolormesh", alpha=0.3,
)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolor='k')
plt.title("SVM Decision Boundary")
plt.show()
8. 关键参数调优
C C C:平衡分类严格性与泛化能力。
- 网格搜索:GridSearchCV(param_grid={‘C’: [0.1, 1, 10]})
核函数选择:
线性:kernel=‘linear’
RBF:kernel=‘rbf’(需调 gamma)
γ γ γ(RBF核):
- 小 → 决策边界平滑,大 → 复杂(过拟合风险)。
9. 总结
SVM 核心:最大化间隔的超平面,支持核方法处理非线性。
关键参数:
正则化参数 C C C。
核函数类型(RBF/线性/多项式)。
RBF 核的 γ γ γ。
适用场景:
中小规模高维数据(如文本分类、图像识别)。
需强泛化能力的分类任务。