跳转至

P4-13.2 kernel 的入门含义

Section ID: P4-13.2 Version: v2026.07.20

P4-13.1 把 SVM (support vector machine) 读成了 寻找大 margin boundary 的分类器。接着自然会冒出下一个问题。

如果 boundary 必须保持成一条直线,那么那些用直线不好分开的数据该怎么办?

这个问题正是现在必须介绍 kernel 的原因。

kernel 是这样一种想法:让数据在另一种表示空间里被比较,从而让原本在线性空间里难以分开的结构变得更容易处理。

所以,13.2 的核心不是 一个新的魔法函数,而是这样一种观点:只要表示方式变了,即使线性 boundary 也会拥有不同的意义

这一节不会重新长篇重复 SVM 的基本定义。寻找大 margin boundary 这个核心直觉,会通过 P4-13.1 和 概念词汇表 再接回来。这里专注的是:为什么要引入改变表示空间的想法。

本节范围

这一节回答下面这些问题。

  • 为什么有些数据只靠线性 boundary 很难分开?
  • 改变表示或 feature space 到底是什么意思?
  • 为什么说 kernel 能 不显式构造所有新特征,也照样有帮助
  • polynomial、RBF 这些名字分别在暗示什么?
  • 什么时候 kernel-based SVM 值得成为候选?

gammadegreecoef0 这些设置该怎样读,以及验证成本该怎么看,会在 P4-9.1 和 P4-9.2 再接回来。也就是说,这一节先专注抓住 只要 representation space 改变,linear boundary 的意义也会改变 这个想法。

用kernel 的入门含义留下的判断标准

  • 能举例说明为什么线性 boundary 有时会显得不够。
  • 能说明如果 feature space 改变,同一批数据会被读成不同的结构。
  • 能在入门层面把 kernel 解释成 一种相似度计算方式,也是间接使用更丰富表示空间的想法
  • 能从直觉上说出 polynomial kernel 和 RBF kernel 分别在意什么样的非线性。
  • 能把 kernel-based 方法放在 当线性 boundary 看起来不足时才想起的候选 这个位置上,而不是当成默认答案。

这一节建议怎么读

因为这里会一下子冒出好几个新词,第一次读时最好只按下面四个问题来抓。

  1. 为什么光靠 找到更好的直线 有时还不够?
  2. feature space 一旦改变,到底会多看到什么?
  3. 直接加新特征,和用 kernel 间接实现类似效果,这两件事怎样连起来?
  4. polynomial 和 RBF 分别在强调什么结构?

只要这四步顺序抓住了,kernel 就更容易被读成 关于问题表示的第四个问题,而不是被误当成 一个全新的模型名字

学习背景

P4-13.1 把 SVM 读成寻找 好的线性 boundary 的模型。但现实数据常常会表现成下面这种样子。

  • class 以弯曲的方式纠缠在一起
  • 呈现中心和外圈这样的圆形结构
  • 两个特征的乘积或交互似乎很重要

此时问题就不会停在 还有没有更好的直线?,而会转成 在这个空间里用直线来读问题,本身是不是就太受限了?

前一节 到这一节发生变化的问题
P4-13.1 SVM 的直觉 什么是好的直线 boundary?
P4-13.2 kernel 的入门含义 用来阅读直线 boundary 的空间本身,是否应该改变?

所以,13.2 不是在推翻 13.1。它是在承认线性 boundary 的力量之后,再补上一句:只要表示改变了,线性本身的意义也会改变

主要学习内容

前面已经看过什么,而这一节新改变了什么

如果这一节看起来像突然讲了新故事,最好先把前面已经看过的三件事重新抓住。

  • P4-11.2 看过 线性 score 和 decision boundary
  • P4-12.2 看过 表示方式和计算标准一变,同样的数据也会被读成不同的结构
  • P4-13.1 看过 在同一坐标空间里,怎样找到更好的线性 boundary

P4-13.2 不是把这三件事扔掉,而是在问:当它们都还不够时,下一步应该多问什么。

如果 13.1 是在同一个空间里找更好的 boundary,那么 13.2 就是在问:这个空间本身有没有把问题揭示得足够简单。

为什么有些数据无法被直线很好地分开

最有名的例子就是 XOR 这种分类问题。假设二维平面里有四个点。

  • 左下和右上属于 class 0
  • 左上和右下属于 class 1

在这种情况下,很难用一条直线把两个 class 干净地切开。无论画哪条直线,都很容易把对角线方向的两个点留在同一边。

问题不一定是数据本身太难,而可能是当前坐标与特征表示对线性分离并不友好。

关键点在于:不是数据天生 太难,而可能只是当前表示方式对线性分离不友好。所以,如果原始空间里的直线 boundary 看起来总是别扭,那么在 boundary 本身之前,就有理由先问表示方式是不是应该改变。

这里重要的是把 是不是该继续找更好的直线?是不是该改变读取直线的空间本身? 分开。

  • P4-13.1 的问题是:能不能在同一坐标空间里找到更好的 boundary?
  • P4-13.2 的问题是:这个坐标空间本身,是否足够简单地揭示了问题结构?

所以,回头看 soft margin 或 C,更接近 在同一个空间里把 boundary 选得更好;而 kernel 更接近 重新阅读 boundary 所处的空间本身

改变表示到底是什么意思

改变表示,不等于 丢掉原始特征。通常它更接近下面这些动作。

  • 组合已有特征
  • 构造新的交互特征
  • 用另一种视角重新看同一批数据

例如有两个特征 \(x_1\)\(x_2\),就可以再加上像 x1 * x2 这样的新特征。这样一来,原本在二维空间里难以分开的结构,在新空间里就可能变得简单得多。

这个流程可以简单画成下面这样。

flowchart TD
  A["原始特征<br/>x1, x2"]
  B["加入新的交互视角<br/>例如 x1 * x2"]
  C["新的特征空间"]
  D["在线性分隔器下也许就能分开"]

  A --> B --> C --> D

这张图展示的就是 kernel 想法的起点。比起先把 boundary 变复杂,更重要的是:只要 feature representation 改变,同样的数据就可能重新被更简单的线性 boundary 读懂。

这里最核心的一句话是:

kernel 的起点,是在改变 boundary 之前,先改变表示方式。

读者尤其要抓住下面几点。

  • 不需要太快就断定 class 复杂是因为 模型太弱
  • 更应该先问:当前坐标轴和特征组合是不是没有把结构揭示得足够简单?
  • kernel 是对这个问题的一种代表性回答。

所以,kernel 与其说是把模型变复杂的技术,不如说更接近 重新设定读取问题的坐标系 的技术。

直接做 feature expansion 和 kernel 的想法,有什么相同又有什么不同

这里很容易一下子读太快,所以最好先把共同点和不同点分开。

比较问题 直接 feature expansion kernel 的想法
共同目标 在更丰富的表示空间里重新读取结构 在更丰富的表示空间里重新读取结构
人直接做什么 显式地构造 x1 * x2x1^2 这样的新特征 用原始空间里的计算,间接实现丰富空间里的比较效果
读者首先要抓什么 哪种组合特征看起来必要? 想强调哪种相似度结构?

所以,kernel 并不是和 direct feature expansion 竞争的另一种魔法。更自然的读法是:它把同一个更宽的想法,也就是 在更丰富的表示里看问题,用一种更一般化的计算路径实现了出来。

kernel 这个名字到底指什么

在这一节里,比起数学严密性,更重要的是先抓住:这个名字到底指向什么。

kernel 是这样一种核心计算:给定两个输入,它会告诉你在更丰富的表示空间里,这两个输入到底有多相似、或多接近。

所以,kernel 指向的并不是 所有新特征本身,而是那个空间里最核心的比较计算。也正因为如此,读者不需要一开始就抓太多问题。

  • 这个 kernel 强调的到底是哪种相似度?
  • 它会不会让交互更显眼?
  • 它会不会对局部、附近的结构反应更强?

只要这三个问题抓住了,读者看到的就不再只是名字,而是 这个 kernel 到底在推动哪种比较方式

为什么说不需要把所有新特征都显式做出来

在入门层面,先抓住下面这句话就足够了。

kernel 的想法,是用原始空间里的计算,替代掉在更丰富表示空间里本来要用到的 inner product 或 similarity。

这意味着:你不一定要把高维空间里的所有新特征一项一项都写出来,才能像是在那个更丰富空间里比较两个点。

这个想法可以画成下面这个流程。

flowchart TD
  A["原始输入对"]
  B["显式构造特征映射吗?"]
  C["核函数 计算"]
  D["在隐含空间里运行线性 SVM"]

  A --> B
  A --> C --> D

这张图展示了为什么说 kernel 能 不显式地把所有新特征都做出来,却依然有帮助。关键就在这条绕行路径:从原始输入对直接计算 similarity,然后像是在那个隐含的新空间里运行一个 linear SVM。

读者此时应该先留下的判断其实很简单。

  • 我能不能自己直接设计这些组合特征?
  • 还是我更想先决定要强调哪种相似度结构?

kernel 更接近第二个问题。

细部学习内容

polynomial 和 RBF 分别在暗示什么

这一节不需要把所有 kernel 都背下来。只要先抓住两个代表性名字各自在强调什么就够了。

polynomial kernel

  • 它更在意 feature 之间的乘积、平方和交互
  • x1^2x1*x2x2^2 这种组合看起来很重要时,就很容易想到它
  • 在入门层面,它可以被读成一种接近 显式加入很多交互特征 的想法

RBF kernel

  • 它更在意点周边的局部性(locality) 和基于距离的相似度
  • 它给人的感觉是:点一旦远开,相似度就会很快下降,而附近点的反应会更强
  • 在入门层面,它常被介绍成一种能让曲线 boundary 更灵活的代表 kernel

最简单的对比可以压成下面这样。

kernel 读者的第一感觉
polynomial 更强调交互特征
RBF 更敏感地强调附近的局部结构

同样的差别,也可以用更贴近实务的方式再读一次。

kernel 数据暗示的结构 读者的问题
polynomial 特征之间的乘积、平方、组合看起来很重要 是不是组合比单个值更重要?
RBF 附近的点形成局部团块,boundary 看起来是弯曲的 是不是附近区域的形状在分开 class?

所以,kernel 的名字不只是一个选项标签,它还在暗示 正在用什么镜头重新读数据

圆形结构应该怎样重读

XOR 是交互特征的代表性例子。相对地,当想到 RBF 时,通常更适合想象 中心和外圈 这样的圆形结构。

可以想象下面这种场景。

  • 靠近中心的点属于 class 0
  • 半径更大的外圈点属于 class 1

这时,只看 x1 或只看 x2 的直线 boundary 会显得别扭。但如果表示方式更强地在乎 离原点有多远 这种距离感,问题就会清楚得多。

在入门层面,这可以压成下面几句话。

  • polynomial 更自然地连接到 强调特征组合 的想法
  • RBF 更自然地连接到 强调局部或距离结构 的想法

所以,两者都在处理非线性,但它们并不是用同一种方式来读非线性。

如果把这个差异翻成项目记录语言,可以写成下面这样。

比较项 原始空间 新表示或 kernel 视角 读取方式
模糊案例 class 看起来混在一起 分离可能更清楚 表示一变,同一个案例也会被读成不同结构
是否需要 review 可能减少,或性质改变 review 问题本身也会跟着变化
下一个问题 线性标准是否不足? 哪种 kernel 更合适? 不要把表示问题和 boundary 问题拆开看

所以,kernel 这一节与其读成 公式更复杂了,不如读成 同一批案例在另一个空间里被重新排布了。即使最后分类结果看起来类似,也仍然要单独确认:哪些案例还在模糊,哪些案例变得更清楚。

logistic regression、linear SVM、kernel SVM 是怎样连起来的

这三种方法并不是三个完全隔离的世界。它们更大的不同,在于分别让读者先看 boundary 的哪个层面。

模型 中心想法
logistic regression 线性 score 与像 probability 一样的输出
linear SVM 留有更大 margin 的线性 boundary
kernel SVM 改变表示空间后,让原本看起来非线性的结构也能重新用 linear SVM 的想法来读

所以,kernel SVM 更准确的理解不是 抛弃 linear SVM,而是 把 linear SVM 所读取的空间变得更丰富

用课程语言再压缩一次,顺序是下面这样。

  • P4-11 的 logistic regression:学习线性 score 与 decision boundary
  • P4-13.1 的 SVM:在这些线性 boundary 里挑出更稳定的那条
  • P4-13.2 的 kernel:重新设计线性 boundary 所工作的空间本身

只要这个顺序抓住了,后面即使出现更多模型,读者也能重新整理成:这个模型改变的是 boundary、比较规则,还是表示方式?

什么算 boundary 调整,什么算表示改变

这一节里最容易混淆的地方,是把 把 boundary 调得更好改变表示空间 读成同一件事。

问题 更接近哪一节 现在应该这样读
能不能在同一坐标空间里找到更宽松的 boundary? P4-13.1 margin、support vector、soft margin 这一类问题
当前坐标空间本身,是否足够简单地揭示 class 结构? P4-13.2 kernel、显式 feature expansion、表示空间这一类问题

这个区分重要,是因为当直线 boundary 显得别扭时,读者不该立刻跳到 更复杂的模型,而应该先分开读:到底缺的是什么。

  • boundary 本身不够吗?
  • threshold 不够吗?
  • 距离规则不够吗?
  • 表示空间不够吗?

kernel 更接近这四个问题里的最后一个。

案例与示例

案例 1. 直线分不开,但交互特征一加入就能分开的不良模式

某个制造团队想用两个传感器来分类不良品。人最先看到的直觉不是 温度单独高压力单独高,而是 当两个值以某种组合一起出现时,不良会变多

团队先试了 linear model 和 linear SVM,但 boundary 总是显得不自然。如果只看每个轴,正常和不良样本会混在一起;一条直线很难把这种四个区域里对角交错的模式切干净。如果一直只把问题读成 还有没有更好的直线?,解释就会继续卡住。

flowchart TD
  A["传感器特征对"]
  B["原始特征空间"]
  C["线性边界仍然很别扭"]
  D["加入交互视角"]
  E["新的特征空间"]
  F["线性分离变得更清晰"]

  A --> B --> C
  A --> D --> E --> F

在这个场景里,kernel 的想法更接近 先换表示方式试试,而不是 直接把 boundary 画得更复杂。如果开始认真看待像两个传感器数值的乘积或平方这类交互特征,原来空间里看起来纠缠的模式,在新表示空间里就可能像一条更简单的线性 boundary。也就是说,变的不是数据,而是读取数据的坐标系。

可见的结果来自前后对比:原始表示下分离依旧很别扭,而一旦把交互特征纳入考虑,class 就会分得更清楚。这样一来,读者就能解释:kernel 不是 魔法函数,而是 重新设定表示空间的想法

案例 2. 实务上什么时候该把 kernel-based SVM 当成候选

这里也适合把记录结构一起固定下来。kernel 这一节不只是学习 另一个函数名,而是在记录 同一个案例在另一种表示空间里会怎样被重读。所以,最好把原始空间里哪些案例模糊、新表示里它们怎样被重新排布、review 目标有没有减少或改变,一起记下来。这种变化首先应该被读成一种信号,说明 在相近分数下,哪些失败模式更容易被分开了;而不该被读成只要换了表示,就已经把原因解释完了。

一起留下的记录 为什么需要
原始空间里的模糊案例 为了回看线性分离为什么显得别扭
新表示空间里的重新排布 为了确认哪些案例变得更清楚
review 状态变化 为了看表示改变是否真的减少了 review 目标
下一个问题 为了决定接下来先看 polynomial、RBF,还是显式 feature expansion

如果把 kernel 的位置重新带回实务问题,kernel-based SVM 并不是所有问题的默认选项。但在下面这些场景里,它可以成为候选。

场景 为什么会成为候选
线性模型的表现一直显得模糊 单靠直线 boundary 可能读不到真正的结构
feature 之间的交互看起来很重要 polynomial 风格的想法可能更合适
数据规模不是极大,而且 boundary 的形状本身很重要 kernel-based boundary 可以更灵活
维度不算高,但模式看起来是弯曲的 可能需要比 linear SVM 更丰富的表示

反过来,如果数据非常大,或 real-time prediction cost 特别重要,kernel-based 方法就可能变成负担。这一点会在 P4-9 的 hyperparameter 和计算成本讨论里再接回来。

读者常见的误解也要一起拆开。

  • 只要看起来是非线性,就一定该直接上 kernel SVM 吗? 不是。
  • 只要线性模型显得不强,就该立刻换更复杂的 kernel 吗? 也不是。

通常更稳妥的读取顺序是下面这样。

  1. 先检查 feature scale 和 preprocessing 是否合适。
  2. 再确认线性 baseline 是否真的不够。
  3. 再看显式 feature expansion 或更简单的非线性标准。
  4. 最后才把 kernel-based SVM 提上候选。

保持这个顺序的原因,是 kernel 很强大,也因此很容易把 到底是什么真的变好了 这件事弄模糊。真正重要的不是尽快用上 kernel,而是能够说明 为什么线性不够,以及 为什么 kernel 正好补上了这个不足

学术背景与历史

kernel 的想法是在 SVM 走向更广泛应用的过程中一同重要起来的。Boser、Guyon、Vapnik 的 A Training Algorithm for Optimal Margin Classifiers 以及后续 kernel method 研究,打开了把 optimal-margin classifier 用到更灵活数据结构上的路径。

这一节真正想让读者留下的历史核心其实很简单:kernel 是一种计算上的绕行,让线性 boundary 的优势可以在更丰富的表示空间里被重新使用。

练习与示例

Python 例子:重新读一个 XOR 形状

最简单的确认方式,就是重新读一个 XOR 形状的例子。这个例子会直接让读者看到 为什么要改变表示方式

  • 问题场景:四个点在对角线上交错成两个 class
  • 输入(input):x1, x2
  • label:class 0 / class 1
  • 要检查的概念:
  • 在原始坐标里,像 x1 + x2 这样的简单线性读取并不自然
  • 一旦加上 x1 * x2 这个新特征,class 就会简单得多
# 这个例子为了理解 kernel,把原始坐标转换到新的特征空间并检查可分性。
points = [
    ((-1, -1), 0),
    ((-1,  1), 1),
    (( 1, -1), 1),
    (( 1,  1), 0),
]

print("original space")
for (x1, x2), label in points:
    print((x1, x2), "label=", label, "x1+x2=", x1 + x2)

print()
print("transformed space with z = x1 * x2")
for (x1, x2), label in points:
    z = x1 * x2
    print((x1, x2), "label=", label, "z=", z)

示例输出如下。

original space
(-1, -1) label= 0 x1+x2= -2
(-1, 1) label= 1 x1+x2= 0
(1, -1) label= 1 x1+x2= 0
(1, 1) label= 0 x1+x2= 2

transformed space with z = x1 * x2
(-1, -1) label= 0 z= 1
(-1, 1) label= 1 z= -1
(1, -1) label= 1 z= -1
(1, 1) label= 0 z= 1

这个结果里最关键的点很清楚。

  • 在原始空间里,四个点按对角线交错,直线 boundary 很别扭。
  • 但只要看 z = x1 * x2,class 0 就聚到 z = 1,class 1 就聚到 z = -1

所以,不是数据变了,而是 表示方式 变了。

这件事之所以重要,是因为它能阻止读者把 kernel 误解成只是 让模型变成非线性的技巧。更准确的读取顺序是下面这样。

  1. 在原始坐标里,class 看起来是交错的。
  2. 加上一个新特征以后,结构变简单了。
  3. 在那个更简单的空间里,线性 boundary 的想法又重新有用了。

所以,kernel 与其说应该被介绍成 直接抓住非线性问题的技术,不如说更适合被介绍成 重新找回可线性读取表示的技术

如果用同一个小场景把 Module 4 再比较一次

当把 Module 4 整体重读时,通常比起按算法名字排列,更有用的是按 同一个问题场景里,每个模型首先让读者比较什么 来组织。下面这张表的作用,就是防止 kernel 太快被读成 高级模型

同一个场景 优先想到的模型 首先要看的比较轴 立刻留下的下一个问题
用广告费、季节、访问量去预测销售额这类连续值 linear regression 平均误差是否真的比 baseline 更好 直线漏掉的大误差段在哪里?
要把客户流失切成 0/1,同时还想一起看 score 和 policy logistic regression score、threshold、边界附近案例 要改 threshold,还是要补更多 feature?
想先通过相似老客户来判断新客户 k-NN 哪些 neighbor 被纳入,k 一改结果怎么摇晃 要不要重新调整 distance rule 或 scale?
同一个分类问题里,想要一条更有余量的 boundary linear SVM margin 附近案例,以及像 support vector 一样的点 要不要调 C,还是继续看 soft margin?
直线 boundary 总是显得别扭,而且 feature 组合或弯曲结构看起来更重要 kernel SVM 同一批案例在表示空间改变后如何重新排布 polynomial、RBF、显式 feature expansion 该先看哪一个?

这个比较的重点并不是 谁更高级,而是把同一个场景里,不同模型会让读者先问什么,再次固定下来。

通用记录语言 Module 4 比较里应立刻留下的内容
看见的结构 同一个分类问题也可以分别从 score、邻居、margin、表示空间这些问题来读取
解释边界 更复杂的候选不一定天然更适合作为第一出发点,也不一定更容易解释
下一个问题 现在真正不足的,是否该先区分成平均误差、threshold policy、距离规则、boundary 余量,还是表示空间本身?

检查清单

  • 是否把现在困难的是直线 boundary 不足,还是 feature representation 不足,这两件事区分开了?
  • 能不能把 kernel 解释成观察另一表示空间的镜头,而不是新的魔法函数?
  • 是否记录了同一批案例在新表示空间里是怎样重新排布的?
  • 即使线性 boundary 看起来不够,能不能说明第一步不是立刻丢掉线性思路,而是先问 表示空间改变后,线性 boundary 会不会重新有意义
  • 能不能说明 kernel 是一种用原始空间计算来处理更丰富空间相似度的想法?
  • 能不能说明 polynomial 更强调交互特征,而 RBF 更强调局部相似度结构?

出处与参考资料