小象实战讲义 · 多元统计分析
在上一讲的距离判别法中,我们仅依据样本与总体均值的马氏距离分类,忽略了两个关键现实因素:不同总体的先验概率可能不同,错判到不同类别的损失可能不等。本节课将介绍两种更贴近实际的判别方法——贝叶斯判别与Fisher判别,学完你将掌握先验知识与错判损失的融入方法,理解线性投影实现类别最优分离的核心思想。
💡 核心导读
- 贝叶斯判别:基于贝叶斯框架,引入先验概率与错判损失,以最小化总平均损失为目标。
- Fisher判别:寻找最优投影方向,最大化类间差异、最小化类内差异,实现高维数据降维分类。
- 线性联系:正态总体、等协方差假设下,两种方法均可导出线性判别函数,与距离判别内在统一。
- 实战实现:基于Python的
numpy、scikit-learn库实现Fisher投影向量计算与验证。 - 方法对比:理解三种判别方法的假设、目标与适用场景。
贝叶斯判别法
基本思想与问题设定
贝叶斯判别法源于贝叶斯统计学,核心是利用先验信息进行统计推断,将历史数据、专家经验等纳入分析。 距离判别法存在两个明显不足:
- 未考虑先验概率:如疾病诊断中,常见病的患病概率远高于罕见病,医生往往先考虑常见病,这就是先验概率的应用。
- 未考虑错判损失差异:如信用卡风控中,把坏用户误判为好用户的损失远高于反向错判,两类错判代价不对等。
贝叶斯判别法正是为弥补这些不足提出的,其基本思想是:已知各类总体的先验概率与错判损失,寻找样本空间的划分规则,使得错判造成的总平均损失最小。
问题形式化: 设有 k 个总体 G1,G2,…,Gk,概率密度函数为 f1(x),f2(x),…,fk(x),先验概率为 q1,q2,…,qk,满足 qi≥0 且 ∑i=1kqi=1。 定义错判损失函数 C(j∣i):原本属于 Gi 的样本被错判为 Gj 的损失,显然 C(i∣i)=0。 我们的目标是将 p 维样本空间 Rp 划分为 k 个互不相交的区域 R1,R2,…,Rk(R1∪⋯∪Rk=Rp),构成判别规则:若 x∈Rj,则判其来自 Gj。我们需要找到最优划分,使得总平均损失最小。
总平均损失与最优划分
在规则 R 下,将 Gi 的样本错判为 Gj 的概率为: P(j∣i,R)=∫Rjfi(x)dx
对于来自 Gi 的样本,判别的平均损失为: r(i,R)=j=1∑kC(j∣i)P(j∣i,R)=j=1∑kC(j∣i)∫Rjfi(x)dx
结合先验概率,总平均损失为: g(R)=i=1∑kqi⋅r(i,R)=i=1∑kj=1∑kqiC(j∣i)∫Rjfi(x)dx
交换求和与积分顺序,可重写为: g(R)=j=1∑k∫Rj[i=1∑kqiC(j∣i)fi(x)]dx=j=1∑k∫Rjhj(x)dx 其中 hj(x)=∑i=1kqiC(j∣i)fi(x),表示将样本 x 判为 Gj 的加权平均损失。
贝叶斯最优解:使总平均损失最小的划分规则为: Ri={x∈Rp∣hi(x)=1≤j≤kminhj(x)},i=1,2,…,k 即样本判给 hj(x) 最小的类别。
两总体情形与正态假设下的简化
考虑 k=2 的情形,判别规则简化为:
- 若 h1(x)≤h2(x),判 x∈G1
- 若 h1(x)>h2(x),判 x∈G2
代入 hj(x) 整理,令 V(x)=f2(x)f1(x),d=q1C(2∣1)q2C(1∣2),则等价规则为: {x∈G1,x∈G2,若 V(x)≥d若 V(x)<d
进一步假设两总体均服从 p 维正态分布,且协方差矩阵相同,即 G1:Np(μ1,Σ),G2:Np(μ2,Σ),则密度比可简化为: V(x)=exp{W(x)} 其中 W(x) 正是距离判别中的线性判别函数: W(x)=(x−2μ1+μ2)⊤Σ−1(μ1−μ2)
此时贝叶斯判别规则变为: {x∈G1,x∈G2,若 W(x)≥lnd若 W(x)<lnd
与距离判别的联系:距离判别阈值为 0,贝叶斯判别阈值为 lnd。当先验概率相等(q1=q2)且错判损失相等(C(2∣1)=C(1∣2))时,d=1,lnd=0,贝叶斯判别退化为距离判别,即距离判别是贝叶斯判别的特例。
贝叶斯判别的评价
优点:理论完备,融合先验概率与错判损失,更贴合实际决策;正态等协方差假设下可简化为线性判别函数,计算高效。 局限:先验概率与错判损失难以准确估计;需假设总体分布形式;多总体场景计算量较大。实践中若先验与损失未知,常假设二者相等,此时退化为距离判别。
Fisher判别法
基本思想
Fisher判别法(又称线性判别分析,LDA)由R.A. Fisher于1936年提出,核心思想与PCA类似但目标不同:PCA找方差最大的投影方向,Fisher判别则寻找最优投影方向,使得投影后类间差异最大、类内差异最小。 具体做法是将 p 维样本 x 投影为一维标量 y=u⊤x,通过优化方向 u 实现类别最优分离,再在投影空间中设置阈值完成分类。
两总体Fisher判别
设有两个总体 G1 和 G2,均值向量和协方差矩阵分别为 μ1,Σ1 和 μ2,Σ2,考虑线性投影 y=u⊤x。
投影后两类的均值为: μ~1=u⊤μ1,μ~2=u⊤μ2 方差为: σ~12=u⊤Σ1u,σ~22=u⊤Σ2u
Fisher判别希望均值差尽可能大、方差和尽可能小,因此构造目标函数(广义瑞利商): J(u)=σ~12+σ~22(μ~1−μ~2)2=u⊤(Σ1+Σ2)u[u⊤(μ1−μ2)]2 我们的目标是找到 u 使得 J(u) 最大化。
等协方差假设:若 Σ1=Σ2=Σ,则目标函数简化为: J(u)∝u⊤Σu[u⊤(μ1−μ2)]2 可以证明,最优投影方向为: u∝Σ−1(μ1−μ2) 这与距离判别、特定条件下贝叶斯判别的线性判别系数完全一致。因此,正态总体、等协方差假设下,三种判别方法的线性方向相同,仅阈值确定方式有差异。
两总体的分类阈值:求得最优投影方向后,还需在一维投影轴上设定阈值才能完成最后一步分类。记两类的投影均值为 μ~1=u⊤μ1、μ~2=u⊤μ2。在等协方差、等先验且错判损失相等的情形下,阈值取两投影均值的中点: y~c=2μ~1+μ~2 判别规则为(设 μ~1>μ~2):若 y=u⊤x≥y~c,则判 x∈G1,否则判 x∈G2。若先验概率或错判损失不等,阈值按先验对数比偏移:取 u=Σ−1(μ1−μ2) 时,前述贝叶斯判别函数恰为 W(x)=u⊤x−y~c=y−y~c,故阈值由 y~c 变为 y~c+lnd(d=q1C(2∣1)q2C(1∣2)),与贝叶斯判别的 lnd 阈值完全呼应;等先验、等损失时 lnd=0,即回到中点阈值。
多总体Fisher判别(样本框架)
在实际应用中,总体参数未知,需基于样本数据进行估计。设第 i 类有 ni 个样本,记为 Gi,总样本量 N=∑i=1kni。
- 第 i 类样本均值:xˉi=ni1∑x∈Gix
- 总样本均值:xˉ=N1∑i=1k∑x∈Gix=N1∑i=1knixˉi
- 组间散度矩阵:反映各类样本均值与总样本均值的差异 B=i=1∑kni(xˉi−xˉ)(xˉi−xˉ)⊤
- 组内散度矩阵:反映各类内部样本的离散程度 W=i=1∑kx∈Gi∑(x−xˉi)(x−xˉi)⊤
Fisher判别旨在寻找投影方向 u,最大化广义瑞利商: J(u)=u⊤Wuu⊤Bu 该问题等价于求解广义特征值问题 Bu=λWu。最大的 s 个特征值对应的特征向量 u1,…,us(s≤min(p,k−1))即为最优投影方向。新样本 x 投影到低维空间 y=[u1⊤x,…,us⊤x]⊤ 后,通常通过比较其与各类投影中心 yˉi=[u1⊤xˉi,…,us⊤xˉi]⊤ 的距离(如欧氏距离)完成分类。
Fisher判别的评价
优点:可实现降维与可视化,理论基础坚实,计算高效(归结为特征值求解问题)。 局限:对分布假设较敏感,非线性分类场景效果有限;对离群点敏感;二分类仅能得到1个判别方向(最多提取 k−1 个)。
Python实战:Fisher判别投影向量计算
下面通过Python模拟两个二维正态总体,计算Fisher最优投影方向。
import numpy as np
# 固定随机种子保证可复现
np.random.seed(42)
# 模拟参数:每类样本数、特征维度、均值、共同协方差矩阵
n1, n2, p = 50, 50, 2
mu1 = np.array([1.0, 2.0])
mu2 = np.array([4.0, 5.0])
Sigma = np.array([[1.0, 0.5], [0.5, 1.2]])
# 生成模拟数据
X1 = np.random.multivariate_normal(mu1, Sigma, size=n1)
X2 = np.random.multivariate_normal(mu2, Sigma, size=n2)
# 计算样本统计量
xbar1 = np.mean(X1, axis=0) # 第一类样本均值
xbar2 = np.mean(X2, axis=0) # 第二类样本均值
# 计算组内散度矩阵 W
SW = (X1 - xbar1).T @ (X1 - xbar1) + (X2 - xbar2).T @ (X2 - xbar2)
# 计算组间散度矩阵 B(两总体简化形式)
diff = (xbar1 - xbar2).reshape(-1, 1)
SB = (n1 * n2 / (n1 + n2)) * (diff @ diff.T)
# 求解Fisher投影方向:w ∝ W^{-1}(xbar1 - xbar2)
w_fisher = np.linalg.inv(SW) @ (xbar1 - xbar2)
w_fisher = w_fisher / np.linalg.norm(w_fisher) # 单位化
# 计算广义瑞利商
rayleigh_quotient = float((w_fisher.T @ SB @ w_fisher) / (w_fisher.T @ SW @ w_fisher))
print("Fisher投影向量:", np.round(w_fisher, 4).tolist())
print("广义瑞利商:", round(rayleigh_quotient, 6))
运行结果:
Fisher投影向量: [-0.6947, -0.7193]
广义瑞利商: 3.735676
代码解读:
- 生成两个等协方差的二维正态总体样本;
- 计算组内散度矩阵 W 和组间散度矩阵 B;
- 基于等协方差假设,最优投影方向为 W−1(xˉ1−xˉ2),单位化后得到投影向量;
- 广义瑞利商越大,说明投影后类间分离度越好,本次结果约为3.74。
📝 动手练一练
贝叶斯判别阈值计算:设两个总体 G1,G2 的先验概率 q1=0.7,q2=0.3,错判损失 C(2∣1)=5(将 G1 错判为 G2 的损失),C(1∣2)=10。计算阈值 d 及其对数 lnd。 参考答案:d=q1C(2∣1)q2C(1∣2)=0.7×50.3×10=3.53≈0.8571,lnd≈−0.1542。
Fisher投影验证:使用 sklearn.discriminant_analysis.LinearDiscriminantAnalysis 对上述模拟数据拟合,提取判别系数,验证其与手动计算的投影向量方向是否一致(可忽略长度差异)。 参考答案:使用 clf = LinearDiscriminantAnalysis().fit(X, y) 后,clf.coef_ 即为判别系数,与手动计算的 w_fisher 方向应基本一致。
本章小结
- 贝叶斯判别:以最小化总平均损失为目标,融合先验概率与错判损失,理论完备但参数估计困难。
- Fisher判别:以最大化类间/类内方差比为准则,寻找最优投影方向,实现降维分类,计算高效。
- 内在联系:在正态总体、等协方差假设下,距离判别、贝叶斯判别与Fisher判别均可导出相同的线性判别函数,区别在于分类阈值。
行动清单
- 概念辨析:梳理三种判别方法的核心目标、假设条件与优缺点。
- 代码复现:运行讲义中的Python代码,理解Fisher投影向量的计算过程。
- 场景思考:针对一个具体分类问题(如鸢尾花品种识别),分析哪种判别方法更合适,并说明理由。
— 小象教研组