📑 查看全课大纲(第 7 / 20 节)

距离判别法理论推导与应用

约 59 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 多元统计分析

判别分析是多元统计中解决有监督分类问题的核心方法。本节学习最基础的距离判别法,掌握其“就近归类”的数学原理、线性判别函数的推导过程,以及使用 Python 进行实战建模的完整流程。

💡 核心导读

本节你将学到:

  1. 判别分析定义:理解有监督分类与无监督聚类的本质区别。
  2. 马氏距离优势:掌握其克服量纲与变量相关性的原理。
  3. 两总体线性判别:推导协方差相等时的判别函数与决策规则。
  4. 多总体线性判别:将两总体思想推广至多类别场景。
  5. Python 实战:使用 numpyscipy 实现算法并验证。

判别分析:从聚类到分类

聚类分析是无监督学习,根据数据自身相似性进行“物以类聚”。而判别分析属于有监督学习:我们已知一批样本的类别标签(如“健康”与“患病”)及其多项指标观测值,目标是建立一个判别规则(函数),用于对新的未知类别样本进行自动分类。

数学描述:设有 kkpp 维总体 G1,G2,,GkRpG_1, G_2, \dots, G_k \subset \mathbb{R}^p,其分布密度函数(或分布)已知或可估计。给定一个来自某个总体的新样本 xRpx \in \mathbb{R}^p,判别分析的目标是判定 xx 最可能来自哪个总体 GiG_i

马氏距离:更合理的“远近”度量

在距离判别中,核心是度量样本与总体之间的“距离”。欧氏距离简单直观,但在处理多元数据时存在明显缺陷:

  1. 量纲敏感性:变量单位(如 kg 与 cm)变化会扭曲距离。
  2. 忽略变量相关性:假设变量相互独立,不符合实际。
  3. 忽略方差差异:方差大的变量在距离计算中占主导,可能掩盖真实结构。

马氏距离通过引入总体的协方差矩阵 ΣRp×p\Sigma \in \mathbb{R}^{p \times p} 进行修正。样本 xx 到总体 GG(均值为 μ\mu)的马氏距离定义为: D2(x,G)=(xμ)Σ1(xμ)D^2(x, G) = (x - \mu)^\top \Sigma^{-1} (x - \mu) 核心作用Σ1\Sigma^{-1} 相当于一个“标准化”与“去相关”算子。它消除了量纲影响,并考虑了变量间的协变关系。当 Σ=I\Sigma = I(单位阵)时,马氏距离的平方退化为欧氏距离的平方(即 D2(x,G)=xμ2D^2(x,G)=\|x-\mu\|^2)。

两总体距离判别:线性判别函数的诞生

协方差矩阵相等的情形

问题设定:两个 pp 维总体 G1G_1G2G_2,均值向量分别为 μ1,μ2Rp\mu_1, \mu_2 \in \mathbb{R}^p,且拥有相同的协方差矩阵 Σ\Sigma。对于一个新样本 xx,判断其归属。

基本思想:计算 xx 到两个总体的马氏距离,判给距离更近的总体。 判别规则为: x{G1,if D2(x,G1)D2(x,G2)G2,if D2(x,G1)>D2(x,G2)x \in \begin{cases} G_1, & \text{if } D^2(x, G_1) \leq D^2(x, G_2) \\ G_2, & \text{if } D^2(x, G_1) > D^2(x, G_2) \end{cases}

推导线性判别函数: 定义距离差 W(x)=D2(x,G1)D2(x,G2)W^*(x) = D^2(x, G_1) - D^2(x, G_2)。利用协方差相等的条件进行化简: W(x)=(xμ1)Σ1(xμ1)(xμ2)Σ1(xμ2)=2(xμ1+μ22)Σ1(μ1μ2)\begin{aligned} W^*(x) &= (x-\mu_1)^\top\Sigma^{-1}(x-\mu_1) - (x-\mu_2)^\top\Sigma^{-1}(x-\mu_2) \\ &= -2\left(x - \frac{\mu_1+\mu_2}{2}\right)^\top \Sigma^{-1} (\mu_1-\mu_2) \end{aligned}μˉ=12(μ1+μ2)\bar{\mu} = \frac{1}{2}(\mu_1 + \mu_2)α=Σ1(μ1μ2)Rp\alpha = \Sigma^{-1}(\mu_1 - \mu_2) \in \mathbb{R}^p,则 W(x)=2W(x)W^*(x) = -2W(x),其中 W(x)=α(xμˉ)W(x) = \alpha^\top (x - \bar{\mu}) 称为线性判别函数α\alpha 称为判别系数。

最终判别规则:由于 W(x)W^*(x)W(x)W(x) 符号相反,规则简化为: x{G1,if W(x)0G2,if W(x)<0x \in \begin{cases} G_1, & \text{if } W(x) \geq 0 \\ G_2, & \text{if } W(x) < 0 \end{cases} 这等价于在 pp 维空间 Rp\mathbb{R}^p 中构造了一个超平面 α(xμˉ)=0\alpha^\top (x - \bar{\mu}) = 0,将空间划分为 R1R_1R2R_2 两个区域,分别对应 G1G_1G2G_2

参数估计:实践中,μ1,μ2,Σ\mu_1, \mu_2, \Sigma 未知。设从 G1,G2G_1, G_2 中分别抽取 n1,n2n_1, n_2 个样本,则用样本均值 Xˉ(1),Xˉ(2)\bar{X}^{(1)}, \bar{X}^{(2)} 估计 μ1,μ2\mu_1, \mu_2,用合并样本协方差矩阵进行无偏估计: Σ^=(n11)S1+(n21)S2n1+n22\hat{\Sigma} = \frac{(n_1-1)S_1 + (n_2-1)S_2}{n_1 + n_2 - 2} 其中 S1,S2S_1, S_2 分别为两组的样本协方差矩阵。代入即得基于样本的判别函数 W^(x)\hat{W}(x)

协方差矩阵不等的情形

Σ1Σ2\Sigma_1 \neq \Sigma_2 时,距离差 W(x)W^*(x) 无法简化为线性形式,而是一个关于 xx 的二次函数: W(x)=(xμ1)Σ11(xμ1)(xμ2)Σ21(xμ2)W^*(x) = (x-\mu_1)^\top\Sigma_1^{-1}(x-\mu_1) - (x-\mu_2)^\top\Sigma_2^{-1}(x-\mu_2) 判别规则不变:W(x)0W^*(x) \leq 0 判为 G1G_1,否则判为 G2G_2。此时的判别边界是一个二次曲面,故称为二次判别

多总体距离判别:从二到多的推广

设有 kk 个总体 G1,,GkG_1, \dots, G_k,均值向量为 μα\mu_\alpha,并假设它们具有相同的协方差矩阵 Σ\Sigma

判别思想:计算新样本 xx 到每个总体 GαG_\alpha 的马氏距离 D2(x,Gα)D^2(x, G_\alpha),将其判给距离最小的总体。经过推导(忽略与 xx 无关的项),等价于为每个总体构造一个线性判别函数: Wα(x)=(Σ1μα)x12μαΣ1μα,α=1,,kW_\alpha(x) = (\Sigma^{-1}\mu_\alpha)^\top x - \frac{1}{2}\mu_\alpha^\top\Sigma^{-1}\mu_\alpha, \quad \alpha=1,\dots,k

判别规则:计算 xx 在所有 kk 个判别函数上的值,将其判给函数值最大的总体: xGiifWi(x)=maxα=1,,kWα(x)x \in G_i \quad \text{if} \quad W_i(x) = \max_{\alpha=1,\dots,k} W_\alpha(x)

若各总体协方差不全相等,则直接计算并比较马氏距离 D2(x,Gα)D^2(x, G_\alpha) 即可。

Python 实战:实现与验证距离判别法

以下代码演示两总体协方差相等假设下的线性距离判别,包含数据生成、参数估计、判别函数构建与测试。

import numpy as np
from scipy.spatial.distance import mahalanobis

# 固定随机种子确保结果可复现
np.random.seed(42)

# 1. 模拟两个三维正态总体(协方差相等)
n1, n2, p = 40, 40, 3
mu1 = np.array([2.0, 3.0, 1.0])
mu2 = np.array([5.0, 6.0, 4.0])
# 共同的协方差矩阵
Sigma = np.array([
    [1.5, 0.4, 0.2],
    [0.4, 1.2, 0.3],
    [0.2, 0.3, 1.0]
])
# 生成样本
X1 = np.random.multivariate_normal(mu1, Sigma, size=n1)
X2 = np.random.multivariate_normal(mu2, Sigma, size=n2)

# 2. 估计样本统计量
xbar1 = np.mean(X1, axis=0)
xbar2 = np.mean(X2, axis=0)
S1 = np.cov(X1, rowvar=False)
S2 = np.cov(X2, rowvar=False)
# 合并协方差矩阵的无偏估计
S_pooled = ((n1 - 1) * S1 + (n2 - 1) * S2) / (n1 + n2 - 2)
inv_S = np.linalg.inv(S_pooled)

# 3. 构造线性判别函数 W(x) = alpha^T (x - midpoint)
midpoint = (xbar1 + xbar2) / 2.0
diff_vec = xbar1 - xbar2  # 注意:课件中 alpha = Sigma^{-1}(mu1 - mu2)

def linear_discriminant(x):
    """线性判别函数,返回 W(x) 的值"""
    return (x - midpoint).T @ inv_S @ diff_vec

# 4. 测试新样本
test_sample_1 = np.array([2.2, 3.1, 1.2])  # 应靠近 G1
test_sample_2 = np.array([4.8, 5.8, 3.9])  # 应靠近 G2

w1 = linear_discriminant(test_sample_1)
w2 = linear_discriminant(test_sample_2)

print("合并协方差矩阵行列式:", round(float(np.linalg.det(S_pooled)), 4))
print("样本 1 判别函数值 W(x):", round(float(w1), 4), "归属类别:", "G1" if w1 >= 0 else "G2")
print("样本 2 判别函数值 W(x):", round(float(w2), 4), "归属类别:", "G1" if w2 >= 0 else "G2")

# 5. 验证:直接计算马氏距离
# 注意:mahalanobis 函数需要传入协方差矩阵的逆
d1_to_G1 = mahalanobis(test_sample_1, xbar1, inv_S)
d1_to_G2 = mahalanobis(test_sample_1, xbar2, inv_S)
print(f"\n验证样本1: 到G1距离={d1_to_G1:.4f}, 到G2距离={d1_to_G2:.4f}, 距离差={d1_to_G1 - d1_to_G2:.4f}")

运行结果:

合并协方差矩阵行列式: 1.0605
样本 1 判别函数值 W(x): 9.47 归属类别: G1
样本 2 判别函数值 W(x): -10.1305 归属类别: G2

验证样本1: 到G1距离=0.3015, 到G2距离=4.3624, 距离差=-4.0609

结果解读:样本1的 W(x)>0W(x) > 0,被判为 G1G1;其到 G1G1 的马氏距离确实小于到 G2G2 的距离(距离差为负),与判别规则一致。样本2结果同理,验证了线性判别函数的正确性。

📝 动手练一练

  1. 修改协方差矩阵:将代码中的 Sigma 改为单位矩阵 np.eye(3),重新运行。观察此时马氏距离与欧氏距离的关系,并思考判别边界的变化。
  2. 实现多总体判别:加载鸢尾花数据集(sklearn.datasets.load_iris),假设三个类别的协方差矩阵相等,实现多总体线性距离判别,并计算训练集上的回代正确率。

参考答案(第1题提示):当 Σ=I\Sigma = I 时,马氏距离公式退化为 D2(x,μ)=(xμ)(xμ)D^2(x, \mu) = (x-\mu)^\top (x-\mu),即欧氏距离的平方。此时判别函数 W(x)W(x) 的系数向量 α=μ1μ2\alpha = \mu_1 - \mu_2,判别边界是连接两均值中点的垂直平分超平面。

本章小结

本节系统讲解了距离判别法的核心思想与数学推导:

  • 核心思想:以马氏距离为度量,将新样本判给“最近”的总体。
  • 关键改进:马氏距离通过 Σ1\Sigma^{-1} 消除了量纲与变量相关性的影响,是更合理的距离定义。
  • 线性判别函数:在两总体协方差相等的假设下,可推导出简洁的线性判别函数 W(x)=α(xμˉ)W(x) = \alpha^\top (x - \bar{\mu}),决策规则由 W(x)W(x) 的符号决定。
  • 多总体推广:通过为每个总体构造线性判别函数并取最大值,实现多类别判别。
  • 算法局限:距离判别法未考虑各类别的先验概率差异以及错判带来的不同损失,这是后续贝叶斯判别要解决的问题。

行动清单

  1. 推导一遍:亲手推导两总体线性判别函数 W(x)W(x) 的化简过程,理解矩阵运算如何简化问题。
  2. 运行代码:执行本节提供的 Python 代码,并通过修改参数(如协方差矩阵)观察结果变化,加深理解。
  3. 思考延伸:距离判别法假设了总体分布(特别是协方差结构),思考当数据严重偏离正态分布或异方差时,该方法可能面临什么问题。

— 小象教研组

配套学习资源与课件
  • 第4章课件:判别分析
    下载
  • 多元统计分析参考讲义与常用函数(多元分析与主成分常用函数速查)
    下载
  • 课程配套数据集(全课程实战数据包)
    下载
  • 课程全套源代码(课程相关代码汇总)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问