[机器学习]svm(核函数)

1,173 阅读4分钟

支持向量机(SVM)核函数详解与选择指南

在 SVM 中,核函数(Kernel Function) 用于将数据映射到高维空间,解决线性不可分问题。

常用的核函数包括 线性核高斯核(RBF)多项式核

它们的核心区别在于 映射方式模型复杂度,选择需结合数据特性和任务需求。


1. 核函数的区别

核函数数学公式核心特点适用场景
线性核K(xi,xj)=xi⋅xjK(xi​,xj​)=xi​⋅xj​直接计算原始空间内积,不进行非线性映射。数据线性可分或高维稀疏数据(如文本分类)。
高斯核(RBF)K(xi,xj)=e−γ∥xi−xj∥2K(xi​,xj​)=e−γ∥xi​−xj​∥2将数据映射到无限维空间,通过 γγ 控制模型复杂度。非线性可分数据(如图像、复杂模式分类)。
多项式核K(xi,xj)=(xi⋅xj+c)dK(xi​,xj​)=(xi​⋅xj​+c)d通过多项式阶数 dd 显式控制特征组合复杂度,适合非线性但规律性较强的数据。中等复杂度的非线性问题(需调整 dd 和 cc)。

2. 核函数的特点与选择依据

(1) 线性核(Linear Kernel)
  • 优点

    • 计算速度快,无额外超参数(如 γγ 或 dd)。
    • 适合高维数据(如文本分类),避免维度灾难。
  • 缺点

    • 无法处理非线性可分问题。
  • 适用场景

    • 特征数量远大于样本数(如 NLP 中的词向量)。
    • 数据本身线性可分(可通过可视化或统计验证)。
(2) 高斯核(RBF Kernel)
  • 优点

    • 万能核函数,适用于大多数非线性问题。
    • 通过 γγ 灵活控制决策边界复杂度(γγ 越大,模型越复杂)。
  • 缺点

    • 计算复杂度高(O(n2)O(n2)),大数据集训练慢。
    • 需要调整 γγ 和 CC,调参成本高。
  • 适用场景

    • 低维非线性数据(如二维平面上的环形分布)。
    • 样本量适中(千级以内)。
(3) 多项式核(Polynomial Kernel)
  • 优点

    • 通过 dd 显式控制特征组合的复杂度。
    • 可解释性略优于 RBF(多项式形式明确)。
  • 缺点

    • 高阶 (d>3d>3) 易导致过拟合。
    • 对参数 dd 和 cc 敏感,调参难度高。
  • 适用场景

    • 数据具有明显的多项式规律(如物理实验数据)。
    • 需要控制模型复杂度(通过固定 dd)。

3. 核函数选择流程

  1. 初步判断数据特性

    • 可视化数据分布,观察是否线性可分。
    • 计算特征间的交互关系(如相关系数)。
  2. 尝试线性核

    • 若线性核效果足够好(如准确率 >90%),优先使用。
    • 若效果差,转用 RBF 或多项式核。
  3. 复杂数据选择 RBF 核

    • RBF 是默认推荐核函数,尤其当数据非线性且无先验知识时。

    • 调整 γγ:

      • 小 γγ → 决策边界平滑(欠拟合)。
      • 大 γγ → 决策边界复杂(过拟合)。
  4. 特定场景使用多项式核

    • 当数据具有显式多项式关系时(如 y=x12+x22y=x12​+x22​)。
    • 选择较低的 dd(如 2 或 3),避免过拟合。
  5. 调参优化

    • 使用网格搜索(GridSearchCV)联合优化 CC 和核参数(如 γγ 或 dd)。
    • 注意标准化数据(RBF 和多项式核对特征尺度敏感)。

4. 代码示例:不同核函数效果对比

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler

# 生成非线性数据(月牙形分布)
X, y = make_moons(n_samples=200, noise=0.2, random_state=42)
X = StandardScaler().fit_transform(X)  # 标准化

# 定义不同核函数模型
models = {
    "Linear Kernel": SVC(kernel='linear', C=1),
    "RBF Kernel": SVC(kernel='rbf', C=1, gamma=1),
    "Polynomial Kernel (d=3)": SVC(kernel='poly', C=1, degree=3, coef0=1)
}

# 训练并可视化决策边界
def plot_decision_boundary(model, title):
    xx, yy = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap='coolwarm')
    plt.title(title)
    plt.show()

for name, model in models.items():
    model.fit(X, y)
    plot_decision_boundary(model, name)
输出结果
  • 线性核:无法分割月牙形数据,准确率低。
  • RBF 核:完美拟合非线性边界。
  • 多项式核(d=3) :拟合效果类似 RBF,但边界更规则。

不同核函数效果


5. 总结

核函数选择建议
线性核高维稀疏数据、线性可分问题、计算效率要求高。
高斯核(RBF)默认选择,适用于大多数非线性问题,需精细调参。
多项式核已知数据符合多项式分布,或需限制模型复杂度时。

实际应用中,建议优先尝试 RBF 核,并通过交叉验证优化参数;若数据维度高且线性可分,选择 线性核 以提升效率;仅在明确数据特性时使用 多项式核