[机器学习]svm(线性核vs非线性核)

384 阅读4分钟

在 SVM 中,核函数的作用确实是解决线性不可分问题,但这一表述需要更精确地理解。

线性核的适用场景是线性可分的数据,而 非线性核(如高斯核、多项式核)的适用场景是线性不可分的数据

这两者看似矛盾,实则是核函数在不同场景下的分工,并不冲突。以下是详细解释:


1. 核函数的核心作用

核函数的本质是 将数据映射到更高维的空间,使得在原始空间中线性不可分的数据,在高维空间中变得线性可分。例如:

  • 原始空间(二维) :数据呈环形分布,无法用直线分隔。
  • 映射到三维空间:通过核函数(如高斯核)将数据映射到三维后,可以用一个平面(超平面)分隔。

关键点
核函数的作用是 扩展 SVM 的能力,使其既能处理线性问题(用线性核),也能处理非线性问题(用非线性核)。


2. 为什么线性核适用于线性可分场景?

线性核的定义为 K(xi,xj)=xi⋅xjK(xi​,xj​)=xi​⋅xj​,即直接在原始空间中计算样本的内积,不进行任何非线性映射。其适用场景如下:

  1. 数据本身线性可分
    当数据在原始空间中已经可以通过一个超平面完美分隔时,使用线性核可以高效地找到这个超平面,无需复杂映射。
  2. 高维稀疏数据
    在文本分类等场景中,特征维度可能高达数万(如词袋模型),而数据在高维空间中往往是线性可分的(参见 Cover定理)。此时,线性核既能保证效率,又能避免非线性核的计算开销。
  3. 避免过拟合
    非线性核(如高斯核)可能过度拟合噪声,而线性核模型简单,泛化能力更强。
示例
  • 二维线性可分数据:直接使用线性核找到分隔直线。
  • 文本分类(TF-IDF 特征) :线性核足以处理高维稀疏特征。

3. 为什么说“核函数解决线性不可分”不矛盾?

  • 核函数是一个广义工具
    它既包含线性核(不改变原始空间),也包含非线性核(映射到高维空间)。线性核是核函数的一种特例,对应“不进行任何映射”的原始空间。

  • 分工明确

    • 线性核:处理 原始空间中的线性可分问题
    • 非线性核:处理 原始空间中的线性不可分问题,通过映射到高维空间后变得线性可分。
类比
  • 线性核像“直尺”,只能在平面上画直线,但适合处理简单问题。
  • 非线性核像“可变形画笔”,能画出复杂曲线,适合处理复杂问题。

4. 线性核与非线性的对比实验

以下代码展示线性核和高斯核在不同数据上的表现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_classification, make_circles

# 生成两种数据:线性可分 vs 非线性可分
X_linear, y_linear = make_classification(n_samples=100, n_features=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
X_nonlinear, y_nonlinear = make_circles(n_samples=100, noise=0.1, factor=0.5, random_state=42)

# 定义模型
linear_kernel_model = svm.SVC(kernel='linear')
rbf_kernel_model = svm.SVC(kernel='rbf', gamma=1)

# 训练并可视化结果
def plot_results(X, y, model, title):
    model.fit(X, y)
    xx, yy = np.meshgrid(np.linspace(X[:,0].min()-1, X[:,0].max()+1, 100),
                         np.linspace(X[:,1].min()-1, X[:,1].max()+1, 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')
    plt.title(title)
    plt.show()

# 线性可分数据:线性核 vs RBF核
plot_results(X_linear, y_linear, linear_kernel_model, "线性核(线性可分数据)")
plot_results(X_linear, y_linear, rbf_kernel_model, "RBF核(线性可分数据)")

# 非线性可分数据:线性核 vs RBF核
plot_results(X_nonlinear, y_nonlinear, linear_kernel_model, "线性核(非线性数据)")
plot_results(X_nonlinear, y_nonlinear, rbf_kernel_model, "RBF核(非线性数据)")
输出结果
  • 线性可分数据

    • 线性核完美分类。
    • RBF 核也能分类,但可能过拟合(边界复杂)。
  • 非线性数据

    • 线性核完全失败。
    • RBF 核完美分类。

5. 总结

核函数类型适用场景核心作用
线性核线性可分或高维稀疏数据直接在原始空间中寻找超平面,避免复杂计算。
非线性核(如RBF, 多项式核)线性不可分数据映射到高维空间后实现线性可分。

核函数的作用不矛盾

  • 线性核是核函数的“基础形态”,用于简单问题。
  • 非线性核是核函数的“扩展形态”,用于复杂问题。
  • 核函数的本质是为 SVM 提供灵活性,根据数据特性选择最合适的映射方式。