共计 2004 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
支持向量机(SVM)是一种经典的监督学习算法,主要用于分类和回归任务。它的核心思想是找到一个最优的超平面,将不同类别的数据点分开,并且使得两类数据点到这个超平面的距离(称为“间隔”)最大化。SVM 在处理小样本、高维数据时表现优异,广泛应用于文本分类、图像识别等领域。

数据可视化
在开始建模之前,我们首先需要了解数据的分布情况。使用 Python 的 matplotlib 库可以轻松绘制样本点的分布:
import matplotlib.pyplot as plt
# 定义样本数据
positive_samples = [(1, 2), (2, 3), (3, 3)]
negative_samples = [(2, 1)]
# 绘制正类样本点
x_pos, y_pos = zip(*positive_samples)
plt.scatter(x_pos, y_pos, color='blue', label='Positive (+1)')
# 绘制负类样本点
x_neg, y_neg = zip(*negative_samples)
plt.scatter(x_neg, y_neg, color='red', label='Negative (-1)')
# 添加图例和标签
plt.legend()
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Sample Data Distribution')
plt.grid(True)
plt.show()
运行这段代码后,你会看到正类样本点(蓝色)集中在右上角,而负类样本点(红色)位于左下角。这种清晰的分布有助于我们理解 SVM 如何找到最优分类边界。
模型构建
线性 SVM 的目标是找到一个超平面(在二维空间中是一条直线),使得正类和负类样本点到这个超平面的距离最大化。这个超平面的方程可以表示为:
w1*x1 + w2*x2 + b = 0
其中,w1和 w2 是权重,b是偏置项。支持向量是距离超平面最近的样本点,它们决定了超平面的位置和方向。
代码实现
以下是使用 scikit-learn 实现线性 SVM 的完整代码:
from sklearn import svm
import numpy as np
# 准备数据
X = np.array([[1, 2], [2, 3], [3, 3], [2, 1]]) # 特征
Y = np.array([1, 1, 1, -1]) # 标签
# 创建 SVM 模型
model = svm.SVC(kernel='linear')
# 训练模型
model.fit(X, Y)
# 打印支持向量
print("Support Vectors:", model.support_vectors_)
# 打印权重和偏置
print("Weights:", model.coef_)
print("Bias:", model.intercept_)
这段代码首先定义了特征矩阵 X 和标签向量Y,然后创建了一个线性核的 SVM 模型。训练完成后,我们可以查看支持向量、权重和偏置项。
核函数选择
SVM 的性能很大程度上依赖于核函数的选择。常见的核函数包括:
- 线性核(
linear):适用于线性可分的数据。 - 多项式核(
poly):适用于非线性数据,但需要调整多项式的阶数。 - RBF 核(
rbf):也称为高斯核,适用于复杂的非线性数据。
对于本案例中的简单数据,线性核已经足够。但如果数据更复杂,可以尝试其他核函数。
参数调优
SVM 有一些重要的超参数需要优化,例如惩罚系数 C 和核函数的参数(如 RBF 核的gamma)。我们可以使用网格搜索(Grid Search)来自动寻找最优参数组合:
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'C': [0.1, 1, 10], 'gamma': [0.1, 1, 10]}
# 创建网格搜索对象
grid = GridSearchCV(svm.SVC(kernel='rbf'), param_grid, refit=True)
# 执行网格搜索
grid.fit(X, Y)
# 打印最优参数
print("Best Parameters:", grid.best_params_)
避坑指南
- 数据标准化:SVM 对特征的尺度敏感,因此在训练前最好对数据进行标准化处理。
- 类别不平衡 :如果正负样本数量差异过大,可以考虑设置
class_weight参数来平衡类别权重。 - 核函数选择:对于线性可分的数据,优先使用线性核;对于复杂数据,可以尝试 RBF 核。
扩展思考
掌握了 SVM 的基本原理和实现方法后,你可以尝试在其他数据集上应用 SVM,例如鸢尾花数据集或手写数字识别数据集。这些数据集规模更大,特征更多,能够帮助你更深入地理解 SVM 的实际应用。
进一步学习资源推荐
- 《统计学习方法》——李航
- Scikit-learn 官方文档
- Coursera 上的机器学习课程(Andrew Ng)
希望这篇教程能帮助你快速入门 SVM,并为后续的机器学习学习打下坚实基础!
