第 3 章 · 第 5 讲 / 共 7 讲

线性判别分析

换一条完全不同的路:不算概率,去找一个投影方向,让同类挤、异类远。

约 25 分钟 1 个自测 教材 §3.4

这一讲你会拿到什么

能写出 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 的核心思想(一句话)

把高维的数据"投影"到一条直线上,投影完之后,同类的点挤在一起,异类的点离得很远。然后在这条直线上切一刀就分开了。

为什么叫"投影"?想象你手里有一团三维的点(比如橘子和苹果混在一起)。你从某个角度看过去,它们在墙上留下影子。换个角度看,影子可能重叠在一起分不清;再换个角度,影子可能恰好分成两堆。LDA 要找的就是"分得最开的那一个角度"。

投影方向 w 类 0(反例) 类 1(正例) 投影后:同类挤成一团 异类隔得很开
LDA 想做的事:找一个方向 w,把二维的点压到一条线上。压完之后,橙色那堆投影点(左下)要尽量紧凑,绿色那堆(右下)也要紧凑,但两堆之间的距离要尽量大。

动手试试 · 这是本节的核心

类间 ÷ 类内 = 0.00 这个值越大,两类在这个方向上分得越开
拖动角度,盯住两件事:① 轴上的圆点越挤,类内散度越小;② 两堆圆点的间隔越大,类间散度越大。点"看坏方向"能立刻看到两类糊成一团(J 掉到 0.1 左右),点"找最佳方向"则跳到 J 最大处。
这里有个特别值得注意的细节:滑块默认停在 −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 上。投影的数学操作就是点积(内积)。所以:

书上有一句容易被匆匆扫过的话:"由于直线是一维空间,因此 wTμ0、wTμ1、wTΣ0w 和 wTΣ1w 均为实数。"

这句话看着像废话,其实是提醒你别在后面的式子推导中把标量当向量处理。二维向量点积一个方向向量,结果是一个数(在直线上的坐标);矩阵夹在两个 w 中间变成二次型,结果也是一个数(散开的程度)。

把两个愿望写成一个分数

LDA 有两个"愿望",恰好是一对矛盾:

愿望数学表达想让它
同类要挤wTΣ0w + wTΣ1w尽可能小
异类要分‖wTμ0 − wTμ1‖22尽可能大

一个要小一个要大,怎么同时优化?让它们相除:分子要大、分母要小,整体就大。于是得到目标函数:

J = ‖wTμ0 − wTμ1‖22wTΣ0w + wTΣ1w = wT(μ0−μ1)(μ0−μ1)TwwT(Σ0+Σ1)w 式 (3.32)
分子那一步是怎么变过来的

关键在一个很小但很容易卡住的地方:‖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——一个列向量乘一个行向量——是个矩阵。记住这个形状,下面马上要用。

两个"散度矩阵"

为了写得清爽,书里定义了两个矩阵。它们是这一节的主角,一定要认识:

类内散度矩阵(within-class scatter matrix)
Sw = Σ0 + Σ1 = ∑x∈X0 (x−μ0)(x−μ0)T + ∑x∈X1 (x−μ1)(x−μ1)T 式 (3.33)
类间散度矩阵(between-class scatter matrix)
Sb = (μ0 − μ1)(μ0 − μ1)T 式 (3.34)

用人话说这两个东西:

于是式 (3.32) 可以重写成非常漂亮的样子:

J = wTSbwwTSww 式 (3.35)

这个形式的学名叫广义瑞利商(generalized Rayleigh quotient)。名字很唬人,但你只要记住它是"类间 ÷ 类内"就行,越大越好。

怎么解这个最大化问题

先注意一个性质,书里用了一个脚注来提:"若 w 是一个解,则对于任意常数 α,αw 也是式 (3.35) 的解。"

为什么?因为它是"零次齐次"的

分子分母里 w 都出现两次。你把 w 换成 αw,分子变成 α2wTSbw,分母变成 α2wTSww,α2 上下正好约掉,比值完全不变。

这个性质非常重要,它告诉我们:我们只能定出 w 的"方向",定不出它的"长度"。方向才是关键——因为投影方向才决定分不分得开,长度只是缩放。

而且它带来了一个解题的自由:既然长度随便,那就人为规定一个长度,把问题变简单。

书里的做法是:"不失一般性,令 wTSww = 1"。这样分母就固定成 1 了,最大化 J 就等价于最大化分子,而最大化分子又等价于最小化负的分子:

minw   − wTSbw
s.t.   wTSww = 1 式 (3.36)

这是一个"带约束的优化",标准解法是拉格朗日乘子法(附录 B.1)。做法是:把约束乘上一个系数 λ 加进目标里,变成无约束问题,再求导置零。

Sbw = λ Sww 式 (3.37)

这个式子的形式叫"广义特征值问题"。如果 Sw 是单位矩阵,它就退化成普通的求特征值 Sbw = λw。

最后一步:从 λ 到 Sw-1(μ0−μ1)

这一步是全书最像"变魔术"的地方,但其实只用了两个观察。

观察一:Sbw 的方向是固定的。把 Sb = (μ0−μ1)(μ0−μ1)T 代进去:

Sbw = (μ0−μ1) · (μ0−μ1)Tw

下面画线的那一坨 (μ0−μ1)Tw 是一个数(两个向量点乘)。一个数乘上一个向量,结果还是那个方向的向量。所以 Sbw 的方向永远等于 (μ0−μ1) 的方向,不管 w 取什么。书里那句"注意到 Sbw 的方向恒为 μ0−μ1",就是这个意思。

观察二:既然方向一样,就可以把那个标量整体记作 λ。于是令:

Sbw = λ(μ0−μ1) 式 (3.38)

把这个代回式 (3.37):

λ(μ0−μ1) = λSww
两边约掉 λ,再左乘 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 = ∑i=1m (xi − μ)(xi − μ)T 式 (3.40)

其中 μ 是所有样本的均值向量(不分类别)。这个等式 St = Sb + Sw 很有意思:总散度 = 类间散度 + 类内散度。就像"总方差 = 组间方差 + 组内方差",是很自然的一个分解。

然后把类内散度矩阵重新定义成"每一类的散度加起来":

Sw = ∑i=1N Swi,   Swi = ∑x∈Xi (x−μi)(x−μi)T 式 (3.41)(3.42)

再借 St = Sb + Sw 反推出类间散度矩阵:

Sb = St − Sw = ∑i=1N mi(μi − μ)(μi − μ)T 式 (3.43)

(mi 是第 i 类的样本数。为什么这里要乘 mi?因为类间散度要把每类的"中心偏移"按该类的样本数量加权——大类的影响应该更大。这个 mi 是推出来的,书里跳了中间步骤。)

书里说:"显然,多分类 LDA 可以有多种实现方法:使用 Sb、Sw、St 三者中的任何两个即可。"理由是它们满足 St = Sb + Sw,知道两个就能算出第三个。

常见的一种实现是:

maxW   tr(WTSbW)tr(WTSwW) 式 (3.44)

符号:W ∈ ℝd×(N−1) 是投影矩阵(把 d 维投到 N−1 维),tr(·) 是迹——矩阵对角线元素之和。为什么用迹?因为二分类时分子分母都是标量,直接除就行;多分类时它们是矩阵,得想办法变成一个数来比较。迹正好是"所有特征值之和",可以理解为"总能量",是标量除法的自然推广。

解法还是广义特征值问题:

SbW = λSwW 式 (3.45)

而 W 的闭式解是:Sw−1Sb 的 N−1 个最大广义特征值所对应的特征向量组成的矩阵。

为什么偏偏是 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 都只会二分类,而现实常常有十个类别——怎么拼?

卡住了就直接问我 —— 把没看懂的那一句原样抄给我,我单独展开讲,不用客气。