第 3 章 · 第 5 讲 / 共 7 讲
线性判别分析
换一条完全不同的路:不算概率,去找一个投影方向,让同类挤、异类远。
能写出 LDA 的目标 J 并说清分子分母各是什么;能解释 Sw、Sb 在量什么;能讲明白 w=Sw−1(μ0−μ1) 里那个逆矩阵到底在干什么,以及为什么多分类只要 N−1 维。
上一讲用「算概率」的思路做二分类。这一讲换一条路:不去算每个样本有多大概率,而是先找一个「看得最清楚的角度」,把数据压扁到一条线上再分。两条路都值得会——它们的适用条件和优缺点完全不同。
3.4 线性判别分析换一条完全不同的路
3.3 的思路是"算概率"。3.4 的思路完全不同:不去算概率,而是去找一个"最好的观察角度"。
线性判别分析(Linear Discriminant Analysis,LDA)在二分类问题上最早由 Fisher 在 1936 年提出,所以也叫"Fisher 判别分析"。
原书说它的思想"非常朴素",确实朴素,但要想透需要一点空间想象力:
把高维的数据"投影"到一条直线上,投影完之后,同类的点挤在一起,异类的点离得很远。然后在这条直线上切一刀就分开了。
为什么叫"投影"?想象你手里有一团三维的点(比如橘子和苹果混在一起)。你从某个角度看过去,它们在墙上留下影子。换个角度看,影子可能重叠在一起分不清;再换个角度,影子可能恰好分成两堆。LDA 要找的就是"分得最开的那一个角度"。
动手试试 · 这是本节的核心
这里有个特别值得注意的细节:滑块默认停在 −37°,那正好是两类中心连线的方向,此时 J ≈ 74。但最佳方向在 −47° 附近,J ≈ 240——差了整整 10 度,效果却好了三倍多。这 10 度的偏差,就是 Sw−1 干的活:因为两簇是沿"右上"方向被拉长的,直接沿中心连线看会被拉长的部分糊住,得先把那个方向压扁一点才行。
把"投影"写成数学
先摆记号。数据 D = {(xi, yi)},yi ∈ {0, 1}。对第 i 类(i 取 0 或 1),记:
| 符号 | 含义 |
|---|---|
| Xi | 第 i 类所有样本组成的集合 |
| μi | 第 i 类的均值向量(该类所有样本的中心点) |
| Σi | 第 i 类的协方差矩阵(描述该类样本散得多开、朝哪个方向散) |
现在把点投影到方向 w 上。投影的数学操作就是点积(内积)。所以:
- 类 0 的中心投影后,变成一个数:wTμ0;
- 类 1 的中心投影后,变成 wTμ1;
- 类 0 的"散开程度"投影后,变成 wTΣ0w;
- 类 1 的"散开程度"投影后,变成 wTΣ1w。
书上有一句容易被匆匆扫过的话:"由于直线是一维空间,因此 wTμ0、wTμ1、wTΣ0w 和 wTΣ1w 均为实数。"
这句话看着像废话,其实是提醒你别在后面的式子推导中把标量当向量处理。二维向量点积一个方向向量,结果是一个数(在直线上的坐标);矩阵夹在两个 w 中间变成二次型,结果也是一个数(散开的程度)。
把两个愿望写成一个分数
LDA 有两个"愿望",恰好是一对矛盾:
| 愿望 | 数学表达 | 想让它 |
|---|---|---|
| 同类要挤 | wTΣ0w + wTΣ1w | 尽可能小 |
| 异类要分 | ‖wTμ0 − wTμ1‖22 | 尽可能大 |
一个要小一个要大,怎么同时优化?让它们相除:分子要大、分母要小,整体就大。于是得到目标函数:
关键在一个很小但很容易卡住的地方:‖a‖22 的意思是"向量 a 的模长平方",而模长平方等于自己点乘自己:‖a‖2 = aTa。
这里的 a 是 wTμ0 − wTμ1,它是个标量(一个数),而标量等于它自己的转置。所以可以写成向量差的形式:a = (μ0−μ1)Tw。
那么 a2 = a·a = [(μ0−μ1)Tw]T · [(μ0−μ1)Tw] = wT(μ0−μ1)(μ0−μ1)Tw。
中间那个 (μ0−μ1)(μ0−μ1)T——一个列向量乘一个行向量——是个矩阵。记住这个形状,下面马上要用。
两个"散度矩阵"
为了写得清爽,书里定义了两个矩阵。它们是这一节的主角,一定要认识:
Sw = Σ0 + Σ1 = ∑x∈X0 (x−μ0)(x−μ0)T + ∑x∈X1 (x−μ1)(x−μ1)T 式 (3.33)
Sb = (μ0 − μ1)(μ0 − μ1)T 式 (3.34)
用人话说这两个东西:
- Sw(类内):把每一类的样本都减去自己类的中心,然后"自己乘自己的转置"再加起来。它在量的是"每一类自己有多散"。
顺便说一句:如果你把 ∑(x−μ)(x−μ)T 除以样本数 m,得到的就是协方差矩阵。所以散度矩阵和协方差矩阵只差一个常数倍。 - Sb(类间):只用两个类的中心,量的是"两个类的中心离多远"。注意它是一个"秩为 1"的矩阵——因为它只是同一个方向向量的外积。
于是式 (3.32) 可以重写成非常漂亮的样子:
这个形式的学名叫广义瑞利商(generalized Rayleigh quotient)。名字很唬人,但你只要记住它是"类间 ÷ 类内"就行,越大越好。
怎么解这个最大化问题
先注意一个性质,书里用了一个脚注来提:"若 w 是一个解,则对于任意常数 α,αw 也是式 (3.35) 的解。"
分子分母里 w 都出现两次。你把 w 换成 αw,分子变成 α2wTSbw,分母变成 α2wTSww,α2 上下正好约掉,比值完全不变。
这个性质非常重要,它告诉我们:我们只能定出 w 的"方向",定不出它的"长度"。方向才是关键——因为投影方向才决定分不分得开,长度只是缩放。
而且它带来了一个解题的自由:既然长度随便,那就人为规定一个长度,把问题变简单。
书里的做法是:"不失一般性,令 wTSww = 1"。这样分母就固定成 1 了,最大化 J 就等价于最大化分子,而最大化分子又等价于最小化负的分子:
s.t. wTSww = 1 式 (3.36)
这是一个"带约束的优化",标准解法是拉格朗日乘子法(附录 B.1)。做法是:把约束乘上一个系数 λ 加进目标里,变成无约束问题,再求导置零。
这个式子的形式叫"广义特征值问题"。如果 Sw 是单位矩阵,它就退化成普通的求特征值 Sbw = λw。
最后一步:从 λ 到 Sw-1(μ0−μ1)
这一步是全书最像"变魔术"的地方,但其实只用了两个观察。
观察一:Sbw 的方向是固定的。把 Sb = (μ0−μ1)(μ0−μ1)T 代进去:
下面画线的那一坨 (μ0−μ1)Tw 是一个数(两个向量点乘)。一个数乘上一个向量,结果还是那个方向的向量。所以 Sbw 的方向永远等于 (μ0−μ1) 的方向,不管 w 取什么。书里那句"注意到 Sbw 的方向恒为 μ0−μ1",就是这个意思。
观察二:既然方向一样,就可以把那个标量整体记作 λ。于是令:
把这个代回式 (3.37):
两边约掉 λ,再左乘 Sw−1:
⟹ w = Sw−1(μ0 − μ1) 式 (3.39)
别把它当成一个"天降公式"。它的含义是:先乘 Sw-1,再沿着两类中心的连线方向投影。
为什么不能直接沿着"中心连线"投影?因为两类的散开方向可能不一样。假设橙色那类在水平方向散得很长,绿色那类在竖直方向散得很长——如果你直接沿中心连线看过去,两个类的影子会糊在一起。
乘上 Sw−1 做的事情,叫"白化":它先把数据按类内散开的形状压扁、拉长,让两个类都变成差不多圆的球。球化之后再沿中心连线投影,就不会互相侵入了。
一句话记法:Sw-1 负责"把散开的方向压平",(μ0−μ1) 负责"指出该往哪边看"。
理论上你只要算 Sw−1 就行。但实际计算时,直接求逆数值上不稳定(尤其当 Sw 接近奇异时,一点点误差就会被放大成巨大的偏差)。
所以书里说:"考虑到数值解的稳定性,在实践中通常是对 Sw 进行奇异值分解"。做法是 Sw = UΣVT(Σ 是对角矩阵,对角线上是奇异值),然后 Sw−1 = VΣ−1UT。
你不需要现在会推 SVD(附录 A.3 有),只要知道:这是"绕过直接求逆"的标准手段。用 numpy 的话就是 np.linalg.pinv(伪逆),它内部就是干这个的。
书里提了一句:"LDA 可从贝叶斯决策理论的角度来阐释,并可证明,当两类数据同先验、满足高斯分布且协方差相等时,LDA 可达到最优分类。"
这句话是在说 LDA 的"适用条件":两类先验概率差不多、各自是正态分布、并且两个正态分布的"胖瘦形状"一样(协方差相等)。满足这三条时,LDA 就是最优的。反过来说,如果两类的协方差差得很多(一个很扁一个很圆),LDA 就不是最优了——它仍在假设它们一样。
(书里还有个注:严格说 LDA 与 Fisher 判别分析稍有不同,前者假设了各类样本的协方差矩阵相同且满秩。)
推广到多分类
二分类时是把数据投到一条线上。多分类时,一条线不够了——N 个类挤在一条线上会重叠。所以要投到一个低维空间里去。思路完全一样,只是"数"变成了"矩阵"。
先定义全局散度矩阵(所有样本相对于总均值的散度):
其中 μ 是所有样本的均值向量(不分类别)。这个等式 St = Sb + Sw 很有意思:总散度 = 类间散度 + 类内散度。就像"总方差 = 组间方差 + 组内方差",是很自然的一个分解。
然后把类内散度矩阵重新定义成"每一类的散度加起来":
再借 St = Sb + Sw 反推出类间散度矩阵:
(mi 是第 i 类的样本数。为什么这里要乘 mi?因为类间散度要把每类的"中心偏移"按该类的样本数量加权——大类的影响应该更大。这个 mi 是推出来的,书里跳了中间步骤。)
书里说:"显然,多分类 LDA 可以有多种实现方法:使用 Sb、Sw、St 三者中的任何两个即可。"理由是它们满足 St = Sb + Sw,知道两个就能算出第三个。
常见的一种实现是:
符号:W ∈ ℝd×(N−1) 是投影矩阵(把 d 维投到 N−1 维),tr(·) 是迹——矩阵对角线元素之和。为什么用迹?因为二分类时分子分母都是标量,直接除就行;多分类时它们是矩阵,得想办法变成一个数来比较。迹正好是"所有特征值之和",可以理解为"总能量",是标量除法的自然推广。
解法还是广义特征值问题:
而 W 的闭式解是:Sw−1Sb 的 N−1 个最大广义特征值所对应的特征向量组成的矩阵。
这个 N−1 经常被当成要背的结论,其实理由很直观:N 个类的"中心"是 N 个点,而 N 个点最多只能张成一个 N−1 维的空间。
类比一下:平面上 3 个点(3 个类中心),最多构成一个二维三角形——你不可能用 3 个点撑出三维空间。所以再多投几个维度也没有新信息了。这也说明 LDA 能保留的判别信息上限是 N−1 维。
最后,原书点出了 LDA 的第二个身份:"若将 W 视为一个投影矩阵,则多分类 LDA 将样本投影到 N−1 维空间,N−1 通常远小于数据原有的属性数。于是,可通过这个投影来减小样本点的维数,且投影过程中使用了类别信息,因此 LDA 也常被视为一种经典的监督降维技术。"
LDA 有两个身份:分类器(投到一维/低维之后切一刀)和降维方法(把 d 维压到 N−1 维)。
它和 PCA(第 10 章)的区别,一句话就能说清:PCA 是无监督的(只看数据散得最开的方向,不管标签),LDA 是监督的(它知道类别,专门找"分得开"的方向)。所以同样做降维,用于分类任务时 LDA 通常更好。
随堂自测 · 3.4
LDA 的解 w = Sw−1(μ0−μ1) 里,乘上 Sw−1 这一步起的作用是?
压缩维度是投影本身干的事,不是 Sw−1 干的。"让类间距离最大"只描述了目标,没说明为什么会出现 Sw−1。而"两类投影后均值相等"恰恰是灾难——那就完全分不开了。Sw−1 的真实作用是白化:先按类内散开的形状把数据压扁拉长,让两类变成球形,再沿 (μ0−μ1) 方向投影。
本讲小结
- LDA 的两个愿望:同类要挤(类内散度小)、异类要分(类间距离大)。合成一个分数就是 J。
- J 只和 w 的方向有关,和长度无关 —— 所以可以规定分母为 1,再用拉格朗日乘子解。
- S_w−1 的作用是白化:先按类内散开的形状把空间压扁,再沿中心连线投影。
- 多分类投到 N−1 维(N 个点最多张成 N−1 维),顺带成了监督降维。
下一讲:多分类学习。3.3 和 3.4 都只会二分类,而现实常常有十个类别——怎么拼?
卡住了就直接问我 —— 把没看懂的那一句原样抄给我,我单独展开讲,不用客气。