**摘要:**本文以苹果与梨的水果分类案例为切入点,系统梳理感知机从模型、学习策略到学习算法的完整脉络,介绍原始形式的更新公式、收敛性证明与对偶形式,并进一步扩展到口袋算法、表决感知机、平均感知机和带边缘感知机等变体。对比了几种算法的思路与适用场景,区分函数边缘与几何边缘。
假设我们要教计算机区分苹果和梨。人可以观察颜色、形状和大小,但计算机需要先把这些特征变成数字。例如,用糖度评分和红色评分描述一种水果,再根据这两个数字判断它属于哪一类。
如果把每个水果画成平面上的一个点,分类问题就变得直观了:能不能找到一条直线,让苹果位于直线的一侧,梨位于另一侧?
感知机就是从这个问题出发的。它先尝试分类,遇到分错的样本就调整参数,直到找到合适的分界线。理解感知机,不仅能掌握一种线性分类算法,也能理解损失函数、随机梯度下降、模型表达能力和边缘这些机器学习中的基本概念。
本文沿着李航《统计学习方法》第2版第2章的模型、策略与算法展开,介绍原始形式、收敛性和对偶形式,再补充口袋算法、表决感知机与带边缘感知机。后三者作为扩展内容单独介绍。
目录
[1、 数据集的线性可分性](#1、 数据集的线性可分性)
一、感知机模型
1、从水果分类案例开始
为了方便计算,我们构造三个教学样本。
| 样本 | 糖度评分 x₁ | 红色评分 x₂ | 类别 y |
|---|---|---|---|
| A | 3 | 3 | 苹果 +1 |
| B | 4 | 3 | 苹果 +1 |
| C | 1 | 1 | 梨 −1 |
这里的评分和标签仅用于说明算法,不代表真实水果的普遍规律。每个水果可以写成一个特征向量:
x = (x₁, x₂)ᵀ
感知机首先计算一个分数:
f(x) = w₁x₁ + w₂x₂ + b = w · x + b
其中,w = (w₁, w₂)ᵀ 是权重,决定各个特征如何参与打分;b 是偏置,调整分类的门槛。接着,根据分数的正负输出类别:
y = sign(f(x)) = sign(w · x + b)
预测时,可以约定分数为零时输出某一类别。训练时,本文统一把下面的情况视为需要更新的情况,包括恰好落在分界线上的样本:
yᵢ(w · xᵢ + b) ≤ 0
2、公式与分界线的关系
假设权重和偏置为:
w = (1, 1)ᵀ,b = −3
那么分类模型为:
w · x + b = 0

图1 感知机模型与分类分界线
f(A) = 3,f(B) = 4,f(C) = −1
因此,A、B 被预测为苹果,C 被预测为梨。在二维空间中,分界面是一条直线;在三维空间中,它是一个平面;推广到更高维空间,统一称为超平面:
w · x + b = 0
其中,w 是超平面的法向量,决定它的朝向;在 w 固定时,改变 b 会让超平面平行移动。
还需要区分两个概念: 是分类分数,并不是属于正类的概率。分数为 3,不代表概率为 0.3 或 0.9。感知机直接学习从特征到类别的判别规则,是一种判别模型。
二、感知机学习策略
1、 数据集的线性可分性
模型规定了如何分类,学习策略则回答训练时依据什么标准寻找参数。给定训练集:
如果存在某组参数 w、b,使所有样本都满足 yᵢ(w · xᵢ + b) > 0,就称这个训练集是线性可分的。对于正类,标签为 +1,要求分类分数大于零;对于负类,标签为 −1,要求分类分数小于零。乘上标签后,两种情况就统一了。令:
mᵢ = yᵢ(w · xᵢ + b)
这个量称为样本的函数边缘,也常称函数间隔。它可以帮助我们判断分类情况。
| 函数边缘 | 含义 |
|---|---|
| mᵢ > 0 | 样本被正确分类 |
| mᵢ = 0 | 样本落在分界线上 |
| mᵢ < 0 | 样本被错误分类 |
但不是所有数据都能用一条直线分开,需要线性可分数据。图2右侧是经典的异或型数据:正类占据一条对角线的两个端点,负类占据另一条对角线的两个端点。无论怎样移动或旋转直线,都无法把两类完全分开。从几何上看,两类样本的凸包在中心相交,因此不可能被一条直线严格分隔。训练失败有时来自模型的表达能力,而不是训练次数不够。单个感知机在当前特征空间中只能产生线性分界面。通过非线性特征变换,可以改变数据的可分性;仅仅增加原始感知机的训练轮数,无法解决原特征空间中的异或问题。(但这种可以采用升维的方式,讲数据映射到高维的线性可分空间中对数据进行分割。前面第1章所说的核方法就是实现解决这个问题)

图2 线性可分数据与异或数据的比较
2、为什么不直接最小化分错的数量
最直接的想法是数一数有多少样本被分错,错误越少越好。但是,错误计数对于参数的变化往往不够敏感。分界线移动了一点,只要没有跨过样本,错误数量就保持不变,很难直接提供有效的梯度方向。
感知机采用另一种思路:不仅关注有没有分错,还利用误分类样本的负分数构造损失。当 yᵢ(w · xᵢ + b) < 0 时,样本到超平面的距离为:
对于误分类样本,其函数边缘为负,因此距离也可以写成:
这给出了几何上的启发。不过,实际使用的感知机损失省去了归一化因子:
其中,M 是当前误分类及边界样本的索引集合。也可以统一写成:
对于同一组参数,正确分类样本的损失为零;错误分类样本的函数边缘越负,损失越大。
需要注意:这个损失由距离得到启发,但它并不等于真实距离之和。由于权重范数也随参数变化,不能认为省略归一化因子之后,优化问题仍然完全相同。
3、零损失与停止条件的区别
如果初始化为:
w = 0,b = 0
所有样本的分数都是零,感知机损失也恰好为零,但此时显然没有学到有效的分类边界。因此,不能只根据损失为零判断训练完成。
标准感知机算法会在 yᵢ(w · xᵢ + b) ≤ 0 时继续更新;只有所有样本都满足严格的 yᵢ(w · xᵢ + b) > 0,才达到完全分开的目标。在边界点处,损失不可微,算法可以选取一个非零次梯度进行更新。理解这一点,能够避免把全零参数误判为已经训练成功。
三、感知机学习算法
1、原始形式的更新公式
对一个需要更新的样本,考虑它对应的损失:
L(w, b) = −yᵢ(w · xᵢ + b)
在误分类区域,其梯度为:
沿**梯度(梯度是导数在多元函数中的推广)**反方向调整参数,就得到:
w ← w + ηyᵢxᵢ,b ← b + ηyᵢ
其中,η 是学习率。每次使用一个违规样本进行更新,可以从随机梯度或次梯度的角度理解这一学习过程。
原始形式的执行步骤如下:
- 初始化权重和偏置,常用全零初始化。
- 逐个检查训练样本。
- 遇到函数边缘非正的样本,就按上述公式更新参数。
- 重复扫描,直到完整一轮都不需要更新。
实际程序通常还会设置最大训练轮数,避免在不可分数据上无限运行。
2、为什么这个更新方向有效
从直觉看,正类被分错,就把权重向它的方向调整;负类被分错,就把权重向它的反方向调整。还可以直接计算更新前后的函数边缘:
利用 yᵢ² = 1,可以化简为:
也就是说,每次更新都会让当前这个样本朝正确分类的方向前进。
不过,一次更新未必足以立刻分对这个样本,也可能破坏其他样本原本正确的分类。因此,算法需要反复扫描数据,不能只检查一次;训练集上的整体错误数量也不保证每一步都下降。
3、三个样本的完整手算过程
继续使用前面的样本:
令:
按 A、B、C 的顺序循环扫描。下表只记录发生参数更新的时刻,没有更新的检查步骤不单独列出。
| 更新次数 | 触发样本 | 更新前函数边缘 | 更新后的 w | 更新后的 b |
|---|---|---|---|---|
| 1 | A | 0 | (3, 3) | 1 |
| 2 | C | −7 | (2, 2) | 0 |
| 3 | C | −4 | (1, 1) | −1 |
| 4 | C | −1 | (0, 0) | −2 |
| 5 | A | −2 | (3, 3) | −1 |
| 6 | C | −5 | (2, 2) | −2 |
| 7 | C | −2 | (1, 1) | −3 |
例如,第2次更新发生前,权重为 (3, 3),偏置为 1。负类样本 C 的分数为:
它被错分为正类,因此执行:
整个过程中,分界线不断移动。图3选取了其中四个时刻。

图3 感知机训练过程中分界线的变化
最终得到:
三个样本的函数边缘分别为:
它们全部严格大于零;再扫描一轮也不再发生更新,训练完成。算法不要求权重每一步都看起来更合理。中途甚至会再次出现全零权重,但后续更新仍然可以找到正确分界线。
4、感知机的收敛性
感知机收敛定理告诉我们:对于有限的线性可分训练集,从零开始,采用固定的正学习率并持续检查违规样本,感知机经过有限次更新可以找到一个分离超平面。
为了把偏置一起处理,定义增广向量:
于是:
以学习率为1为例。假设存在单位向量 ,使得:
那么更新次数满足:
证明的关键,是从两个方向约束参数的增长。每次更新,参数在正确分离方向上至少前进,因此:
另一方面,只有当前函数边缘非正时才更新,所以一次更新满足:
从全零参数开始累加,得到:
结合柯西不等式:
就能推出更新次数上界。这里的 定义在增广空间中,不要与原始特征空间中的几何边缘混用。这个结论依赖训练集线性可分,只保证找到一个分离超平面;它不保证找到最大间隔的超平面,也不直接保证新样本上的分类效果。样本访问顺序不同,最终得到的参数也可能不同。
四、口袋算法
1、不可分数据带来的困难
现实数据可能存在噪声、标签错误或类别重叠。如果训练集根本不存在一条能完全分开的直线,普通感知机就可能不断调整:修正这个样本,又分错另一个样本。
如果训练被强行停止,最后一次得到的参数,未必是整个训练过程中表现最好的参数。口袋算法的想法是:继续尝试,但把目前最好的参数装进口袋。
下面介绍一种容易实现的版本:每次更新后,都在完整训练集上评估候选参数,仅在错误计数严格减少时替换口袋中的参数。这体现了带棘轮机制的口袋思想。
2、保存历史最佳参数
为与前面的训练规则一致,把边界点也计入错误:
这里的 E 是包含边界违规的计数,与采用某个零分预测约定后的普通分类错误率可能略有不同。算法同时维护两组参数:当前参数继续接受感知机更新;口袋参数保存到目前为止错误计数最少的模型。
基本过程如下:
- 初始化当前参数 w, b
- 将当前参数复制到口袋 best_w, best_b
- 计算口袋参数的错误计数 best_error
- 重复执行,直到用完更新预算:
- 找到一个当前模型需要修正的样本
- 如果不存在这样的样本:停止
- 按普通感知机规则更新当前参数
- 在完整训练集上计算当前错误计数 error
- 如果 error < best_error:
- 复制当前参数到口袋
- best_error = error
- 返回口袋参数
当前参数即使变差,也可以继续探索;最终返回的是口袋中的参数,而不是最后一次得到的参数。保存权重时应复制数值,避免口袋权重与当前权重指向同一个可变数组。
3、在异或数据上观察效果
对前面的四个异或样本运行这一过程,随机选择当前违规样本并更新,共执行60次更新。固定随机种子后,得到图4所示曲线。

图4 口袋算法的当前错误计数与历史最佳错误计数
灰线表示当前参数的错误计数,它会反复波动;橙线表示口袋参数的错误计数,只会保持或下降。这次运行中,口袋最终保存了一个只错1个样本的模型,其训练错误计数占比为25%。
异或数据不能被单条直线完全分开,而这里已经找到只错1个样本的模型,因此该案例在线性分类器下的最佳错误计数就是1。
但这不代表口袋算法在一般问题上都能在有限预算内找到全局最优解。它保存的是已经访问过的候选参数中最好的一组,新数据上的表现仍然需要验证。
五、表决感知机
1、让历史模型共同判断
口袋算法从历史模型中挑选一个最好者。另一种思路是:训练过程中产生过许多模型,可以让它们一起投票。这就是表决感知机的核心思想。
一个模型如果能连续正确处理很多样本,就会较长时间不发生更新。我们称它存活得更久。表决感知机保存历史参数及其存活计数:
其中,是第 k 个模型的表决权重。一种常见计数约定是:新参数产生时将计数设为1,此后每正确处理一个样本,计数加1;下一次发生更新时,保存旧模型及其计数,再建立新模型。训练结束时,也要保存最后一个模型。
预测新样本时,每个历史模型先给出类别:
然后进行加权表决:
因此,存活计数更大的模型拥有更多票。预测分数为零或总票数打平时,需要预先约定处理方式。存活计数衡量的是模型在训练序列中的持续表现,并不是严格的概率置信度。
2、一个加权投票案例
假设三个历史模型对某个新水果作出如下判断。这个表格是用于解释规则的假设例子。
| 模型 | 存活计数 | 预测类别 | 加权票数 |
|---|---|---|---|
| 模型1 | 12 | +1 | +12 |
| 模型2 | 8 | +1 | +8 |
| 模型3 | 3 | −1 | −3 |
最终票数为:12+8-3=17>0
所以输出正类。即使最后产生的模型预测为负类,历史模型的综合判断仍然可能是正类。

图5 按模型存活计数进行加权表决
3、与平均感知机的区别
表决感知机先取符号,再加权:
平均感知机则先合并参数,再取符号:
两种运算的顺序不同,结果也可能不同。例如,仍使用权重12、8、3,假设三个模型的原始分数依次为0.2、0.4和−10。加权表决看的是正负号,总票数为17,大于零;平均参数对应的加权分数分子则是:
分母为正,不影响符号。因此两者给出了相反判断。
平均感知机最终仍然是一个线性分类器;表决感知机组合了多个分类器的符号判断,最终边界未必是一条直线。作为代价,直接保存并使用全部历史模型需要更多存储和预测计算。
六、带边缘感知机
1、分对之后为何还要更新
普通感知机只在函数边缘非正时更新。只要函数边缘大于零,就认为这个样本已经处理好了。但一个正类样本即使得分只有0.001,也满足这个条件。在当前参数下,它可能紧贴分类边界,很容易因输入的小幅变化而改变预测。
带边缘感知机把更新范围扩大:不仅修正分错的样本,也修正已经分对、但边缘不足的样本。
2、加入正的边缘阈值
这里采用固定函数边缘阈值的版本。设阈值为 ,将更新条件改为:
更新公式仍然是:
例如,取阈值为1,两种方法的区别如下。
| 函数边缘 | 普通感知机 | 带边缘感知机 |
|---|---|---|
| −2 | 更新 | 更新 |
| 0 | 更新 | 更新 |
| 0.4 | 不更新 | 更新 |
| 2 | 不更新 | 不更新 |
固定函数边缘阈值是经典带边缘感知机的一种定义;其他变体也可以使用归一化后的边缘条件,阅读时需要先确认定义。
3、回到水果分类案例
仍使用权重 (1, 1) 和偏置 −3,再加入两个教学样本:D 的坐标为 (1.7, 1.7),标签为正类;E 的坐标为 (1.2, 1.2),标签为负类。它们的函数边缘分别为:
两者都已经分对,因此普通感知机不更新。但如果阈值为1,它们都没有达到边缘要求,带边缘感知机会继续调整参数。

图6 普通感知机与固定函数边缘感知机的更新范围
图中的虚线对应分数为+1和−1的两条直线。在当前参数下,正确分类但落在阴影带内的样本也会触发更新;误分类样本则无论是否位于阴影带内,都需要更新。
从损失角度,可以使用:
当阈值为1时,这就是常见的合页损失形式。在阈值处,可以选择产生更新的次梯度。
七、几种算法的比较
| 方法 | 主要思路 | 最终如何预测 | 需要注意什么 |
|---|---|---|---|
| 普通感知机 | 遇到误分类或边界样本就更新 | 使用最终一组参数 | 完全分开的收敛保证依赖线性可分 |
| 口袋算法 | 保存访问过的最好参数 | 使用口袋参数 | 有限预算内不保证找到全局最优 |
| 表决感知机 | 按存活计数整合历史模型 | 多个模型加权表决 | 需要保存更多历史信息 |
| 平均感知机 | 平均历史参数 | 使用平均后的参数 | 与对类别进行表决不同 |
| 带边缘感知机 | 边缘不足时也更新 | 使用最终一组参数 | 函数边缘与几何边缘需要区分 |
数据分不开时,口袋算法帮助我们保留一个较好的结果;最后一次参数不够稳定时,表决感知机利用历史信息共同判断;只要求分对还不够时,带边缘感知机进一步要求样本达到指定的函数边缘。
实际使用时还要留意特征量纲。某个特征的数值范围过大,会明显影响更新方向和幅度。可以根据训练数据拟合标准化变换,再用同一变换处理验证集和测试集。训练轮数、边缘阈值等选择应依据验证结果,不要反复利用测试集调参。