共计 2014 个字符,预计需要花费 6 分钟才能阅读完成。
支持向量机 (SVM) 实战:从数学原理到 Python 实现
支持向量机(SVM)在分类任务中具有独特优势,主要体现在它是最大间隔分类器,能够有效处理高维数据,并且通过核技巧可以解决非线性分类问题。接下来,我们将从数学原理到 Python 实现,一步步解析 SVM 的核心机制和实际应用。

数学原理
硬间隔与软间隔
在理想情况下,数据是线性可分的,这时我们可以使用硬间隔 SVM。其优化目标是找到最大间隔超平面,数学表达为:
$$
\min_{w,b} \frac{1}{2}||w||^2 \quad \text{s.t.} \quad y_i(w^T x_i + b) \geq 1, \forall i
$$
然而,现实中的数据往往存在噪声或非线性可分的情况。为此,引入松弛变量 ξ,允许部分样本违反约束条件,形成软间隔 SVM:
$$
\min_{w,b,\xi} \frac{1}{2}||w||^2 + C \sum_{i=1}^n \xi_i \quad \text{s.t.} \quad y_i(w^T x_i + b) \geq 1 – \xi_i, \xi_i \geq 0, \forall i
$$
其中,C 是正则化参数,控制对误分类的惩罚力度。
对偶问题转换
通过拉格朗日乘子法,原始问题可以转化为对偶问题:
$$
\max_{\alpha} \sum_{i=1}^n \alpha_i – \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j x_i^T x_j \quad \text{s.t.} \quad 0 \leq \alpha_i \leq C, \sum_{i=1}^n \alpha_i y_i = 0
$$
求解对偶问题更高效,并且可以自然地引入核函数。
核函数技巧
核函数允许我们在高维特征空间中隐式地进行计算,避免显式映射。常见的核函数包括线性核、多项式核和高斯核(RBF)。数学上,核函数对应再生核希尔伯特空间(RKHS)的映射:
$$
K(x_i, x_j) = \langle \phi(x_i), \phi(x_j) \rangle
$$
其中 φ 是特征映射函数。
Python 实现
数据准备与标准化
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 加载数据
iris = datasets.load_iris()
X = iris.data[:, :2] # 取前两个特征
Y = iris.target
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X_scaled, Y, test_size=0.3, random_state=42)
模型训练与调参
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'C': [0.1, 1, 10, 100],
'gamma': ['scale', 'auto', 0.1, 1],
'kernel': ['rbf', 'poly']
}
# 创建 SVM 模型
svm = SVC()
# 网格搜索
grid_search = GridSearchCV(svm, param_grid, cv=5, n_jobs=-1)
grid_search.fit(X_train, Y_train)
# 最佳参数
print("Best parameters:", grid_search.best_params_)
模型评估
from sklearn.metrics import classification_report
# 预测
y_pred = grid_search.predict(X_test)
# 评估
print(classification_report(Y_test, y_pred))
避坑指南
样本不均衡
当数据类别不平衡时,可以通过设置 class_weight 参数调整各类别的权重:
svm = SVC(class_weight='balanced')
高维数据内存优化
对于高维数据,计算核矩阵可能消耗大量内存。可以使用 kernel='linear' 或减小 gamma 值来降低计算复杂度。
适用场景对比
- SVM:适合小样本、高维数据,尤其是特征数大于样本数时。
- 逻辑回归:适合大规模数据,计算效率高,但需要特征线性可分。
- 随机森林:适合特征间存在复杂交互的情况,对缺失值不敏感。
思考题
- 如何证明 RBF 核对应的特征空间是无限维?
- 当特征数远大于样本数时,应该选择线性核还是 RBF 核?
- 为什么 SVM 对缺失值敏感?
希望这篇文章能帮助你深入理解 SVM 的原理和实现,并在实际项目中灵活应用。如果有任何问题,欢迎在评论区讨论!
