06 非线性模型

本章核心问题

当现实世界不是线性时,我们该怎么办?

我们之前的学习大多集中在线性模型,它们是计量经济学和机器学习的基石。

但是,现实世界中的经济和金融关系往往是复杂的、非线性的。

线性模型的局限性:一个直观例子

假设我们用线性回归拟合一组明显呈曲线关系的数据。

观察: 模型系统性地低估了两端,高估了中间。均方误差(MSE)很高。

现实中的非线性关系

  • 信贷违约风险: 收入与违约率的关系可能不是线性的。极低和极高收入人群的风险可能都较低,而中等收入人群由于过度杠杆,风险反而更高。
  • 资产收益率: 资产收益与市场因子的关系(Beta)可能随市场波动性变化而变化,呈现非线性。
  • 消费者行为: 价格折扣对销量的提升效应会逐渐减弱,呈现饱和曲线,而非直线。

我们的探索之旅:三条非线性路径

本章我们将系统地学习三类强大的非线性模型,以应对线性模型的局限性。

非线性模型探索路径 一个展示三种非线性模型学习路径的路线图:分段线性、二次判别分析(QDA)和核方法。 起点 线性模型 1. 分段线性 用多条直线逼近 2. QDA 直接拟合曲线 3. 核方法 (Kernel Trick) 升维打击,化曲为直

第一部分:分段线性判别

分段线性判别:最直观的“蛮力”方法

核心思想: 如果一条直线不行,那就用多条直线来拼接和逼近。

这个策略通常分为两步:

  1. 子类划分 (Subclass Partitioning): 将原始的某一类(例如蓝色点)进一步细分为多个子类,使得每个子类都能够与其他类别线性可分。
  2. 同类合并 (Class Merging): 在做出最终决策时,将所有属于同一原始大类的子类的预测结果合并。

分段线性判别的几何直观 (1/3)

首先,我们有一个无法被单一直线分开的数据集。

初始非线性分类问题 一个无法被线性模型完美分割的典型数据集,其中紫色点和蓝色点呈月亮形分布。 客户指标 1 客户指标 2 存在风险 (Class 0) 信用良好 (Class 1)

分段线性判别的几何直观 (2/3)

我们将“信用良好”(蓝色)的客户群体,想象成两个潜在的子群体。然后我们用两条不同的直线来分割。

  • 直线1: 分开了紫色群体和蓝色“左下”子群体。
  • 直线2: 分开了紫色群体和蓝色“右上”子群体。
分段线性判别思想 紫色和蓝色点集,被两条独立的红色和橙色虚线分割。 直线 1 直线 2

分段线性判别的几何直观 (3/3)

最终的决策边界,是由这两条直线的一部分组合而成的“V”形。

最终的分段线性边界 两条直线的一部分组成一个V形,分割了数据点。 最终决策边界

关联思想:决策树

决策树模型本质上也是在进行一种分段划分。它通过一系列与坐标轴平行的“分割”,将特征空间切分成多个矩形区域。

决策树与空间划分 左侧是一个简单的决策树,右侧是其在二维特征空间中对应的矩形划分。 X1 < 0.5? 类别 0 X2 < 0.6? 类别 1 类别 0 特征空间 特征 X1 特征 X2 X1 = 0.5 X2=0.6

分段线性判别的优势与局限

优势 (Pros) 局限 (Cons)
思想简单,易于理解 如何划分子类是关键难题
可以利用现有的线性模型算法 子类数量需要预先设定 (超参数)
只要分段足够多,可以拟合任意复杂的形状 容易产生过拟合 (Overfitting)
与决策树等模型思想相通 模型的“整体性”和“优雅性”不足

结论: 分段线性判别是一个有效的“启发式”方法,但在实践中,我们通常寻求更系统、更优雅的解决方案。

第二部分:二次判别分析 (QDA)

QDA:不再满足于逼近,直接拟合曲线

二次判别分析 (Quadratic Discriminant Analysis, QDA) 不再用多条直线拼接,而是直接构建一个二次型的决策边界。

对于我们的月亮型数据,一条优美的抛物线就可以很好地完成分类任务。

QDA的二次边界 一条红色的抛物线优雅地分割了紫色和蓝色的数据点。 二次决策边界

QDA判别函数的形式

QDA 的判别函数 \(f(\mathbf{x}_n)\) 是一个关于输入向量 \(\mathbf{x}_n\) 的二次函数:

\[ \large{ f(\mathbf{x}_n, \mathbf{W}, \mathbf{w}, b) = \mathbf{x}_n^T \mathbf{W} \mathbf{x}_n + \mathbf{w}^T \mathbf{x}_n + b } \]

  • \(\mathbf{x}_n \in \mathbb{R}^d\): d维的特征向量。
  • \(\mathbf{W} \in \mathbb{R}^{d \times d}\): 二次项系数矩阵,它“掰弯”了决策边界。
  • \(\mathbf{w} \in \mathbb{R}^d\): 线性项系数向量,它“平移”决策边界。
  • \(b \in \mathbb{R}\): 偏置项。

QDA的核心:二次项矩阵 \(\mathbf{W}\)

在判别函数中,真正让 QDA 具有非线性能力的是二次项 \(\mathbf{x}_n^T \mathbf{W} \mathbf{x}_n\)

  • 如果 \(\mathbf{W} = \mathbf{0}\),那么 QDA 就退化为了我们熟悉的线性判别分析 (LDA)。决策边界是线性的。
  • 如果 \(\mathbf{W} \neq \mathbf{0}\),决策边界 \(f(\mathbf{x}_n) = 0\) 就是一个二次曲面 (在二维空间中是圆锥曲线,如椭圆、抛物线、双曲线)。

\(\mathbf{W}\) 的几何意义:决定边界形状

不同的 \(\mathbf{W}\) 矩阵可以生成各种形状的二次曲面边界。

W矩阵决定边界形状 三个子图分别展示了椭圆、抛物线和双曲线形状的决策边界。 椭圆 抛物线 双曲线

QDA的“代价”:参数数量的爆炸

这种灵活性是有代价的。我们来数一下模型的参数个数:

  • 矩阵 \(\mathbf{W}\): 由于 \(\mathbf{W}\) 可以被假定为对称矩阵,它有 \(d(d+1)/2\) 个独立参数。
  • 向量 \(\mathbf{w}\): 有 \(d\) 个参数。
  • 标量 \(b\): 有 \(1\) 个参数。

总参数数量为 \(\frac{d(d+1)}{2} + d + 1\),大约为 \(O(d^2)\)

参数数量爆炸的后果

特征维度 (d) QDA 参数数量 (约 d²/2)
2 6
10 66
50 1,326
100 5,151
1000 ~500,000

这会带来两个严峻的实际问题:

  1. 计算量巨大: 求解一个包含 \(d^2\) 级别参数的模型非常耗时。
  2. 样本需求量大: 要稳健地估计这么多参数,需要非常大的样本量,否则极易过拟合。

从概率视角理解QDA:更实用的路径

实践中,我们不直接去拟合那个庞大的 \(\mathbf{W}\) 矩阵,而是通过概率生成模型的思路来推导 QDA。

核心假设: 我们假设每个类别 \(k\) 的数据都服从一个多元高斯分布 (Multivariate Gaussian Distribution)。

\[ \large{ p(\mathbf{x} | y=k) = \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) } \]

  • \(\boldsymbol{\mu}_k\): 第 \(k\) 类的数据均值向量(分布的中心)。
  • \(\boldsymbol{\Sigma}_k\): 第 \(k\) 类的数据协方差矩阵(分布的形状和方向)。

QDA与LDA的关键区别:协方差矩阵

QDA 和 LDA 都假设数据服从高斯分布,但它们对协方差矩阵的假设不同。

  • LDA (线性判别分析): 假设所有类别的协方差矩阵是相同的。 \(\boldsymbol{\Sigma}_1 = \boldsymbol{\Sigma}_2 = \dots = \boldsymbol{\Sigma}_K = \boldsymbol{\Sigma}\) 这个强假设导致了线性的决策边界。

  • QDA (二次判别分析): 假设每个类别的协方差矩阵可以是不同的。 \(\boldsymbol{\Sigma}_i \neq \boldsymbol{\Sigma}_j\) for \(i \neq j\) 这个更宽松的假设,恰恰是产生二次决策边界的根源。

可视化对比:LDA vs. QDA 的假设

线性判别分析 (LDA) 假设: 共同协方差 (Σ₁ = Σ₂) 形状相同的等高线 交点决定了线性边界 二次判别分析 (QDA) 假设: 各自协方差 (Σ₁ ≠ Σ₂) 形状不同的等高线 交点决定了二次边界

QDA判别函数的推导

根据贝叶斯定理,后验概率 \(P(y=k|\mathbf{x}) \propto p(\mathbf{x}|y=k) P(y=k)\)。取对数并展开高斯分布的概率密度函数,我们得到的判别函数(忽略常数项)为:

\[ \large{ \delta_k(\mathbf{x}) = -\frac{1}{2} \log |\boldsymbol{\Sigma}_k| - \frac{1}{2} (\mathbf{x} - \boldsymbol{\mu}_k)^T \boldsymbol{\Sigma}_k^{-1} (\mathbf{x} - \boldsymbol{\mu}_k) + \log \pi_k } \]

这是一个关于 \(\mathbf{x}\) 的二次函数!其中二次项来自于 \(\mathbf{x}^T \boldsymbol{\Sigma}_k^{-1} \mathbf{x}\)

什么是马氏距离 (Mahalanobis Distance)?

QDA 判别函数的核心是马氏距离的平方:

\[ \large{ D_M^2(\mathbf{x}, \boldsymbol{\mu}_k) = (\mathbf{x} - \boldsymbol{\mu}_k)^T \boldsymbol{\Sigma}_k^{-1} (\mathbf{x} - \boldsymbol{\mu}_k) } \]

  • 直观理解: 它衡量了一个点 \(\mathbf{x}\) 到一个分布中心 \(\boldsymbol{\mu}_k\) 的“统计距离”。
  • 它考虑了数据本身的协方差结构 \(\boldsymbol{\Sigma}_k\)。如果数据在某个方向上变化很大(方差大),那么在这个方向上的距离就会被“缩小”。
  • QDA 本质上是将一个样本点归类到离它“马氏距离”最近的那个类别。

可视化:欧氏距离 vs. 马氏距离

直观与形式:全面理解马氏距离 欧氏距离: d(A,μ) ≈ d(B,μ) μ A B Δd Δd ● 形式化定义: 欧氏距离: d(x,μ) = √[(x-μ)T(x-μ)] 马氏距离: DM(x,μ) = √[(x-μ)TΣ-1(x-μ)] 关键区别: 使用协方差矩阵的逆 -1) 对空间进行“缩放”并消除变量间的相关性。 ● 直观解释: 点A位于数据密集的主流区域,扰动Δd可视为正常波动; 点B虽在欧氏距离上相等,但已处数据分布边缘,同样的扰动Δd使其成为极端异常值。

结论: 点A在数据分布的“长轴”方向上,虽然欧氏距离远,但统计上更“近”。

QDA决策规则

对于一个二分类问题 (类别 \(\omega_1, \omega_2\)),我们可以定义一个判别函数 \(f_i(\mathbf{x})\):

\[ \large{ f_i(\mathbf{x}) = \log\pi_i - \frac{1}{2}\log|\boldsymbol{\Sigma}_i| - \frac{1}{2}(\mathbf{x} - \boldsymbol{\mu}_i)^T \boldsymbol{\Sigma}_i^{-1} (\mathbf{x} - \boldsymbol{\mu}_i) } \]

决策规则: - 如果 \(f_1(\mathbf{x}) \geq f_2(\mathbf{x})\),则预测为类别 \(\omega_1\)。 - 否则,预测为类别 \(\omega_2\)

由于每个类的 \(f_i(\mathbf{x})\) 都有自己的协方差矩阵 \(\boldsymbol{\Sigma}_i\),决策边界 \(f_1(\mathbf{x}) = f_2(\mathbf{x})\) 是一个二次函数。

案例研究:用Python实现QDA进行客户分类

现在,让我们用 scikit-learn 库在月亮数据集上应用 LDA 和 QDA,直观地比较它们的差异。

目标:

  1. 训练一个 LDA 模型。
  2. 训练一个 QDA 模型。
  3. 可视化并比较它们的决策边界。

准备数据和环境

我们将使用 scikit-learnLinearDiscriminantAnalysisQuadraticDiscriminantAnalysis 类。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis, QuadraticDiscriminantAnalysis
from matplotlib.colors import ListedColormap

# 使用之前生成的数据
X, y = make_moons(n_samples=200, noise=0.1, random_state=42)

# 定义一个函数来绘制决策边界
def plot_decision_boundary(clf, X, y, ax, title):
    """一个绘制分类器决策边界的辅助函数"""
    h = .02  # 网格步长
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    # 创建一个特征网格
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    
    # 预测网格中每个点的类别
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    # 定义配色方案
    cm_bright = ListedColormap(['#FF9999', '#9999FF'])
    
    # 绘制决策区域和数据点
    ax.contourf(xx, yy, Z, cmap=cm_bright, alpha=.5)
    ax.scatter(X[:, 0], X[:, 1], c=y, cmap=ListedColormap(['mediumpurple', 'dodgerblue']), edgecolors='k')
    ax.set_title(title, fontsize=16)
    ax.set_xlabel('客户指标 1')
    ax.set_ylabel('客户指标 2')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)

LDA的失败:一条直线无法解决问题

我们首先应用LDA。正如预期的那样,LDA试图找到一条最佳的直线来分割数据,但对于这个“月亮”形状的数据集,效果很差。

lda = LinearDiscriminantAnalysis()
lda.fit(X, y)

fig, ax = plt.subplots(1, 1, figsize=(9, 5.5))
plot_decision_boundary(lda, X, y, ax, '线性判别分析 (LDA) 的决策边界')
plt.show()
Figure 1: LDA试图用一条直线来分割非线性数据,效果不佳。

QDA的成功:曲线完美拟合

现在,我们应用QDA。由于QDA可以学习每个类别不同的协方差结构,它能够生成一个灵活的二次曲线边界,完美地分开了这两个“月亮”。

qda = QuadraticDiscriminantAnalysis()
qda.fit(X, y)

fig, ax = plt.subplots(1, 1, figsize=(9, 5.5))
plot_decision_boundary(qda, X, y, ax, '二次判别分析 (QDA) 的决策边界')
plt.show()
Figure 2: QDA生成了一条二次曲线边界,成功地解决了非线性分类问题。

QDA总结:何时应该使用它?

  • 适用场景: 当你相信不同类别的数据具有不同的协方差结构时,QDA是一个很好的选择。它在LDA和更复杂的非参数方法(如K-近邻)之间提供了一个很好的平衡。
  • 优点: 模型形式明确,比许多非线性方法(如核SVM)的计算成本更低。
  • 缺点: 对高斯分布的假设较强。当特征维度 \(d\) 很高时,参数数量会变得非常大,需要大量数据来避免过拟合,且计算成本高。

第三部分:核方法 (The Kernel Trick)

核方法:一个“改变游戏规则”的思想

QDA虽然有效,但它只局限于二次函数。如果我们想拟合更复杂的边界怎么办?

核方法 (Kernel Method) 提供了一个极其优雅和强大的思路:

我们不直接在原始的低维空间中学习一个复杂的非线性模型,而是将数据通过一个非线性映射 \(\phi(\mathbf{x})\) 投射到一个更高维度的“特征空间”,然后在这个高维空间中学习一个简单的线性模型。

这个思想,通常被称为“核技巧 (Kernel Trick)”,是现代机器学习的基石之一。

核方法的核心直观:升维打击 (1/3)

想象一下一维空间中的一些数据点,它们无法被一个“点”(0维超平面)分开。

一维线性不可分数据 一条线上分布着两种颜色的点,无法用一个分割点分开。 x 问题:无法用一个点把蓝色和紫色分开

核方法的核心直观:升维打击 (2/3)

我们定义一个简单的非线性映射 \(\phi(x) = (x, x^2)\),将一维数据点 \(x\) 映射到二维空间。

从一维到二维的映射 展示了x到(x, x^2)的映射过程,点被提升到抛物线上。 x 映射: φ(x) = (x, x²)

核方法的核心直观:升维打击 (3/3)

奇迹发生了! 在这个新的二维空间里,数据点变得可以用一条直线分开了。

二维空间中的线性可分性 之前不可分的点在映射到二维后,可以被一条红线分开。 x 现在,数据是线性可分的!

核方法的完整流程图

核方法 (The Kernel Trick) 1. 输入空间 (Input Space) 非线性可分 (Non-linearly Separable) φ(x) 2. 特征空间 (Feature Space) 线性可分 (Linearly Separable)

映射后的新家:希尔伯特空间

这个映射 \(\phi(\mathbf{x})\) 去往的高维空间,在数学上被称为特征空间。为了让我们的数学工具(如距离、角度)能够正常工作,我们要求这个空间是一个希尔伯特空间 (Hilbert Space)

对于我们经济系的学生,你不需要深入了解它的严格数学定义。可以这样直观理解:

一个希尔伯特空间,就是一个行为表现良好的、可能无穷维的广义欧几里得空间。

在这里,我们可以像在普通空间一样,放心地计算长度、距离和角度。

希尔伯特空间的关键性质:内积

希尔伯特空间最重要的性质是它定义了内积 (Inner Product),我们记为 \(\langle \cdot, \cdot \rangle_{\mathcal{H}}\)

内积是我们熟悉的点积 (dot product) 的推广: \[ \large{ \langle \mathbf{x}_1, \mathbf{x}_2 \rangle = \mathbf{x}_1^T \mathbf{x}_2 = \sum_{i=1}^d x_{1,i} x_{2,i} } \]

有了内积,我们就可以定义范数 (Norm, 即长度)距离 (Distance),就像在欧氏空间中一样。内积还包含了向量间夹角的信息,因此可以衡量相似度

\[ \large{ \langle \mathbf{x}_1, \mathbf{x}_2 \rangle = ||\mathbf{x}_1|| \cdot ||\mathbf{x}_2|| \cos\theta } \]

核技巧的“魔法”所在

我们回顾一下,很多线性算法(如SVM, PCA, 线性回归)的最终计算都可以只用样本点的内积 \(\langle \mathbf{x}_i, \mathbf{x}_j \rangle\) 来表示。

那么,如果我们将数据映射到高维空间 \(\phi(\mathbf{x})\),算法就需要计算映射后的内积 \(\langle \phi(\mathbf{x}_i), \phi(\mathbf{x}_j) \rangle_{\mathcal{H}}\)

问题:

  1. 映射函数 \(\phi(\mathbf{x})\) 可能非常复杂,甚至我们都不知道它的显式形式。
  2. 高维空间的维度可能非常高,甚至是无穷维,直接计算内积是不可能的。

核函数:通往高维空间的捷径

核函数 (Kernel Function) \(K(\mathbf{x}_i, \mathbf{x}_j)\) 的定义就是为了解决这个问题:

一个函数 \(K(\mathbf{x}_i, \mathbf{x}_j)\) 如果能被写成某个映射 \(\phi\) 在高维空间中的内积形式,即 \(K(\mathbf{x}_i, \mathbf{x}_j) = \langle \phi(\mathbf{x}_i), \phi(\mathbf{x}_j) \rangle_{\mathcal{H}}\),那么这个函数 \(K\) 就是一个核函数。

核技巧的精髓: 我们可以直接在原始低维空间计算 \(K(\mathbf{x}_i, \mathbf{x}_j)\) 的值,而完全不需要知道 \(\phi\) 是什么,也不需要去那个高维空间。这等价于计算了高维空间中的内积,从而避免了“维度灾难”。

例子:一个简单的二次核函数

假设我们的原始数据是二维的 \(\mathbf{x} = (x_1, x_2)\)。 考虑一个简单的核函数: \(K(\mathbf{x}_i, \mathbf{x}_j) = (\mathbf{x}_i^T \mathbf{x}_j)^2\)

让我们展开它: \[ \begin{aligned} \large{ K(\mathbf{x}_i, \mathbf{x}_j) } &= \large{ (x_{i1}x_{j1} + x_{i2}x_{j2})^2 } \\ &= \large{ x_{i1}^2x_{j1}^2 + x_{i2}^2x_{j2}^2 + 2x_{i1}x_{j1}x_{i2}x_{j2} } \\ &= \large{ \langle (x_{i1}^2, x_{i2}^2, \sqrt{2}x_{i1}x_{i2}), (x_{j1}^2, x_{j2}^2, \sqrt{2}x_{j1}x_{j2}) \rangle } \end{aligned} \] 这说明,这个简单的核函数背后隐含了一个从二维到三维的映射: \(\phi(\mathbf{x}) = (x_1^2, x_2^2, \sqrt{2}x_1x_2)\)

我们只用了一次乘法和一次平方,就完成了在高维空间中的内积计算!

如何判断一个函数是合法的核函数?

一个函数 \(K(\mathbf{x}_i, \mathbf{x}_j)\) 必须满足什么条件,才能保证它背后一定存在一个希尔伯特空间和一个映射 \(\phi\) 呢?

Mercer 定理给出了答案:

对于任意有限的数据点集合 \(\{\mathbf{x}_1, \dots, \mathbf{x}_N\}\),如果由核函数计算出的 Gram 矩阵 \(\mathbf{K}\) 都是半正定的,那么 \(K\) 就是一个合法的核函数。

什么是Gram矩阵?

Gram 矩阵 \(\mathbf{K}\) 是一个 \(N \times N\) 的对称矩阵,其中每个元素 \(K_{ij}\) 都是由第 \(i\) 个和第 \(j\) 个数据点通过核函数计算得到的值:

\[ \large{ \mathbf{K} = \begin{pmatrix} K(\mathbf{x}_1, \mathbf{x}_1) & K(\mathbf{x}_1, \mathbf{x}_2) & \dots & K(\mathbf{x}_1, \mathbf{x}_N) \\ K(\mathbf{x}_2, \mathbf{x}_1) & K(\mathbf{x}_2, \mathbf{x}_2) & \dots & K(\mathbf{x}_2, \mathbf{x}_N) \\ \vdots & \vdots & \ddots & \vdots \\ K(\mathbf{x}_N, \mathbf{x}_1) & K(\mathbf{x}_N, \mathbf{x}_2) & \dots & K(\mathbf{x}_N, \mathbf{x}_N) \end{pmatrix} } \]

直观理解: Gram 矩阵是一个成对相似度矩阵,描述了数据集中所有样本点之间的关系。半正定性保证了这种“相似度”是几何上一致的(没有自相矛盾)。

常用核函数:你的“弹药库”

幸运的是,我们不需要每次都自己去验证 Mercer 定理。有很多现成的、被证明是合法的核函数供我们使用。

选择核函数的基本原则: 样本属性向量 \(\mathbf{x}_i, \mathbf{x}_j\) 越相似,核函数的值 \(K(\mathbf{x}_i, \mathbf{x}_j)\) 应该越大。

接下来我们介绍几种最常用的核函数。

常用核函数1:线性核 (Linear Kernel)

\[ \large{ K(\mathbf{x}_i, \mathbf{x}_j) = \mathbf{x}_i^T \mathbf{x}_j } \]

  • 本质: 就是原始空间中的点积。
  • 对应映射: \(\phi(\mathbf{x}) = \mathbf{x}\),即没有进行映射。
  • 应用: 当数据本身就是线性可分时,使用线性核的SVM就是标准的线性SVM。这是最简单、最快的基准。

常用核函数2:多项式核 (Polynomial Kernel)

\[ \large{ K(\mathbf{x}_i, \mathbf{x}_j) = (\gamma \mathbf{x}_i^T \mathbf{x}_j + r)^d } \]

  • 参数:
    • \(d\): 多项式的次数 (degree)。
    • \(\gamma\): 缩放系数。
    • \(r\): 常数项系数。
  • 本质: 隐式地将数据映射到一个包含所有次数直到 \(d\) 的交互项的特征空间。
  • 应用: 对于需要考虑特征之间交互作用的问题非常有效。例如,在金融风控中,\(x_1 \times x_2\) (收入与负债率的乘积) 可能是一个比 \(x_1\)\(x_2\) 单独更强的预测因子。

常用核函数3:高斯核 (RBF Kernel)

径向基函数核 (Radial Basis Function Kernel),通常也叫高斯核,是最常用、最强大的核函数。

\[ \large{ K(\mathbf{x}_i, \mathbf{x}_j) = \exp \left( -\frac{||\mathbf{x}_i - \mathbf{x}_j||^2}{2\sigma^2} \right) = \exp(-\gamma ||\mathbf{x}_i - \mathbf{x}_j||^2) } \]

  • 参数:
    • \(\sigma\) (或 \(\gamma = 1/(2\sigma^2)\)): 控制核的“宽度”。
  • 本质: 相似度完全由两点间的欧氏距离决定。两点距离越近,核函数值越接近1;距离越远,核函数值越接近0。
  • 对应映射: 这是一个非常强大的核,因为它对应于一个无穷维的特征空间。

RBF核的直观理解

你可以将每个数据点想象成在空间中放置一个高斯“小山丘”。RBF核的决策边界是由这些“小山丘”的等高线组合而成的。

RBF核: γ 参数如何决定“影响范围” 核函数 K(x, x') = exp( · d²),γ 越大,影响随距离(d)衰减越快 大 γ → 影响范围窄 (Narrow Influence) “尖瘦”曲线: 影响衰减快 小 γ → 影响范围宽 (Wide Influence) “矮胖”曲线: 影响衰减慢
  • \(\gamma\) (大 \(\sigma\)): 核的半径很大,影响力范围广,决策边界非常平滑
  • \(\gamma\) (小 \(\sigma\)): 核的半径很小,每个数据点的影响范围有限,决策边界会变得非常曲折,容易过拟合。

结论: 如果你对数据结构没有先验知识,RBF核通常是首选的默认核函数。

常用核函数4:Sigmoid核 (Sigmoid Kernel)

\[ \large{ K(\mathbf{x}_i, \mathbf{x}_j) = \tanh(\alpha \mathbf{x}_i^T \mathbf{x}_j + \beta) } \]

  • 参数: \(\alpha\)\(\beta\)
  • 来源: 它的形式来源于神经网络中的激活函数。
  • 注意: Sigmoid核只有在特定参数下才满足Mercer条件,因此在实践中不如RBF核和多项式核常用。

应用:核化学习算法

核方法的应用:算法的“核化” (Kernelization)

核技巧的优美之处在于它的普适性。任何一个算法,只要它的计算可以完全用数据点之间的内积来表达,我们就可以通过将内积替换为核函数 \(K(\mathbf{x}_i, \mathbf{x}_j)\) 来将其“核化”。

\[ \large{ \langle \mathbf{x}_i, \mathbf{x}_j \rangle \quad \xrightarrow{\text{Kernelize}} \quad K(\mathbf{x}_i, \mathbf{x}_j) = \langle \phi(\mathbf{x}_i), \phi(\mathbf{x}_j) \rangle_{\mathcal{H}} } \]

这使得我们能够将线性算法无缝升级,赋予其强大的非线性处理能力。

经典应用

我们将介绍两个经典应用:

  1. 核主成分分析 (Kernel PCA)
  2. 核支持向量机 (Kernel SVM)

应用1:核主成分分析 (KPCA)

PCA 的局限性

回顾PCA:

  1. 计算数据的协方差矩阵 \(\mathbf{\Sigma} = \frac{1}{N} \sum_{n=1}^N \mathbf{x}_n \mathbf{x}_n^T\) (假设数据已中心化)。
  2. \(\mathbf{\Sigma}\) 进行特征值分解,找到主要的特征向量(主成分)。

问题: PCA只能发现数据中的线性结构。对于非线性结构,PCA会失效。

KPCA 的思路

KPCA的思路:

  1. 将数据映射到高维特征空间: \(\mathbf{x}_n \to \phi(\mathbf{x}_n)\)
  2. 在高维空间中计算协方差矩阵: \(\mathbf{\Sigma}_\phi = \frac{1}{N} \sum_{n=1}^N \phi(\mathbf{x}_n) \phi(\mathbf{x}_n)^T\)
  3. \(\mathbf{\Sigma}_\phi\) 进行特征值分解。

KPCA的计算技巧

直接计算 \(\mathbf{\Sigma}_\phi\) 是不可行的,因为它可能是一个无穷维的矩阵。

幸运的是,通过一系列数学推导,可以证明在高维空间中的特征向量 \(\mathbf{v}\) 可以表示为映射后数据点的线性组合: \(\mathbf{v} = \sum_{n=1}^N \alpha_n \phi(\mathbf{x}_n)\)

最终,求解特征向量的问题可以转化为求解一个 \(N \times N\) 的Gram矩阵 \(\mathbf{K}\) 的特征值问题:

\[ \large{ N\lambda \boldsymbol{\alpha} = \mathbf{K} \boldsymbol{\alpha} } \]

这里的 \(\mathbf{K}\) 就是我们前面定义的核矩阵,其元素为 \(K_{ij} = K(\mathbf{x}_i, \mathbf{x}_j)\)。整个计算过程完全避免了显式使用 \(\phi\)

案例研究:用KPCA进行非线性降维

让我们看一个标准PCA会失败,而KPCA能成功的例子。我们将使用scikit-learnmake_circles数据集。

目标:

  1. 生成一个“同心圆”数据集,它显然是非线性结构。
  2. 分别使用标准PCA和带RBF核的KPCA对其进行降维到一维。
  3. 比较降维后的结果。

准备数据与环境 (KPCA)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from sklearn.decomposition import PCA, KernelPCA

# 生成同心圆数据
X, y = make_circles(n_samples=400, factor=.3, noise=.05, random_state=0)

可视化原始数据:同心圆

这是我们的原始数据,一个大圆套着一个小圆。我们希望找到一个单一的维度,能够把这两个圆分离开。

Figure 3: 同心圆数据集,无法通过线性投影分离

标准PCA的失败

标准PCA试图找到数据方差最大的方向进行投影。对于同心圆数据,任何方向的线性投影都会把两个圆的点混在一起。

Figure 4: 标准PCA降维后,两类数据完全重叠

KPCA的成功

KPCA使用RBF核,将数据映射到一个无穷维空间。在这个空间里,内外圈的数据变得可以分离。当我们再把它投影回一维时,可以看到两类数据被清晰地分开了。

Figure 5: 使用RBF核的KPCA降维后,两类数据被完美分离

应用2:核支持向量机 (KSVM)

回顾线性SVM

  • 目标: 找到一个能将两类数据分开,并且间隔 (margin) 最大的超平面。
  • 数学上, 这等价于求解一个带约束的二次优化问题。

对偶问题 (Dual Problem)

  • 通过拉格朗日对偶,可以把SVM的优化问题转化为“对偶形式”。
  • 神奇的是,在对偶形式中,优化目标和决策函数都只依赖于数据点的内积 \(\mathbf{x}_i^T \mathbf{x}_j\)

从SVM到KSVM:只需一步替换

线性SVM的对偶优化目标: \[ \large{ \max_{\boldsymbol{\lambda}} \sum_{n=1}^N \lambda_n - \frac{1}{2} \sum_{n=1}^N \sum_{m=1}^N \lambda_n \lambda_m y_n y_m (\mathbf{x}_m^T \mathbf{x}_n) } \]

要得到核SVM (KSVM),我们只需进行一步简单的替换: \[ \large{ \mathbf{x}_m^T \mathbf{x}_n \quad \longrightarrow \quad K(\mathbf{x}_m, \mathbf{x}_n) } \]

最终的优化目标变为: \[ \large{ \max_{\boldsymbol{\lambda}} \sum_{n=1}^N \lambda_n - \frac{1}{2} \sum_{n=1}^N \sum_{m=1}^N \lambda_n \lambda_m y_n y_m K(\mathbf{x}_m, \mathbf{x}_n) } \]

这样,SVM就能在高维特征空间中寻找最大间隔超平面,从而得到非线性的决策边界。

案例研究:用KSVM解决月亮分类问题

我们再次回到最初的“月亮”分类问题。之前我们用QDA解决了它。现在我们看看使用不同核函数的SVM表现如何。

目标:

  1. 训练一个线性核的SVM。
  2. 训练一个多项式核的SVM。
  3. 训练一个RBF核的SVM。
  4. 可视化并比较它们的决策边界。

准备数据与环境 (KSVM)

from sklearn.svm import SVC

# 使用之前的月亮数据
X, y = make_moons(n_samples=200, noise=0.1, random_state=42)

# 创建分类器实例
svc_linear = SVC(kernel='linear', C=1.0)
svc_poly = SVC(kernel='poly', degree=3, C=1.0)
svc_rbf = SVC(kernel='rbf', gamma=2, C=1.0) # gamma=2 对这个问题效果好

# 训练模型
svc_linear.fit(X, y);
svc_poly.fit(X, y);
svc_rbf.fit(X, y);

print("所有SVM模型训练完成")
所有SVM模型训练完成

KSVM决策边界可视化

Figure 6: 不同核函数的SVM在非线性问题上的表现对比

观察:

  1. 线性核: 和LDA一样,无法分开数据。
  2. 多项式核: 成功地拟合了一条曲线边界。
  3. RBF核: 同样成功,且边界看起来非常平滑和自然。

本章总结

三种非线性建模思想对比

特性 / 方法 分段线性判别 二次判别分析 (QDA) 核方法 (Kernel Trick)
核心思想 用多段直线逼近 直接拟合二次曲线 升维打击,化曲为直
灵活性 高(理论上可拟合任意形状) 中等(仅限二次型) 非常高(RBF核可拟合任意形状)
计算成本 取决于分段数量 中等 (\(O(d^2)\)) 高 (\(O(N^2)\)\(O(N^3)\))
可解释性 中等(类似决策树) 较高(二次函数) 低(高维空间无法直观理解)
主要假设 无特定分布假设 数据服从高斯分布 无特定分布假设
关键参数 子类/分段的数量 无(但依赖高斯假设) 核函数类型及其参数 (如 gamma, d)
适用场景 直观建模,类似决策树的场景 类别协方差不同,特征维度不高 复杂非线性问题,默认的强大工具

关键要点回顾

  1. 直面非线性: 现实世界是复杂的,线性模型有其局限性,学习非线性模型是必要的。
  2. QDA: 通过为每个类假定不同的协方差矩阵来生成二次边界,是LDA的自然推广,在LDA和更复杂模型间取得良好平衡。
  3. 核方法 (Kernel Trick):
    • 核心思想: 升维 + 线性模型。
    • 通过核函数 \(K(\mathbf{x}_i, \mathbf{x}_j) = \langle \phi(\mathbf{x}_i), \phi(\mathbf{x}_j) \rangle\) 实现计算上的捷径,避免维度灾难。
    • 可“核化”任何依赖于内积的算法 (如PCA, SVM),赋予其强大的非线性能力。
    • RBF核是功能最强大、最常用的默认选项。

谢谢!

Q & A