跳到主要内容

支持向量机 — 最宽的边界,与升维的魔法

这一章讲两件事: 同样是画一条直线边界,凭什么支持向量机的常常更好; 以及直线切不开的圆形数据,怎么靠「抬进维数更多的空间」起死回生。 原书还留了一句时代坐标:在深度学习出现之前,使用了核方法的支持向量机非常受欢迎1——它是 2012 年前这个领域的默认答案。

1. 顶层全景

问题一:直线边界有很多条,选哪条?
↓ 支持向量机的答案:离两边数据都最远的那条(间隔最大化)
↓ 说了算的只有离边界最近的几个点 = 支持向量
问题二:数据围成一圈,直线根本切不开怎么办?
↓ 把数据抬进更高维的空间,在那里变成能用平面切开的形状
↓ 核函数:不用真的去高维,也能享受高维的效果
代价:模型从此说不清「我用了哪些特征」

图说:上下两个问题对应本章两节;一纵一横,先立后破。

2. 间隔:边界之间的空地有多宽

支持向量机(Support Vector Machine,SVM)应用范围极广,分类回归都行;本节取它处理二元分类的一面2。它和逻辑回归一样画直线边界,但选边界的标准不同:逻辑回归只求分对,SVM 额外要求边界尽可能地远离数据——原书把这个标准叫间隔最大化3。同一份数据,两者都能分对,但 SVM 的分类结果常常更佳4

间隔的定义:训练数据里离决策边界最近的那些点,到边界的距离5。间隔最大化,就是把这个「最近距离」拉到最大:

○ ○ ○ ○ ○ ○
╲ ╲
──┼── 边界A(贴着×) ──┼── 边界B
╱ 间隔窄 ╱ 间隔宽
× × × × × ×

图说:两条边界都能把 ○ 和 × 分对。
边界A离两边的点都近,新数据稍微一偏就判错;
边界B两边留足空地,同样偏一点仍然判对。SVM 选 B。
(本图为示意,点的排布是为演示编的。)

直观理由一句话:分对只管训练数据,空地管的是没见过的数据。边界离数据越远,新样本落错边的余量越大——这正是「泛化」这个老话题在几何上的样子。

主走查:谁是「说了算」的点

先认识三条规矩。允许数据进间隔内侧之前(硬间隔)和允许之后(软间隔)的完整分类里,训练数据分三种6:

数据位置角色对边界的影响
间隔外侧(离边界比间隔远)普通群众零影响
正好在间隔上支持向量决定边界
间隔内侧(或被误分类)支持向量决定边界

原书给了明确定义:间隔上的数据和间隔内侧的数据合称支持向量,它们是确定决策边界的重要数据;间隔外侧的数据不会影响边界的形状7。「支持向量机」这个名字,机就是这台机器,支持的「向量」就是这几个点。

拿一组演示数据走一遍(坐标为演示编的,不是书中数据):

○ 类:(1, 3) (2, 2.8) (3, 3.2) × 类:(1, 0.8) (2, 1.2) (3, 0.9)
学出的边界:y = 2(水平线),间隔 = 0.8

逐点检查:
○(1,3) 距边界 1.0 > 0.8 → 间隔外侧 → 对边界零影响
○(2,2.8) 距边界 0.8 = 间隔 → 间隔上 → 支持向量,顶住边界的上沿
×(2,1.2) 距边界 0.8 = 间隔 → 间隔上 → 支持向量,顶住边界的下沿
×(1,0.8) 距边界 1.2 → 外侧 → 零影响
×(3,0.9) 距边界 1.1 → 外侧 → 零影响
(两侧最近距离同为 0.8——这正是「间隔最大化」后的边界。)

现在把 ○(1,3) 从 y=3 挪到 y=5:边界纹丝不动(它在间隔外);
把 ○(2,2.8) 挪到 y=3.2:边界立刻被顶上去(支持向量动了)。

这就是「支持」的含义:整条边界被最近的几个点顶住,远处的点堆一万条也撼不动它。反过来看也是它的软肋——支持向量上的噪声会直接把边界拽走。

3. 软间隔:允许少数人站进空地

严格到「一个点都不许进间隔」的规矩叫硬间隔;但现实数据很少能完美切开,所以要允许一部分数据进入间隔内侧,这就是软间隔8

为什么放行反而更好?原书做了一个对照实验:在训练数据里特意加了一个偏离值,分别用硬间隔和软间隔训练。硬间隔的边界被这个偏离的坏点拽得大幅变形;软间隔的边界几乎不动9。道理正是主走查里那条:硬间隔逼着边界去迁就每一个点(包括坏点),软间隔允许少数点站进空地换整体稳定。

允许进多少,由一个超参数控制,得靠网格搜索、随机搜索这类反复验证的手段来定10 (网格搜索的全貌在第 11 章)。原书示例代码用 LinearSVC 训练 50 个点的人造数据,验证正确率 1.011

4. 核方法:直线切不开,就换个世界切

线性边界的死穴一眼可见:决策边界必定是直线,碰上「每类数据围成一圈」的排布,怎么切都错12。核方法的支持向量机(SVC)就是解法。

主走查:升一维,圆变直线

原书的解释是「将数据移动到另一个特征空间,然后进行线性分割」:设想一个维数更多的空间(维,指的是坐标的个数;那样的空间,行话叫高维),训练数据的每个点在那里都有对应点,而且在高维空间里它们可以线性分开——实际看到的训练数据,就是那个高维空间投下来的影子13

原书用二维圆圈数据配图讲这个思路;我们把同一思路压成一维,让每个数都能写出来(数值为演示编的):

原始世界(1 维): 抬升后的世界(2 维,新坐标 z = x²):
×(−2) ○(−0.5) ○(0.5) ×(2) ×(−2)→z=4 ○(−0.5)→z=0.25
直线怎么切都会错两边的类。 ○(0.5)→z=0.25 ×(2)→z=4

z = 0.6 处一刀竖切:
左边全是 ○,右边全是 ×。

在 2 维世界里是「一条直线」的边界,
投影回 1 维世界,变成了两个区间——
原始世界里那个切不开的「圆」,在高维就是个普通的半平面。

核函数:不去高维,也能吃到高维的好处

问题:真把数据搬到高维,计算量会爆。核函数的妙处在于:高维空间里 SVM 真正用到的只是「点与点的内积」,而存在一类函数能直接算出高维内积的结果、却不用真的把点抬上去。原书的表述:核函数让核方法可以直接使用在高维空间中学到的决策边界,而无须构建具体的高维空间14

常用的核函数一族:线性核(等价于线性支持向量机)、Sigmoid 核、多项式核(二次的学到圆形边界)、RBF 核(径向基函数,scikit-learn 的 SVC 默认用它)15。换核=换边界的形状。原书实验:300 个围成一圈的数据点,默认 RBF 核,验证正确率 0.977816

RBF 核自带一个超参数 γ(伽马),调它等于调边界的「弯度」:原书把 γ 设成 3.0,学出的边界明显更复杂;γ 越大边界越复杂17

5. 账单:精度换解释

核方法的代价,原书写得很直白(精度:预测得有多准):用了核,我们已经不知道模型使用的是什么特征了——模型适合「相比特征的可解释性更看重精度」的场景18

回忆第 03 章那张鸢尾花系数表:「花瓣越长越可能是杂色鸢尾」能拿去开会。换成 RBF 核之后,这句话没了——边界还在,但没人能说清它是哪几个特征的什么组合。原书据此给了条使用纪律:不宜一上来就用非线性(非一条直线所能切分)的核,应先用线性核分析、了解数据19。这条纪律值得原样带走。

判断(我们的,不是书里的): 原书「先线性后核」的纪律可以再推一步——核方法的适用前提是特征本身设计得像样。今天很多表格数据任务上,先调好特征再上简单模型,常常比直接堆核方法收益大;核方法真正的主场是特征难以人工设计、数据条数中等(几千到几万)的分类。 如果错,会错在: 若数据量到了十万级以上,核方法的训练开销会盖过它的精度优势,此时应直接转向树集成或神经网络;把它们排除在外,这条判断就错了。

6. 作者的判断与证据

说法性质依据
SVM 与逻辑回归同分对,但 SVM 结果更佳书内给同数据对照图,未给数字差值图示对照4
硬间隔被偏离值带偏、软间隔稳书内对照实验(特意加偏离值)实验设计写在书内9
核函数无须构建高维空间作者转述通行解释(「常见解释是…」),数学证明原书未给书内注明这是「一个常见解释」13
RBF γ=3.0 边界更复杂书内图示对照,没给数字证据图示17
「间隔最大化泛化更好」为什么成立书内只给几何直观(空地留余量),没有给理论证明——间隔与泛化的严格关系(间隔界)超出本书范围我们补充说明

7. 边界与局限

  • SVM 的间隔最大化只对「边界附近」负责;数据在远处怎么摊开,它不在乎。两个类 远离边界处互相穿插 时,它不会主动修。
  • 核方法丢掉特征可解释性之外,原书没有展开的还有:数据条数一多,训练开销按条数的平方级增长、多分类要拆成多个二元问题——这两点原书均未提(补充:不在书里,来自通用知识)。
  • 软间隔超参数与 RBF 的 γ 都要验证着调,原书只点名列了网格搜索/随机搜索的名字,流程在第 11 章。
  • 版本提示:LinearSVC 用于线性场景、SVC 默认 RBF 核;原书示例的输出 1.0 与 0.9778 均因随机划分数据而每次不同1116

8. 可带走的

  1. SVM 选边界的标准不是「分对」,是「离两边都尽量远」(间隔最大化);
  2. 支持向量说了算:只有离边界最近的几个点影响边界,远处的点再多也无效——调试时先看边界上的点;
  3. 这也是软肋:支持向量上的噪声直接拽歪边界,所以需要软间隔放行少数坏点;
  4. 软/硬间隔由超参数控制,用验证来调,不是拍脑袋;
  5. 圆形这类曲线边界的数据:抬进高维,直线就够用了;核函数 = 不付高维计算费,享受高维效果;
  6. RBF 是默认核,γ 越大边界越弯、越容易过拟合;
  7. 上了核,模型就说不清自己用了什么特征——要解释,回到线性;要精度,再上核;
  8. 使用纪律:先用线性核了解数据,再考虑非线性核。

9. 原文地图

主题原书章原文位置
SVM 定义、分类回归两用2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:2(搜「应用范围非常广泛的算法」)
间隔最大化基准2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:10(搜「尽可能地远离数据的决策边界」)
与逻辑回归对比2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:20(搜「分类结果更佳」)
间隔定义2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:29(搜「与决策边界之间的距离就称为间隔」)
硬间隔与软间隔2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:63(搜「称为硬间隔」) · text/09-ch02-04-2-4-4.txt:64(搜「这种情况叫作软间隔」)
数据三种、支持向量定义2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:74(搜「间隔外侧的数据」) · text/09-ch02-04-2-4-4.txt:78(搜「称为支持向量」) · text/09-ch02-04-2-4-4.txt:79(搜「不会影响决策边界的形状」)
硬间隔导致过拟合2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:82(搜「可能会导致学习结果对数据过」)
偏离值对照实验2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:91(搜「特意加上了偏离值」) · text/09-ch02-04-2-4-4.txt:93(搜「不容易受到偏离值的影响」)
软间隔超参数、网格/随机搜索2.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:95(搜「网格搜索」)
LinearSVC 示例、正确率 1.02.4 算法4:支持向量机text/09-ch02-04-2-4-4.txt:44(搜「make_blobs」) · text/09-ch02-04-2-4-4.txt:57(搜「1.0」)
深度学习之前广受欢迎2.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:4(搜「非常受欢迎」)
线性边界分不了圈形数据2.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:13(搜「必定为直线」)
移到特征空间、高维投影2.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:24(搜「将数据移动到另」) · text/10-ch02-05-2-5-5.txt:28(搜「比训练数据更高维的」) · text/10-ch02-05-2-5-5.txt:33(搜「来自于该高维空间的投影」)
核函数免构建高维2.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:54(搜「而无须构建具体的」)
四种核、默认 RBF、γ=3.02.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:60(搜「默认使用 RBF」) · text/10-ch02-05-2-5-5.txt:91(搜「等价于线性支持向量机」) · text/10-ch02-05-2-5-5.txt:93(搜「学习到了圆形的决策边界」) · text/10-ch02-05-2-5-5.txt:98(搜「超参数 γ 设置为 3.0」)
精度换解释、先线性后核2.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:103(搜「不知道模型使用的是什么特征了」) · text/10-ch02-05-2-5-5.txt:104(搜「更看重精度」) · text/10-ch02-05-2-5-5.txt:106(搜「应先使用线性」)
SVC 示例、正确率 0.97782.5 算法5:支持向量机(核方法)text/10-ch02-05-2-5-5.txt:70(搜「make_gaussian_quantiles」) · text/10-ch02-05-2-5-5.txt:77(搜「0.9777」)

Footnotes

  1. 出处:「2.5 算法5:支持向量机(核方法)」第 4 段(text/10-ch02-05-2-5-5.txt:4,搜「非常受欢迎」)。

  2. 出处:「2.4 算法4:支持向量机」第 2 段(text/09-ch02-04-2-4-4.txt:2,搜「应用范围非常广泛的算法」)。

  3. 出处:「2.4 算法4:支持向量机」第 10 段(text/09-ch02-04-2-4-4.txt:10,搜「尽可能地远离数据的决策边界」)。

  4. 出处:「2.4 算法4:支持向量机」第 20 段(text/09-ch02-04-2-4-4.txt:20,搜「分类结果更佳」)。对照图 2-17。 2

  5. 出处:「2.4 算法4:支持向量机」第 29 段(text/09-ch02-04-2-4-4.txt:29,搜「与决策边界之间的距离就称为间隔」)。

  6. 出处:「2.4 算法4:支持向量机」第 74 段(text/09-ch02-04-2-4-4.txt:74,搜「间隔外侧的数据」)、第 75 段(搜「间隔上的数据」)、第 76 段(搜「间隔内侧的数据」)。

  7. 出处:「2.4 算法4:支持向量机」第 78 段(text/09-ch02-04-2-4-4.txt:78,搜「称为支持向量」)与第 79 段(text/09-ch02-04-2-4-4.txt:79,搜「不会影响决策边界的形状」)。

  8. 出处:「2.4 算法4:支持向量机」第 63 段(text/09-ch02-04-2-4-4.txt:63,搜「称为硬间隔」)与第 64 段(text/09-ch02-04-2-4-4.txt:64,搜「这种情况叫作软间隔」)。

  9. 出处:「2.4 算法4:支持向量机」第 91 段(text/09-ch02-04-2-4-4.txt:91,搜「特意加上了偏离值」)与第 92~93 段(text/09-ch02-04-2-4-4.txt:92,搜「受偏离值的影响很大」)。 2

  10. 出处:「2.4 算法4:支持向量机」第 94~95 段(text/09-ch02-04-2-4-4.txt:95,搜「网格搜索」)。

  11. 出处:「2.4 算法4:支持向量机」第 44 段(text/09-ch02-04-2-4-4.txt:44,搜「make_blobs」)与第 57 段(text/09-ch02-04-2-4-4.txt:57,搜「1.0」)。原书注明每次运行结果可能不同。 2

  12. 出处:「2.5 算法5:支持向量机(核方法)」第 13 段(text/10-ch02-05-2-5-5.txt:13,搜「必定为直线」)。

  13. 出处:「2.5 算法5:支持向量机(核方法)」第 24 段(text/10-ch02-05-2-5-5.txt:24,搜「将数据移动到另」)、第 29 段(搜「比训练数据更高维的」)、第 33 段(text/10-ch02-05-2-5-5.txt:33,搜「来自于该高维空间的投影」)。 2

  14. 出处:「2.5 算法5:支持向量机(核方法)」第 54 段(text/10-ch02-05-2-5-5.txt:54,搜「而无须构建具体的」)。「核方法真正用的只是内积」这层机制原书未展开,来自通用知识。

  15. 出处:「2.5 算法5:支持向量机(核方法)」第 60 段(text/10-ch02-05-2-5-5.txt:60,搜「默认使用 RBF」)、第 82 段(搜「得到的决策边界的形状也不同」)、第 91 段(搜「等价于线性支持向量机」)、第 93 段(搜「学习到了圆形的决策边界」)。

  16. 出处:「2.5 算法5:支持向量机(核方法)」第 77 段(text/10-ch02-05-2-5-5.txt:77,搜「0.9777」);数据在第 70 段(搜「make_gaussian_quantiles」)。 2

  17. 出处:「2.5 算法5:支持向量机(核方法)」第 98 段(text/10-ch02-05-2-5-5.txt:98,搜「超参数 γ 设置为 3.0」)与第 99 段(搜「更复杂的决策边界」)。 2

  18. 出处:「2.5 算法5:支持向量机(核方法)」第 103 段(text/10-ch02-05-2-5-5.txt:103,搜「不知道模型使用的是什么特征了」)与第 104 段(text/10-ch02-05-2-5-5.txt:104,搜「更看重精度」)。

  19. 出处:「2.5 算法5:支持向量机(核方法)」第 106 段(text/10-ch02-05-2-5-5.txt:106,搜「应先使用线性」)。