简介:这份数理统计大作业文档面向统计学、机器学习方向的学生与自学者,围绕经典鸢尾花数据集展开完整分析,可作为课程作业参考或统计方法实践范本。压缩包内仅含1个docx文件,约511KB,以文字与公式推导为主,涵盖摘要、符号说明、算法原理、数据处理与结果比对等章节,结构完整便于按模块查阅。文档系统串联马氏距离、混合高斯模型、主成分分析、线性判别分析与刀切法等知识点:先对四维花萼花瓣属性做清洗与变换,再用主成分分析和线性判别分析降维去噪,借助高斯混合模型在极大似然意义下聚类,最后以刀切法比较降维方法与模型差异。已有1426人学习,适合希望把课堂统计理论落到具体数据案例、理解降维与聚类取舍的读者参考借鉴。
1. 四个特征、三个类别:为什么降维这一步决定了整个分类管线的上限
鸢尾花数据集只有 150 个样本、4 个特征、3 个类别,很多人第一次跑分类时随手丢进一个分类器就能拿到 95% 以上的准确率,于是得出一个结论:这数据太简单,没什么可研究的。但如果你把整条管线拆开看,会发现真正决定结果的不是分类器本身,而是降维那一步做了什么、丢掉了什么信息。这份数理统计大作业做的事情,恰恰是把这条管线从马氏距离、高斯混合模型、主成分分析、线性判别分析一路拆到刀切法评估,用一套完整的统计视角回答一个问题:在有标签和无标签两种情况下,降维到底改变了什么。搞懂这件事,比记住几个 API 调用有价值得多,因为它是维度规约、判别分析、模型评估这三块知识的交汇点,也是很多人从“会调库”走向“知道为什么这么调”的分水岭。
2. 马氏距离与高斯混合模型:为什么距离度量必须先看协方差
2.1 欧氏距离在相关特征上为什么会失效
鸢尾花的四个特征——花萼长度、花萼宽度、花瓣长度、花瓣宽度——并不是相互独立的。花瓣长度和花萼长度之间存在明显的正相关,量纲虽然都是厘米,但方差差异不小。在这种数据上直接用欧氏距离衡量两个样本的相似度,会出现一个反直觉的现象:两个在“花瓣长度”上差很多但其他维度接近的样本,可能比两个在每个维度上都差一点点的样本距离更近。原因在于欧氏距离把每个维度当成同等重要、彼此独立的轴,而真实数据的协方差结构告诉我们的信息是:某些方向上的变化是“正常波动”,某些方向上的变化才是“异常”。
马氏距离解决的正是这个问题。对于一个均值为 μ、协方差矩阵为 Σ 的多变量向量 x,马氏距离定义为:
D²(x, μ) = (x - μ)ᵀ Σ⁻¹ (x - μ)这里的 Σ⁻¹ 是关键。它相当于对数据做了一次白化变换:先把坐标轴旋转到协方差矩阵的特征向量方向,再按特征值的平方根缩放。变换之后,原本被拉长的椭圆分布变成了标准圆,欧氏距离才重新变得有意义。这份大作业里明确列出了马氏距离的三条性质:当 Σ = I 时退化为欧氏距离;等价于标准化后的欧氏距离;不受量纲变化影响。第三条尤其重要——如果四个特征一个用厘米、一个用毫米,欧氏距离会完全被量纲大的维度主导,而马氏距离天然免疫。
常见的实现思路是先对协方差矩阵做 Cholesky 分解或直接求逆,但要注意 Σ 可能接近奇异。鸢尾花数据 150 个样本、4 个维度,协方差矩阵满秩没问题,但如果换成高维小样本场景,Σ⁻¹ 的数值稳定性就会翻车,实践中一般加一个小的正则项或者用伪逆。
2.2 高斯混合模型:为什么它比 k-均值多考虑了“方向”
k-均值聚类的隐含假设是每个簇是一个各向同性的球,簇的形状由欧氏距离决定,所有方向上的方差相同。这个假设在鸢尾花数据上直接失效:Setosa 类在花瓣维度上非常紧凑,而 Versicolour 和 Virginica 在花瓣长度和宽度上都有明显的沿对角线方向的延展。用一个球去套一个斜椭圆,边界必然错得离谱。
高斯混合模型的定义是若干高斯成分的加权和:
p(x) = Σₖ πₖ · N(x | μₖ, Σₖ)与 k-均值相比,GMM 多了两样东西:每个成分有自己的协方差矩阵 Σₖ,以及混合权重 πₖ。协方差矩阵允许每个簇在不同方向上有不同的方差,并且刻画维度之间的相关性;混合权重允许不同簇的样本比例不均衡。这两点让 GMM 在鸢尾花这种“类内方差方向不一致”的数据上明显更合适。
参数估计走极大似然。对数似然函数是:
L(θ) = Σᵢ log( Σₖ πₖ · N(xᵢ | μₖ, Σₖ) )直接对 θ 求导没有闭式解,因为 log 里面还有一个求和。标准的做法是 EM 算法:E 步计算每个样本属于每个成分的后验概率(责任度),M 步用加权样本重新估计 μₖ、Σₖ、πₖ,交替迭代到收敛。这份大作业里写的是“在极大似然估计意义下求模型参数”,实际落地时 EM 就是那条必经之路。
提示:GMM 对初始化敏感,不同的初始均值可能收敛到不同的局部最优。鸢尾花三类的真实均值差异较大,随机初始化多次取似然最大的那组,是比较稳妥的做法。
2.3 从密度到判别:马氏距离怎么接上 GMM
GMM 给出的是每个类的概率密度,分类时需要把密度转成判别规则。一种直接的做法是:对每个类拟合一个高斯成分(或一组成分),计算测试样本到各类均值在对应协方差下的马氏距离,取距离最小的类。这本质上等价于在等先验、等代价假设下的最大似然判别。马氏距离在这里不是独立的模块,而是 GMM 判别阶段的度量工具——协方差矩阵 Σₖ 就是 GMM 拟合出来的那个 Σₖ,两者共用同一套参数。理解这一层衔接,才能明白为什么大作业把马氏距离放在算法原理的第一节:它是后面所有判别逻辑的距离基础。
3. 主成分分析与线性判别分析:有标签和无标签的降维差在哪
3.1 PCA 的目标函数为什么是方差最大化
主成分分析的出发点很朴素:如果一组变量之间存在相关性,说明它们反映的信息有重叠,那就找一组新的正交基,让投影后的变量两两不相关,并且尽量保留原始信息。信息量用方差衡量,所以目标就是让投影后的方差最大。
设原始数据是 p 维,要找线性变换 u,使得投影 uᵀx 的方差最大:
max_u uᵀ Σ u s.t. uᵀu = 1用拉格朗日乘子法一解,结论是 u 必须是 Σ 的特征向量,对应的方差就是特征值。第一主成分是最大特征值对应的特征向量,第二主成分是第二大特征值对应的特征向量,依此类推。降维就是只保留前 k 个特征向量,把 p 维数据投影到 k 维子空间。
这里有一个容易被忽略的细节:PCA 对量纲敏感。如果四个特征的单位不同,方差大的维度会主导主成分方向。大作业里明确写了“利用相关矩阵代替协方差矩阵即可消除量纲的影响”——相关矩阵相当于先对每个维度做标准化再算协方差,这是 PCA 预处理的标准动作。鸢尾花四个特征虽然都是厘米,但方差差异仍然存在,用相关矩阵更稳妥。
PCA 的核心局限在于:它完全不知道标签的存在。它找的是数据整体方差最大的方向,而这个方向未必是区分类别最好的方向。在鸢尾花数据上,方差最大的方向很可能主要由 Setosa 和其他两类的差异贡献,但 Versicolour 和 Virginica 之间的区分信息可能落在方差较小的方向上,被 PCA 直接丢掉了。
3.2 LDA 的类间散度与类内散度:为什么它“看见”了标签
线性判别分析的思路完全不同:它要在投影之后让同类样本尽量聚拢、异类样本尽量分开。用两个散度矩阵来量化这个目标:
S_w = Σₖ Σ_{x∈Cₖ} (x - μₖ)(x - μₖ)ᵀ # 类内散度 S_b = Σₖ nₖ (μₖ - μ)(μₖ - μ)ᵀ # 类间散度S_w 衡量每个类内部的紧凑程度,S_b 衡量各类均值相对全局均值的分散程度。Fisher 判别准则就是找一个投影方向 u,使得投影后的类间散度与类内散度之比最大:
max_u (uᵀ S_b u) / (uᵀ S_w u)这个比值叫广义瑞利商,它的解是 S_w⁻¹ S_b 的特征向量。投影方向由 S_w⁻¹ S_b 的最大特征值对应的特征向量给出。直观理解:S_w⁻¹ 相当于先把类内方差“压平”,在这个变换后的空间里,S_b 的最大方向就是类间差异最显著的方向。
与 PCA 对比,LDA 多用了标签信息,所以它优化的目标直接对准分类任务,而不是数据重构。大作业里写“LDA 利用了标签信息,比 PCA 利用了更多的有效信息,因此理论上讲比 PCA 降维效果要更好一些”,这句话的底层依据就是目标函数的不同:PCA 最大化总方差,LDA 最大化类间/类内比。在有标签的场景下,后者显然更贴近判别需求。
但 LDA 也有自己的约束:降维后的维度最多是 min(p, K-1),K 是类别数。鸢尾花三类,LDA 最多降到 2 维。这不是实现限制,而是数学上的秩约束——S_b 的秩不超过 K-1,超过这个维度的方向不携带任何类间区分信息。
3.3 降维即去噪:为什么这一步同时改变了 GMM 的输入分布
大作业里有一句话值得单独拎出来:“采用主成分分析和线性判别分析将之降维,这同时也是去噪的过程。”降维为什么等于去噪?因为被丢弃的那些方向,在统计意义上对应的是方差小、信息量低的分量,其中往往混杂着测量误差和样本波动。把这些方向砍掉,相当于对数据做了一次低通滤波。
但要注意,PCA 和 LDA 去噪的“标准”不一样。PCA 丢掉的是总方差小的方向,LDA 丢掉的是类间区分能力弱的方向。在鸢尾花数据上,这两种标准可能导致不同的保留维度:PCA 可能保留一个方差大但主要反映 Setosa 与其他类差异的方向,而 LDA 会优先保留能分开 Versicolour 和 Virginica 的方向。降维后的数据再喂给 GMM,聚类的效果自然不同——这就是后面刀切法要量化比较的东西。
常见的实现思路是把降维和聚类串成一条管线:先 fit 降维器,transform 数据,再在低维空间上 fit GMM。这里有一个容易踩的坑:降维器必须在训练集上 fit,测试集只能 transform,否则信息泄漏,刀切法评估出来的结果会虚高。
4. 刀切法:为什么留一法能给出更诚实的性能估计
4.1 回报法、交叉验证与留一法的本质区别
模型评估的核心问题是:用训练数据估出来的误差,能不能代表模型在未见数据上的误差?回报法(resubstitution)直接用训练集上的判错率当性能指标,问题是它严重乐观——模型见过这些样本,判错率天然偏低。k 折交叉验证把数据分成 k 份,轮流留一份做测试,缓解了这个问题,但每次训练只用了 (k-1)/k 的数据,训练集规模与最终模型不一致。
刀切法(jackknife),也叫留一法(leave-one-out),是 k 折交叉验证的极端情况:k 等于样本数 n,每次只留一个样本做测试,其余 n-1 个训练。它的好处是训练集规模几乎等于全量数据,偏差最小;代价是要训练 n 次,计算量大。大作业里写“刀切法测试效果优于回报法和交叉验证法,虽然运算量相对很大,但是在计算机辅助下还是比较容易实现的”,说的就是这个取舍。
刀切法的步骤可以概括为:
for 每个样本 i: 用除 i 以外的所有样本训练判别规则 用该规则预测样本 i 记录预测是否正确 判错率 = 判错个数 / 总样本数在鸢尾花数据上,n=150,意味着要完整跑 150 次“降维 + GMM 拟合 + 判别”。如果每次还要做 EM 迭代,计算量确实不小,但 150 个样本、4 维数据,现代机器上完全跑得动。
4.2 用刀切法比较 PCA 与 LDA:降维程度怎么选
这份大作业用刀切法做了一件很有价值的事:不是只比较“PCA vs LDA”,而是比较不同降维程度下的表现。PCA 可以保留 1、2、3 个主成分,LDA 最多保留 2 个判别方向,每一种组合都跑一遍留一法,得到一张判错率随维度变化的表。这张表回答的问题是:降维到几维时,分类性能最好?
直觉上维度越高信息越多,但实际往往不是。维度增加会引入噪声维度,GMM 的参数估计在更高维空间里也更不稳定(协方差矩阵的参数数量随维度平方增长)。所以判错率曲线常常是 U 形的:太低维欠拟合,太高维过拟合,中间某个点最优。刀切法的作用就是把这条曲线画出来,让“降维程度”这个超参数有据可依,而不是拍脑袋。
注意:留一法在类别不均衡时,单样本测试的方差较大。鸢尾花三类各 50 个样本,均衡性很好,这个问题不突出;换成不均衡数据,最好配合分层策略或重复多次。
4.3 计算代价与实现细节:150 次循环里藏着的坑
留一法的实现看起来简单,但有几个细节会直接影响结果的可信度。第一,每次循环里的标准化、PCA/LDA 的 fit 都必须只用训练折的数据,测试样本只能 transform。如果图省事在全量数据上先 fit 一次降维器再循环,信息泄漏会让判错率偏低,这个坑非常隐蔽。第二,GMM 的 EM 初始化如果每次随机,150 次循环之间的结果波动会掩盖方法之间的真实差异,实践中要么固定随机种子,要么多次初始化取最优。第三,判别阶段用马氏距离时,协方差矩阵必须来自当前训练折拟合的 GMM,不能复用全量数据的协方差。
这些细节在论文里往往一笔带过,但它们决定了刀切法给出的数字到底可不可信。血泪经验是:任何涉及“留出”的评估,先把数据切分逻辑写对,再谈模型。
5. 避坑与排查:这条统计管线最容易翻车的五个地方
5.1 现象:PCA 降维后分类效果反而变差
原因:没有对数据做标准化,方差大的特征主导了主成分方向,真正的判别信息被挤到后面的成分里丢掉了。解决:用相关矩阵代替协方差矩阵,或者在 PCA 之前对每个特征做 z-score 标准化。鸢尾花四个特征量纲相同但方差不同,这一步不能省。
5.2 现象:GMM 拟合时协方差矩阵报奇异或接近奇异
原因:某个高斯成分分到的样本太少,或者维度相对样本数太高,Σₖ 不满秩。解决:给协方差矩阵加一个小的对角正则项(如 1e-6 倍单位阵),或者限制协方差矩阵为对角形式。降维本身也是缓解手段——这正是先降维再聚类的动机之一。
5.3 现象:留一法算出来的判错率异常低,低到不合理
原因:信息泄漏。降维器、标准化参数、GMM 参数在全量数据上拟合后又被用于“测试”单个样本。解决:把 fit 严格放进循环内部,每次只用 n-1 个样本。检查方法是故意打乱标签再跑一遍,如果判错率还是异常低,说明泄漏没修干净。
5.4 现象:LDA 降维维度设成 3 维时报错或结果异常
原因:LDA 的降维上限是 min(p, K-1),三类数据最多 2 维,S_b 的秩不够。解决:把 n_components 限制在 K-1 以内。这不是 bug,是判别分析的数学约束,理解秩约束就不会再踩。
5.5 现象:同一份代码多次运行,GMM 聚类结果不稳定
原因:EM 对初始均值敏感,随机初始化可能收敛到不同的局部最优。解决:固定随机种子,或者跑多次初始化取对数似然最大的那组参数。在刀切法循环里尤其要注意,每次循环的初始化策略要一致,否则方法之间的比较失去意义。
6. 设计取舍:为什么这套管线选择“先降维、再聚类、后评估”的顺序
把整条管线串起来看,顺序不是随意排的:马氏距离提供距离度量,PCA/LDA 做维度规约和去噪,GMM 在低维空间做密度建模和聚类,刀切法给出诚实的性能估计。这个顺序背后有三个明确的取舍。
第一个取舍是降维放在聚类之前。GMM 的参数数量随维度平方增长,4 维时每个成分的协方差矩阵有 10 个自由参数,看起来不多,但样本分到每个成分后实际可用样本有限,高维下估计方差大。先降到 1 到 2 维,参数估计稳定得多,代价是可能丢掉一些微弱但有用的判别信息。这个取舍在鸢尾花数据上划算,因为主要判别信息集中在前几个主成分/判别方向上。
第二个取舍是 PCA 与 LDA 并列比较而不是二选一。PCA 不需要标签,适用面广;LDA 需要标签,但在有标签时目标更对准分类。大作业用刀切法把两者在不同维度下的判错率都跑出来,本质上是把“用哪个”变成数据驱动的问题,而不是先验地站队。这种并列比较的思路,比直接说“LDA 更好”更有说服力。
第三个取舍是评估方法选留一法而不是 k 折。150 个样本的规模下,留一法的计算量可以接受,换来的是训练集规模最大化、偏差最小。如果数据量上升到几万,留一法就不现实了,那时 5 折或 10 折交叉验证是更合理的选择。方法的选择永远跟数据规模挂钩,没有普适的最优。
| 环节 | 方法 | 关键参数 | 主要风险 |
|---|---|---|---|
| 距离度量 | 马氏距离 | 协方差矩阵 Σ | Σ 奇异 |
| 降维(无监督) | PCA | 保留主成分数 k | 未标准化导致方向偏移 |
| 降维(有监督) | LDA | 保留判别方向数 ≤ K-1 | 超出秩约束 |
| 聚类/密度建模 | GMM + EM | 成分数、初始化 | 局部最优、Σ 奇异 |
| 性能评估 | 刀切法 | 无 | 信息泄漏 |
如果想验证这套管线是否真的按预期工作,一个简单的自检方法是:先用已知标签算一遍 LDA 降维后的类间分离度,再对比 PCA 降维后的分离度,如果 LDA 的分离度没有明显更高,说明标签信息没有被正确利用,回头检查 fit 的数据里标签有没有对齐。另一个自检是打乱标签重跑,判错率应该退化到接近随机猜测(三类约 67% 错判),如果还是很低,泄漏无疑。
我自己的习惯是,任何带“留出”评估的统计管线,先把数据切分和 fit/transform 的边界画清楚,再动模型参数。从那以后我每次搭这类管线,都强制先跑一遍打乱标签的 sanity check,确认评估逻辑本身没毛病,再去调降维维度和聚类成分数。希望帮到你。
本文还有配套的精品资源,点击获取