机器学习(5)——支持向量机

发布于:2025-04-14 ⋅ 阅读:(22) ⋅ 点赞:(0)

1. 支持向量机(SVM)是什么?

支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面,使得不同类别的样本间隔(Margin)最大化,从而提高模型的泛化能力。

2. SVM的基本原理

2.1. 核心思想

  • 目标: 在特征空间中找到一个超平面(决策边界),使得两类样本的间隔最大化
  • 关键概念:
    • 支持向量(Support Vectors): 距离超平面最近的样本点,决定超平面的位置。这些点在定义分类边界时起着至关重要的作用,因此称为“支持向量”
    • 间隔(Margin): 支持向量到超平面的距离,越大表示分类器鲁棒性越强。SVM通过最大化这个间隔来选择最佳超平面。

3. 线性可分和非线性可分

  • 线性可分: 如果数据可以通过一个直线(二维空间)或超平面(高维空间)分开,则称数据是线性可分的。在这种情况下,SVM能够找到一个线性决策边界。

  • 非线性可分: 当数据不是线性可分时,我们可以通过核函数将数据映射到更高维的空间,使得在这个高维空间中数据变得线性可分。这个过程称为核技巧。

4. SVM的数学基础

4.1. 线性可分情况(硬间隔 SVM)

4.1.1. 间隔最大化

  • 在二维空间中,我们用一个线性决策边界(直线)来将数据分开。假设数据点可以被线性分开,则可以表示为:
    w ⋅ x + b = 0 w⋅x+b=0 wx+b=0

  • 其中:

    • w w w 是法向量,决定超平面的方向。
    • b b b 是偏置项,控制超平面与原点的距离。
    • x x x 是数据点。
  • 目标是找到一个决策边界,使得不同类别的数据点到该边界的距离尽量远。最大化间隔可以转化为如下的优化问题:

m a x i m i z e 2 ∥ w ∥ maximize \frac{2}{\|w\|} maximizew2

  • 其中, ∥ w ∥ \|w\| w是法向量的范数,优化的目标是使这个范数最小化,从而间隔最大化。

4.1.2. SVM 的优化目标

  • 假设数据线性可分,SVM 的优化目标是:
    最大化间隔 等价于 最小化 1 2 ∥ w ∥ 2 最大化间隔 \ 等价于 \ 最小化 \frac {1}{2}\|w\|^2 最大化间隔 等价于 最小化21w2

  • 约束条件: y i ( w T x i + b ) ≥ 1 , ∀ i y_i(w^T x_i + b) \geq 1, \quad \forall i yi(wTxi+b)1,i

  • 其中

    • w w w:是法向量。
    • b b b :是偏置项。
    • y i ∈ − 1 , + 1 y_i∈{−1,+1} yi1,+1:样本标签。
  • 几何解释:

    • 超平面方程: w T x + b = 0 w^Tx+b=0 wTx+b=0

    • 支持向量满足 y i ( w T x i + b ) = 1 y_i(w ^Tx_i +b)=1 yi(wTxi+b)=1

3. 线性不可分情况(软间隔 SVM)

当数据存在噪声或轻微重叠时,引入松弛变量(Slack Variables) ξ i ≥ 0 \xi_i≥0 ξi0,允许部分样本违反约束:
最大化间隔 等价于 min ⁡ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i 最大化间隔 \ 等价于 \min \frac{1}{2} \|w\|^2 + C \sum_{i=1}^{N} \xi_i 最大化间隔 等价于min21w2+Ci=1Nξi

  • ξ i \xi_i ξi是松弛变量,表示第 i i i个样本点与分类边界的偏差。

约束条件:
y i ( w T x i + b ) ≥ 1 − ξ i , ξ i ≥ 0 y_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i≥0 yi(wTxi+b)1ξi,ξi0

  • 参数 C C C:控制分类严格性:

    • C C C 大 → 更严格(可能过拟合)。

    • C C C 小 → 允许更多错误(提高泛化性)。

4. 非线性 SVM(核方法)

当数据非线性可分时,通过核函数(Kernel)将数据映射到高维空间,使其线性可分。

常用核函数

  • 线性核(无映射):
    K ( x i , x j ) = x i T x j K(x_i, x_j) = x_i^T x_j K(xi,xj)=xiTxj
  • 线性核(无映射):
    K ( x i , x j ) = ( x i T x j + c ) d K(x_i, x_j) = (x_i^T x_j + c)^d K(xi,xj)=(xiTxj+c)d
  • 高斯核(RBF)(最常用):
    K ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp \left( -\frac{\|x_i - x_j\|^2}{2\sigma^2} \right) K(xi,xj)=exp(2σ2xixj2)
    • σ 控制样本间影响范围(小 → 过拟合,大 → 欠拟合)。
  • Sigmoid 核:
    K ( x i , x j ) = tanh ⁡ ( α x i T x j + c ) K(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) K(xi,xj)=tanh(αxiTxj+c)

核技巧(Kernel Trick)

  • 无需显式计算高维映射 ϕ ( x ) ϕ(x) ϕ(x),直接通过核函数计算内积:
    ϕ ( x i ) T ϕ ( x j ) = K ( x i , x j ) \phi(x_i)^T \phi(x_j) = K(x_i, x_j) ϕ(xi)Tϕ(xj)=K(xi,xj)

5. 优化方法(对偶问题)

原始问题转化为拉格朗日对偶问题,通过求解:
max ⁡ α ∑ i = 1 n α i − 1 2 ∑ i , j α i α j y i y j K ( x i , x j ) \max_{\alpha} \sum_{i=1}^{n} \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j K(x_i, x_j) αmaxi=1nαi21i,jαiαjyiyjK(xi,xj)
约束:
∑ i = 1 n α i y i = 0 , 0 ≤ α i ≤ C \sum_{i=1}^{n} \alpha_i y_i = 0, \quad 0 \leq \alpha_i \leq C i=1nαiyi=0,0αiC

α i α_i αi:拉格朗日乘子,非零 α i α_i αi 对应支持向量。

最终决策函数:
f ( x ) = sign ( ∑ i ∈ S V α i y i K ( x i , x ) + b ) f(x) = \text{sign} \left( \sum_{i \in SV} \alpha_i y_i K(x_i, x) + b \right) f(x)=sign(iSVαiyiK(xi,x)+b)

6. 优缺点

  • ✅ 优点

    • 高维数据有效(尤其适合文本、图像)。

    • 核方法处理非线性问题。

    • 泛化能力强(最大化间隔)。

    • 对过拟合有一定鲁棒性(通过 C C C 控制)。

  • ❌ 缺点

    • 计算复杂度高(训练时间随样本数增长)。

    • 对参数( C C C、核参数)敏感。

    • 不直接提供概率输出(需额外校准)。

7. Python 示例(Scikit-learn)

7.1. 线性 SVM

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 训练线性SVM(C=1.0)
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)

# 评估
print("Accuracy:", model.score(X_test, y_test))

7.2. 非线性 SVM(RBF 核)

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

# 标准化数据
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 训练RBF核SVM(C=1.0, gamma='scale')
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)

# 预测
print("Accuracy:", model.score(X_test_scaled, y_test))

7.3. 支持向量可视化

import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay

# 仅用前两特征简化可视化
X_2d = X[:, :2]
model = SVC(kernel='linear').fit(X_2d, y)

disp = DecisionBoundaryDisplay.from_estimator(
    model, X_2d, response_method="predict",
    plot_method="pcolormesh", alpha=0.3,
)
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, edgecolor='k')
plt.title("SVM Decision Boundary")
plt.show()

8. 关键参数调优

  • C C C:平衡分类严格性与泛化能力。

    • 网格搜索:GridSearchCV(param_grid={‘C’: [0.1, 1, 10]})
  • 核函数选择

    • 线性:kernel=‘linear’

    • RBF:kernel=‘rbf’(需调 gamma)

  • γ γ γ(RBF核):

    • 小 → 决策边界平滑,大 → 复杂(过拟合风险)。

9. 总结

  • SVM 核心:最大化间隔的超平面,支持核方法处理非线性。

  • 关键参数:

    • 正则化参数 C C C

    • 核函数类型(RBF/线性/多项式)。

    • RBF 核的 γ γ γ

  • 适用场景:

    • 中小规模高维数据(如文本分类、图像识别)。

    • 需强泛化能力的分类任务。