支持向量机实战:从二分类问题到最优超平面求解

1次阅读
没有评论

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

image.webp

问题描述与 SVM 基础

我们有以下两类训练样本:

支持向量机实战:从二分类问题到最优超平面求解

  • 类别 +1:(1,2), (2,3), (3,3)
  • 类别 -1:(2,1)

支持向量机 (SVM) 的核心思想是找到一个最优超平面,使得两类样本间的间隔 (margin) 最大化。这个超平面可以表示为:

$$w^Tx + b = 0$$

其中 $w$ 是法向量,$b$ 是偏置项。对于线性可分的情况,我们使用硬间隔 SVM。

硬间隔 SVM 数学推导

  1. 间隔定义:样本点到超平面的距离为 $\frac{|w^Tx_i + b|}{|w|}$,我们需要最大化最小距离。

  2. 优化目标
    $$\min_{w,b} \frac{1}{2}|w|^2$$
    约束条件:
    $$y_i(w^Tx_i + b) \geq 1, \forall i$$

  3. 拉格朗日函数
    $$L(w,b,\alpha) = \frac{1}{2}|w|^2 – \sum_{i=1}^n \alpha_i[y_i(w^Tx_i + b) – 1]$$

  4. 对偶问题:通过对 $w$ 和 $b$ 求偏导并代入,得到对偶形式:
    $$\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$$
    约束:
    $$\alpha_i \geq 0, \sum_{i=1}^n \alpha_i y_i = 0$$

Python 实现

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 模型(线性核)
clf = svm.SVC(kernel='linear', C=1000)  # 大 C 值近似硬间隔
clf.fit(X, y)

# 获取超平面参数
w = clf.coef_[0]
b = clf.intercept_[0]
print(f"超平面方程: {w[0]:.2f}x1 + {w[1]:.2f}x2 + {b:.2f} = 0")

核函数比较

SVM 的强大之处在于可以通过核函数处理非线性问题:

  1. 线性核:适用于线性可分情况

    svm.SVC(kernel='linear')

  2. 多项式核

    svm.SVC(kernel='poly', degree=3)

  3. RBF 核(默认):

    svm.SVC(kernel='rbf', gamma='scale')

实战经验

  1. 样本不平衡处理
  2. 使用 class_weight 参数
  3. 上采样 / 下采样

  4. 参数 C 的选择

  5. 小 C:允许更多误分类,模型更简单
  6. 大 C:严格分类,可能过拟合

  7. 特征缩放

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)

生产环境最佳实践

  1. 模型压缩 :对于线性 SVM,使用LinearSVC 替代 SVC 提高速度

  2. 增量学习:大数据集使用partial_fit

  3. 模型持久化

    from joblib import dump
    dump(clf, 'svm_model.joblib')

思考题

  1. 当训练数据中存在噪声点时,硬间隔 SVM 会遇到什么问题?如何解决?
  2. 为什么 RBF 核函数在实际应用中表现往往优于多项式核?
  3. 在大规模数据集上应用 SVM 时,有哪些计算效率优化策略?

通过这个小例子,我们完整走过了从理论推导到实践应用的 SVM 学习路径。建议读者尝试修改样本数据,观察决策边界的变化,这是理解 SVM 工作机制的最佳方式。

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