支持向量机实战:从二分类训练样本解析到Python实现

1次阅读
没有评论

共计 2194 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

一、从玩具数据集理解 SVM 核心思想

我们先看这个简单的二维数据集:

支持向量机实战:从二分类训练样本解析到 Python 实现

  • 正类样本(标签 +1):(1,2)、(2,3)、(3,3)
  • 负类样本(标签 -1):(2,1)

用 matplotlib 绘制散点图可以看到:

import matplotlib.pyplot as plt

X = [[1,2], [2,3], [3,3], [2,1]]
y = [1, 1, 1, -1]

plt.scatter(*zip(*X[:3]), c='red', label='Positive')
plt.scatter(*zip(*X[3:]), c='blue', label='Negative')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.grid()

通过可视化可以直观发现: 这些样本是线性可分的 。SVM 要做的就是找到那个 ” 最公平 ” 的分界线——让正负类样本到决策边界的距离(间隔)最大化。

二、数学原理与公式推导

1. 决策函数

SVM 的决策函数为:

f(x) = sign(w·x + b)

其中 w 是法向量,b 是偏置项。优化目标是:

min 1/2 ||w||²
s.t. y_i(w·x_i + b) ≥ 1

2. 对偶问题

通过拉格朗日乘子法转化为对偶问题:

max Σα_i - 1/2 ΣΣα_iα_j y_i y_j x_i·x_j
s.t. α_i ≥ 0, Σα_i y_i = 0

三、Python 实战实现

1. 基础建模流程

from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler

# 数据标准化(重要!)scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 线性核 SVM
model = SVC(kernel='linear', C=1.0)
model.fit(X_scaled, y)

# 绘制决策边界
def plot_decision_boundary(model):
    # 获取坐标轴范围
    x_min, x_max = X_scaled[:,0].min()-1, X_scaled[:,0].max()+1
    y_min, y_max = X_scaled[:,1].min()-1, X_scaled[:,1].max()+1

    # 生成网格点
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))

    # 预测并绘制
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.4)
    plt.scatter(X_scaled[:,0], X_scaled[:,1], c=y)

plot_decision_boundary(model)

2. 不同核函数对比

# 尝试 RBF 核
model_rbf = SVC(kernel='rbf', gamma=0.5)
model_rbf.fit(X_scaled, y)

# 可视化对比
plt.figure(figsize=(12,4))
plt.subplot(121)
plot_decision_boundary(model)  # 线性核
plt.title('Linear Kernel')

plt.subplot(122)
plot_decision_boundary(model_rbf)  # RBF 核
plt.title('RBF Kernel')

四、关键问题深入分析

1. 正则化参数 C 的影响

  • C 值小:容忍更多误分类,间隔更大
  • C 值大:严格要求分类正确,可能过拟合
for C in [0.1, 1, 10]:
    model = SVC(kernel='linear', C=C).fit(X_scaled, y)
    plot_decision_boundary(model)
    plt.title(f'C={C}')
    plt.show()

2. 支持向量的意义

# 获取支持向量
print(model.support_vectors_)  # 标准化后的坐标
print(model.support_)  # 支持向量的索引 

支持向量是决定决策边界的关键样本,它们位于间隔边界上。

五、生产环境注意事项

  1. 特征缩放必须做 :SVM 对特征尺度敏感
  2. 大数据量优化
  3. 使用 LinearSVC 替代 SVC(kernel=’linear’)
  4. 考虑随机梯度下降的 SGDClassifier
  5. 类别不平衡
  6. 设置 class_weight 参数
  7. 采用过采样 / 欠采样

六、思考与扩展

如何将这个方法扩展到高维空间?实际上 sklearn 已经帮我们处理了:

# 处理高维数据(如 100 维)from sklearn.datasets import make_classification

X_high, y_high = make_classification(n_features=100, n_classes=2)
svc = SVC(kernel='rbf').fit(X_high, y_high)

核心区别在于:高维空间中我们无法可视化决策边界,但数学原理完全一致。当特征维度远大于样本量时,建议使用线性核避免维度灾难。

通过这个小案例,我们完整走过了 SVM 从理论推导到工程实现的全部流程。建议读者尝试修改样本数据,观察决策边界的变化,这能帮助你形成更直观的理解。

正文完
 0
评论(没有评论)