📑 查看全课大纲(第 7 / 20 节)
- 1.多元统计分析概述与多元正态分布
- 2.多元数据矩阵与向量化运算
- 3.统计数据探索与高维数据清洗
- 4.样品与变量相似性度量(距离与相似系数)
- 5.系统聚类与K均值聚类算法原理
- 6.聚类分析代码实战与谱系图绘制
- 7.距离判别法理论推导与应用
- 8.贝叶斯判别与Fisher线性判别
- 9.判别分析代码实战与误判率评估
- 10.主成分分析推导、几何意义与统计性质
- 11.主成分回归与共线性消除
- 12.主成分分析代码实战与降维可视化
- 13.因子分析正交模型与因子载荷求解
- 14.因子正交旋转(方差最大化)与因子得分计算
- 15.因子分析代码实战与行业综合评价
- 16.列联表分析与卡方独立性检验
- 17.对应分析理论推导与过渡图原理
- 18.对应分析代码实战与双标图解读
- 19.典型相关变量数学推导与显著性检验
- 20.典型相关系数阵计算与代码实战
距离判别法理论推导与应用
约 59 分钟
小象实战讲义 · 多元统计分析
判别分析是多元统计中解决有监督分类问题的核心方法。本节学习最基础的距离判别法,掌握其“就近归类”的数学原理、线性判别函数的推导过程,以及使用 Python 进行实战建模的完整流程。
💡 核心导读
本节你将学到:
- 判别分析定义:理解有监督分类与无监督聚类的本质区别。
- 马氏距离优势:掌握其克服量纲与变量相关性的原理。
- 两总体线性判别:推导协方差相等时的判别函数与决策规则。
- 多总体线性判别:将两总体思想推广至多类别场景。
- Python 实战:使用
numpy与scipy实现算法并验证。
判别分析:从聚类到分类
聚类分析是无监督学习,根据数据自身相似性进行“物以类聚”。而判别分析属于有监督学习:我们已知一批样本的类别标签(如“健康”与“患病”)及其多项指标观测值,目标是建立一个判别规则(函数),用于对新的未知类别样本进行自动分类。
数学描述:设有 个 维总体 ,其分布密度函数(或分布)已知或可估计。给定一个来自某个总体的新样本 ,判别分析的目标是判定 最可能来自哪个总体 。
马氏距离:更合理的“远近”度量
在距离判别中,核心是度量样本与总体之间的“距离”。欧氏距离简单直观,但在处理多元数据时存在明显缺陷:
- 量纲敏感性:变量单位(如 kg 与 cm)变化会扭曲距离。
- 忽略变量相关性:假设变量相互独立,不符合实际。
- 忽略方差差异:方差大的变量在距离计算中占主导,可能掩盖真实结构。
马氏距离通过引入总体的协方差矩阵 进行修正。样本 到总体 (均值为 )的马氏距离定义为: 核心作用: 相当于一个“标准化”与“去相关”算子。它消除了量纲影响,并考虑了变量间的协变关系。当 (单位阵)时,马氏距离的平方退化为欧氏距离的平方(即 )。
两总体距离判别:线性判别函数的诞生
协方差矩阵相等的情形
问题设定:两个 维总体 和 ,均值向量分别为 ,且拥有相同的协方差矩阵 。对于一个新样本 ,判断其归属。
基本思想:计算 到两个总体的马氏距离,判给距离更近的总体。 判别规则为:
推导线性判别函数: 定义距离差 。利用协方差相等的条件进行化简: 令 ,,则 ,其中 称为线性判别函数, 称为判别系数。
最终判别规则:由于 与 符号相反,规则简化为: 这等价于在 维空间 中构造了一个超平面 ,将空间划分为 和 两个区域,分别对应 和 。
参数估计:实践中, 未知。设从 中分别抽取 个样本,则用样本均值 估计 ,用合并样本协方差矩阵进行无偏估计: 其中 分别为两组的样本协方差矩阵。代入即得基于样本的判别函数 。
协方差矩阵不等的情形
当 时,距离差 无法简化为线性形式,而是一个关于 的二次函数: 判别规则不变: 判为 ,否则判为 。此时的判别边界是一个二次曲面,故称为二次判别。
多总体距离判别:从二到多的推广
设有 个总体 ,均值向量为 ,并假设它们具有相同的协方差矩阵 。
判别思想:计算新样本 到每个总体 的马氏距离 ,将其判给距离最小的总体。经过推导(忽略与 无关的项),等价于为每个总体构造一个线性判别函数:
判别规则:计算 在所有 个判别函数上的值,将其判给函数值最大的总体:
若各总体协方差不全相等,则直接计算并比较马氏距离 即可。
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的 ,被判为 ;其到 的马氏距离确实小于到 的距离(距离差为负),与判别规则一致。样本2结果同理,验证了线性判别函数的正确性。
📝 动手练一练
- 修改协方差矩阵:将代码中的
Sigma改为单位矩阵np.eye(3),重新运行。观察此时马氏距离与欧氏距离的关系,并思考判别边界的变化。 - 实现多总体判别:加载鸢尾花数据集(
sklearn.datasets.load_iris),假设三个类别的协方差矩阵相等,实现多总体线性距离判别,并计算训练集上的回代正确率。
参考答案(第1题提示):当 时,马氏距离公式退化为 ,即欧氏距离的平方。此时判别函数 的系数向量 ,判别边界是连接两均值中点的垂直平分超平面。
本章小结
本节系统讲解了距离判别法的核心思想与数学推导:
- 核心思想:以马氏距离为度量,将新样本判给“最近”的总体。
- 关键改进:马氏距离通过 消除了量纲与变量相关性的影响,是更合理的距离定义。
- 线性判别函数:在两总体协方差相等的假设下,可推导出简洁的线性判别函数 ,决策规则由 的符号决定。
- 多总体推广:通过为每个总体构造线性判别函数并取最大值,实现多类别判别。
- 算法局限:距离判别法未考虑各类别的先验概率差异以及错判带来的不同损失,这是后续贝叶斯判别要解决的问题。
行动清单:
- 推导一遍:亲手推导两总体线性判别函数 的化简过程,理解矩阵运算如何简化问题。
- 运行代码:执行本节提供的 Python 代码,并通过修改参数(如协方差矩阵)观察结果变化,加深理解。
- 思考延伸:距离判别法假设了总体分布(特别是协方差结构),思考当数据严重偏离正态分布或异方差时,该方法可能面临什么问题。
— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问