本章核心问题
当现实世界不是线性时,我们该怎么办?
我们之前的学习大多集中在线性模型,它们是计量经济学和机器学习的基石。
但是,现实世界中的经济和金融关系往往是复杂的、非线性的。
线性模型的局限性:一个直观例子
假设我们用线性回归拟合一组明显呈曲线关系的数据。
观察: 模型系统性地低估了两端,高估了中间。均方误差(MSE)很高。
现实中的非线性关系
- 信贷违约风险: 收入与违约率的关系可能不是线性的。极低和极高收入人群的风险可能都较低,而中等收入人群由于过度杠杆,风险反而更高。
- 资产收益率: 资产收益与市场因子的关系(Beta)可能随市场波动性变化而变化,呈现非线性。
- 消费者行为: 价格折扣对销量的提升效应会逐渐减弱,呈现饱和曲线,而非直线。
我们的探索之旅:三条非线性路径
本章我们将系统地学习三类强大的非线性模型,以应对线性模型的局限性。
分段线性判别的几何直观 (1/3)
首先,我们有一个无法被单一直线分开的数据集。
分段线性判别的几何直观 (2/3)
我们将“信用良好”(蓝色)的客户群体,想象成两个潜在的子群体。然后我们用两条不同的直线来分割。
- 直线1: 分开了紫色群体和蓝色“左下”子群体。
- 直线2: 分开了紫色群体和蓝色“右上”子群体。
分段线性判别的几何直观 (3/3)
最终的决策边界,是由这两条直线的一部分组合而成的“V”形。
关联思想:决策树
决策树模型本质上也是在进行一种分段划分。它通过一系列与坐标轴平行的“分割”,将特征空间切分成多个矩形区域。
分段线性判别的优势与局限
思想简单,易于理解 |
如何划分子类是关键难题 |
可以利用现有的线性模型算法 |
子类数量需要预先设定 (超参数) |
只要分段足够多,可以拟合任意复杂的形状 |
容易产生过拟合 (Overfitting) |
与决策树等模型思想相通 |
模型的“整体性”和“优雅性”不足 |
结论: 分段线性判别是一个有效的“启发式”方法,但在实践中,我们通常寻求更系统、更优雅的解决方案。
QDA:不再满足于逼近,直接拟合曲线
二次判别分析 (Quadratic Discriminant Analysis, 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}\) 矩阵可以生成各种形状的二次曲面边界。
QDA的“代价”:参数数量的爆炸
这种灵活性是有代价的。我们来数一下模型的参数个数:
- 矩阵 \(\mathbf{W}\): 由于 \(\mathbf{W}\) 可以被假定为对称矩阵,它有 \(d(d+1)/2\) 个独立参数。
- 向量 \(\mathbf{w}\): 有 \(d\) 个参数。
- 标量 \(b\): 有 \(1\) 个参数。
总参数数量为 \(\frac{d(d+1)}{2} + d + 1\),大约为 \(O(d^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 的假设
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. 马氏距离
结论: 点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})\) 是一个二次函数。
准备数据和环境
我们将使用 scikit-learn
的 LinearDiscriminantAnalysis
和 QuadraticDiscriminantAnalysis
类。
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()
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()
QDA总结:何时应该使用它?
- 适用场景: 当你相信不同类别的数据具有不同的协方差结构时,QDA是一个很好的选择。它在LDA和更复杂的非参数方法(如K-近邻)之间提供了一个很好的平衡。
- 优点: 模型形式明确,比许多非线性方法(如核SVM)的计算成本更低。
- 缺点: 对高斯分布的假设较强。当特征维度 \(d\) 很高时,参数数量会变得非常大,需要大量数据来避免过拟合,且计算成本高。
第三部分:核方法 (The Kernel Trick)
核方法:一个“改变游戏规则”的思想
QDA虽然有效,但它只局限于二次函数。如果我们想拟合更复杂的边界怎么办?
核方法 (Kernel Method) 提供了一个极其优雅和强大的思路:
我们不直接在原始的低维空间中学习一个复杂的非线性模型,而是将数据通过一个非线性映射 \(\phi(\mathbf{x})\) 投射到一个更高维度的“特征空间”,然后在这个高维空间中学习一个简单的线性模型。
这个思想,通常被称为“核技巧 (Kernel Trick)”,是现代机器学习的基石之一。
核方法的核心直观:升维打击 (1/3)
想象一下一维空间中的一些数据点,它们无法被一个“点”(0维超平面)分开。
核方法的核心直观:升维打击 (2/3)
我们定义一个简单的非线性映射 \(\phi(x) = (x, x^2)\),将一维数据点 \(x\) 映射到二维空间。
核方法的核心直观:升维打击 (3/3)
奇迹发生了! 在这个新的二维空间里,数据点变得可以用一条直线分开了。
核方法的完整流程图
映射后的新家:希尔伯特空间
这个映射 \(\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 }
\]
核函数:通往高维空间的捷径
核函数 (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核的决策边界是由这些“小山丘”的等高线组合而成的。
- 小 \(\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}} }
\]
这使得我们能够将线性算法无缝升级,赋予其强大的非线性处理能力。
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)
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)
可视化原始数据:同心圆
这是我们的原始数据,一个大圆套着一个小圆。我们希望找到一个单一的维度,能够把这两个圆分离开。
标准PCA的失败
标准PCA试图找到数据方差最大的方向进行投影。对于同心圆数据,任何方向的线性投影都会把两个圆的点混在一起。
KPCA的成功
KPCA使用RBF核,将数据映射到一个无穷维空间。在这个空间里,内外圈的数据变得可以分离。当我们再把它投影回一维时,可以看到两类数据被清晰地分开了。
回顾线性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)
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模型训练完成")
三种非线性建模思想对比
核心思想 |
用多段直线逼近 |
直接拟合二次曲线 |
升维打击,化曲为直 |
灵活性 |
高(理论上可拟合任意形状) |
中等(仅限二次型) |
非常高(RBF核可拟合任意形状) |
计算成本 |
取决于分段数量 |
中等 (\(O(d^2)\)) |
高 (\(O(N^2)\) 至 \(O(N^3)\)) |
可解释性 |
中等(类似决策树) |
较高(二次函数) |
低(高维空间无法直观理解) |
主要假设 |
无特定分布假设 |
数据服从高斯分布 |
无特定分布假设 |
关键参数 |
子类/分段的数量 |
无(但依赖高斯假设) |
核函数类型及其参数 (如 gamma , d ) |
适用场景 |
直观建模,类似决策树的场景 |
类别协方差不同,特征维度不高 |
复杂非线性问题,默认的强大工具 |