共计 1692 个字符,预计需要花费 5 分钟才能阅读完成。
支持向量机 (SVM) 核心原理
支持向量机是一种强大的监督学习算法,特别适合解决分类问题。它的核心思想是找到一个最优的超平面,将不同类别的数据点分开。

线性可分情况
当数据线性可分时,SVM 的目标是找到那个 ” 最宽 ” 的间隔 (margin) 来分隔两类数据。这个最优超平面由距离它最近的几个数据点决定,这些点被称为支持向量(support vectors)。
数学上,这可以表示为求解以下优化问题:
minimize 1/2||w||²
subject to y_i(w·x_i + b) ≥ 1
其中 w 是超平面的法向量,b 是偏移量。
处理非线性问题
现实中很多数据不是线性可分的。SVM 通过核技巧 (kernel trick) 解决这个问题:
- 将原始特征映射到高维空间
- 在高维空间中寻找线性分割超平面
- 使用核函数避免显式计算高维特征
常用的核函数包括:
- 线性核
- 多项式核
- 高斯径向基函数 (RBF) 核
- Sigmoid 核
SVM 与其他算法的比较
与逻辑回归、决策树等算法相比,SVM 有这些特点:
- 在高维空间中表现优异
- 对非线性问题处理能力强
- 对小样本数据集效果好
- 但对大规模数据训练速度较慢
- 对参数和核函数选择敏感
Python 实战示例
以下是使用 scikit-learn 实现 SVM 的完整代码:
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.model_selection import GridSearchCV
# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 取前两个特征简化问题
y = iris.target
# 数据预处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练 SVM 模型
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)
# 评估模型
print(classification_report(y_test, model.predict(X_test)))
# 超参数调优
param_grid = {'C': [0.1, 1, 10, 100],
'gamma': [1, 0.1, 0.01, 0.001],
'kernel': ['rbf', 'linear', 'poly']
}
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2)
grid.fit(X_train, y_train)
print(f"最佳参数: {grid.best_params_}")
性能优化建议
- 特征缩放:SVM 对特征尺度敏感,务必进行标准化或归一化
- 核函数选择:
- 线性核:特征多、样本少
- RBF 核:特征少、样本多
- 多项式核:特定领域知识支持
- 大数据集处理:
- 使用线性核
- 减小训练集规模
- 尝试随机梯度下降的 SVM 实现
常见问题与解决方案
类别不平衡
- 调整类别权重
- 对少数类过采样或多数类欠采样
- 使用不同的评价指标(如 F1-score)
过拟合
- 正则化参数 C 不要过大
- 选择合适的核函数
- 增加训练数据
诊断方法
- 检查支持向量数量
- 绘制决策边界
- 分析错误分类样本
后续实践建议
- 尝试在不同数据集上测试各种核函数效果
- 使用网格搜索优化超参数
- 对比 SVM 与其他算法的性能
- 探索多类分类问题的解决方案
通过本文介绍,你应该已经掌握了 SVM 的基本原理和 Python 实现方法。SVM 是一个强大但需要仔细调参的工具,实践中需要多尝试不同配置才能获得最佳效果。
正文完
发表至: 机器学习
近一天内
