简介:这份资源是数理统计课程大作业的完整文档,面向正在学习数理统计、机器学习基础课程的高校学生,尤其适合需要完成鸢尾花数据集分析类作业、希望系统梳理统计方法应用思路的读者。压缩包内共1个docx文件,约511KB,内容围绕鸢尾花数据集展开,涵盖马氏距离、混合高斯模型、主成分分析、线性判别分析、刀切法等知识点的原理说明与数据处理过程,并附有摘要、目录、符号说明及算法比对章节,结构完整,可直接作为作业撰写与复习的参考框架。目前已有1426人学习下载,说明该文档在同类课程作业中具有一定参考价值。读者可从中获得从数据预处理、降维去噪到聚类分类与模型评估的完整分析链条,理解各方法在多重变量数据上的适用场景与差异,并借鉴其章节组织与结果呈现方式,用于自己的课程报告或方法梳理。
1. 从一份鸢尾花大作业说起:为什么降维和聚类要放在同一套流程里
数理统计大作业最容易翻车的地方,不是公式推不出来,而是把 PCA、LDA、GMM 各写一段代码跑通就交差,最后发现降维后的聚类结果和原始标签对不上,刀切法一跑准确率还不如直接按花瓣长度拍脑袋分类。这份鸢尾花数据集分析方案要解决的就是这个问题:把马氏距离、混合高斯模型、主成分分析、线性判别分析、刀切法串成一条可复现的流水线,让每一步的输出都能被下一步验证。它适合正在做数理统计课程设计、需要交一份完整分析报告的学生,也适合想快速搭一套降维加聚类对比实验框架的从业者。整份方案的核心不是算法本身,而是“降维到什么程度、用哪种降维、聚类效果怎么量化”这三个问题的闭环。
2. 需求拆解与数据准备:150 个样本、4 个属性和 3 个类别的约束
2.1 任务边界:分类问题还是聚类问题
鸢尾花数据集有 150 个观测,每类 50 个,4 个数值属性(花萼长度、花萼宽度、花瓣长度、花瓣宽度),标签是 Setosa、Versicolour、Virginica 三类。这里有个容易被忽略的定位问题:PCA 是无监督的,GMM 也是无监督的,但 LDA 需要标签。所以整条流水线实际上是“有监督降维做对照、无监督聚类做主体、刀切法做裁判”的结构。我一般会把任务拆成两条线:一条用 PCA 和 LDA 分别把 4 维降到 1 维和 2 维,观察降维后类间可分性;另一条在降维后的空间上跑 GMM,用马氏距离把样本指派到高斯成分,再和真实标签比对。两条线的交点就是刀切法评估的输入。
数据本身不需要清洗,UCI 版本没有缺失值,但要注意属性顺序。原始数据列序是花萼长度、花萼宽度、花瓣长度、花瓣宽度,很多教程会写成花萼宽度在前,如果符号说明表和代码里的列索引对不上,后面算协方差矩阵会直接错位。通常的做法是在读入后立刻重命名列,并在符号说明表里固定x1=sepal_length, x2=sepal_width, x3=petal_length, x4=petal_width,后续所有公式和代码只认这套命名。
2.2 标准化与相关矩阵:量纲问题的第一道关口
PCA 的目标是让投影方差最大,但如果四个属性量纲不同,方差大的属性会主导主成分方向。鸢尾花四个属性单位都是厘米,量纲一致,但数值范围仍有差异(花萼长度约 4.3 到 7.9,花瓣宽度约 0.1 到 2.5)。为了避免“花瓣宽度方差小就被压掉”的情况,标准做法是用相关矩阵代替协方差矩阵,等价于先对每个属性做 z-score 标准化。这一步在代码里体现为:
import numpy as np def standardize(X): # 按列标准化,消除量纲影响,对应相关矩阵的构造前提 mu = X.mean(axis=0) sigma = X.std(axis=0, ddof=1) return (X - mu) / sigma, mu, sigmaddof=1是样本标准差的无偏估计,和后面刀切法留一的思想一致。标准化后的数据均值为 0、方差为 1,相关矩阵就是标准化数据的协方差矩阵。这里有个细节:如果后续要用马氏距离,协方差矩阵必须用原始尺度还是标准化尺度?答案是两者都可以,但必须和 GMM 拟合时用的尺度一致。我一般统一在标准化空间里做所有计算,最后解释主成分载荷时再映射回原始属性名。
2.3 符号体系:让报告里的公式和代码对得上
一份能交上去的大作业,符号说明表不是摆设。方案里固定这套符号:样本矩阵X为n×p(n=150,p=4),均值向量μ,协方差矩阵Σ,相关矩阵R,线性变换方向u,类别标签y∈{0,1,2}。GMM 的参数记为混合系数π_k、均值μ_k、协方差Σ_k,成分数K。刀切法的判错数记为k_i,判错率e = Σk_i / n。这套符号在原理推导、代码变量名、结果表格三处必须完全一致,否则答辩时老师问“你公式里的 Σ 和代码里的 cov 是不是一个东西”就会卡住。
3. 算法链路设计:从马氏距离到刀切法的四层结构
3.1 第一层:PCA 与 LDA 的降维对照设计
PCA 的流程是:标准化 → 求相关矩阵 → 特征值分解 → 按特征值降序取前m个特征向量 → 投影。LDA 的流程是:计算类内散度矩阵S_w和类间散度矩阵S_b→ 求解S_w^{-1}S_b的特征值问题 → 取最大特征值对应的方向。两者的关键差异在于 LDA 用了标签,目标是最大化类间距离与类内距离的比值,所以降维后类间可分性通常更好。方案里设计成对照实验:对m=1和m=2两种降维程度,分别记录 PCA 和 LDA 投影后的类间距离、类内散度,作为后续 GMM 聚类的输入。
这里有个设计取舍:LDA 在 3 类问题下最多只能降到 2 维(因为S_w^{-1}S_b的秩不超过C-1=2),所以m=2是 LDA 的上限,而 PCA 可以降到任意维。方案里把m限定在 1 和 2,既覆盖了可视化需求,也让两种方法在相同维度下可比。如果强行让 LDA 降到 3 维,特征值会出现零,投影矩阵秩亏,后面 GMM 的协方差估计会直接奇异。
3.2 第二层:GMM 的参数估计与成分数选择
GMM 的似然函数是各高斯成分的加权和,直接求导没有闭式解,标准做法是 EM 算法:E 步算每个样本属于各成分的后验概率,M 步用后验概率加权更新π_k、μ_k、Σ_k。方案里成分数K取 3,对应三个鸢尾花类别,但要注意 GMM 是无监督的,成分编号和真实标签没有天然对应关系,聚类完成后需要用匈牙利算法或混淆矩阵做标签匹配。
协方差类型是个容易踩坑的参数。full协方差允许各维度相关且方差不同,最灵活但参数最多(每个成分p(p+1)/2个参数);diag只允许各维度方差不同、协方差为零;spherical所有维度方差相同。鸢尾花四个属性之间存在相关性(花瓣长度和花瓣宽度相关系数约 0.96),所以方案里用full协方差,这也正是 GMM 相对于 k-均值的地方——k-均值等价于各成分协方差相同且为球形的 GMM。代码骨架如下:
from sklearn.mixture import GaussianMixture def fit_gmm(X_reduced, n_components=3, seed=42): # full 协方差:允许维度间相关,适配鸢尾花属性相关性 gmm = GaussianMixture( n_components=n_components, covariance_type='full', init_params='kmeans', # 用 k-均值初始化均值,降低 EM 陷入局部最优的概率 max_iter=200, random_state=seed ) gmm.fit(X_reduced) labels = gmm.predict(X_reduced) return gmm, labelsinit_params='kmeans'是血泪经验:纯随机初始化在 2 维降维数据上经常出现两个成分抢同一簇、另一个成分空转的情况,换 k-均值初始化后收敛稳定很多。random_state固定是为了刀切法每次留一重跑时结果可复现,否则同一份报告两次运行准确率差几个百分点,答辩时说不清。
3.3 第三层:马氏距离做样本指派与异常观察
GMM 给出的是后验概率,但报告里需要一个“样本到类中心多远”的度量,马氏距离正好补这个位置。对降维后的样本x和成分均值μ_k、协方差Σ_k,马氏距离为sqrt((x-μ_k)^T Σ_k^{-1} (x-μ_k))。它的好处是考虑了协方差结构:当Σ=I时退化为欧氏距离,当各维度相关时会把相关性折算进距离。方案里用马氏距离做两件事:一是对每个样本找最近的高斯成分,作为 GMM 聚类的另一种硬指派方式,和predict的后验最大指派做一致性比对;二是挑出马氏距离明显偏大的样本,检查是否是边界样本或降维后信息损失导致的错分。
计算时要注意Σ_k可能接近奇异,尤其在m=1降维时协方差是 1×1,直接求逆没问题,但m=2且某成分样本很少时要用伪逆或加正则项。我一般用np.linalg.pinv兜底,并在报告里注明“协方差矩阵条件数过大时采用伪逆”。
3.4 第四层:刀切法的评估协议
刀切法(留一法)的流程是:每次剔除一个样本,用剩余 149 个样本重新拟合降维和 GMM,预测被剔除样本的类别,统计判错数。150 次循环,每次都要重跑 PCA/LDA 和 GMM,计算量不小但完全可接受。方案里设计成对四种组合分别评估:PCA-1维、PCA-2维、LDA-1维、LDA-2维,每种组合记录判错率和混淆矩阵。这样做的价值在于,它回答的不是“哪个算法最好”,而是“在留一法这种接近无偏的评估下,降维方法和降维程度对最终聚类效果的影响有多大”。
实现上有个效率技巧:PCA 和 LDA 的投影方向在留一时会随训练集变化,严格来说每次都要重算,不能提前算好全局投影再套用。如果为了省时间用全局投影,评估结果会偏乐观,因为被剔除样本的信息已经泄漏进投影方向。方案里坚持每次重算,代码结构如下:
def loo_evaluate(X, y, reducer, n_components): n = len(y) errors = 0 for i in range(n): # 留一:剔除第 i 个样本,重算降维方向,避免信息泄漏 mask = np.arange(n) != i X_tr, y_tr = X[mask], y[mask] X_te = X[i:i+1] reducer.fit(X_tr, y_tr) X_tr_r = reducer.transform(X_tr) X_te_r = reducer.transform(X_te) gmm, _ = fit_gmm(X_tr_r, n_components=3) pred = gmm.predict(X_te_r)[0] if pred != y[i]: errors += 1 return errors / nreducer是一个统一接口的包装类,PCA 版忽略y_tr,LDA 版使用y_tr。这样四种组合共用同一套评估循环,结果表格里只有reducer类型和n_components两列不同,对比干净。
4. 实现细节与参数调优:把公式落成可跑的代码
4.1 PCA 类的 fit/transform 接口设计
方案里 PCA 不直接调库,而是自己实现一个类,目的是让报告里的特征值分解步骤和代码一一对应。fit做标准化、算相关矩阵、特征值分解、按降序取前m个特征向量;transform做投影。关键参数是n_components,以及是否返回解释方差比。解释方差比等于前m个特征值之和除以特征值总和,这个数字在报告里要写清楚,因为它直接说明“降到 1 维丢了多少信息”。鸢尾花数据通常前两个主成分累计解释方差超过 95%,所以m=2是合理选择,m=1则作为对照展示信息损失。
4.2 LDA 的类内类间散度矩阵计算
LDA 的核心是S_w和S_b。S_w是各类内协方差矩阵按样本数加权的和,S_b是各类均值与总均值之差的加权外积和。求解S_w^{-1}S_b的特征值问题时,S_w必须可逆,如果某类样本在降维后完全共线,S_w会奇异。鸢尾花数据在原始 4 维下S_w满秩,但留一法中剔除一个样本后仍满秩,所以直接求逆可行。为了数值稳定,我一般用scipy.linalg.eigh先对S_w做 Cholesky 分解再解广义特征值问题,避免显式求逆带来的精度损失。
4.3 GMM 的 EM 收敛监控与初始化策略
EM 算法需要监控对数似然是否单调上升。如果出现下降,说明实现有 bug 或数值下溢。方案里在fit_gmm外层加一个似然记录,收敛阈值设tol=1e-3,最大迭代 200 次。初始化除了 k-均值,还可以跑多次不同随机种子取似然最大的那次,但刀切法 150 次循环下这会拖慢整体时间,所以固定单次 k-均值初始化加固定种子,在报告里注明“为控制留一法计算量,未做多起点初始化”。
4.4 刀切法的循环组织与结果汇总
150 次循环的结果要汇总成两张表:一张是四种组合的判错率,一张是每种组合的混淆矩阵。混淆矩阵能看出错分主要发生在 Versicolour 和 Virginica 之间,这两类在原始属性空间就有重叠,降维后如果只保留 1 维,重叠会更严重。方案里把这两张表和 PCA 解释方差比、LDA 类间类内比放在同一节,形成“降维质量 → 聚类质量 → 评估结果”的证据链。
5. 避坑与常见问题:这份方案里最容易翻车的五个点
5.1 标准化顺序错误导致 PCA 和 GMM 尺度不一致
现象是 PCA 投影后的数据方差很小,GMM 拟合出的协方差接近零,聚类结果全挤在一个成分里。原因是 PCA 前做了标准化,但 GMM 输入的是未标准化的原始降维坐标,或者反过来。解决方法是把标准化封装进 PCA 类的fit里,transform输出已经是标准化空间的投影,GMM 直接吃这个输出,不再二次处理。报告里要明确写“所有降维和聚类均在标准化空间进行”。
5.2 LDA 降维维数超过 C-1 导致协方差奇异
现象是m=3时 LDA 投影矩阵出现零特征值,GMM 报covariance is not positive-definite。原因是 3 类问题下S_b的秩最多为 2,第三个判别方向不存在。解决方法是在代码里加断言n_components <= n_classes - 1,并在方案设计阶段就把 LDA 的维数限定在 1 和 2。
5.3 刀切法中用全局投影造成信息泄漏
现象是留一法准确率异常高,接近 100%,但换一批数据或换随机种子后大幅下降。原因是投影方向用了全部 150 个样本计算,被剔除样本的信息已经进入降维步骤。解决方法是每次留一时在 149 个样本上重算fit,虽然慢但评估可信。这个坑在答辩时很容易被问,报告里最好主动写明“留一法严格重算降维方向”。
5.4 GMM 成分标签与真实类别错位
现象是聚类准确率算出来只有 30% 多,但混淆矩阵显示其实是完美聚类,只是成分编号和标签编号对不上。原因是 GMM 的成分编号是任意的。解决方法是用混淆矩阵做标签匹配,取匹配后的对角线和除以总数作为准确率,或者用匈牙利算法求最大匹配。报告里不能直接拿predict输出和y逐元素比。
5.5 马氏距离计算时协方差矩阵未加正则
现象是某些样本的马氏距离出现inf或nan。原因是降维后某成分样本数少于维数,协方差矩阵秩亏。解决方法是在求逆前给对角线加一个小正则项1e-6,或用伪逆。报告里注明“协方差矩阵条件数超过阈值时采用伪逆”。
6. 验收与答辩:怎么证明这套流水线真的跑通了
验收这份大作业,我一般不看代码行数,看三样东西能不能对上:解释方差比、混淆矩阵、判错率表。解释方差比证明降维没丢太多信息,混淆矩阵证明聚类错在哪,判错率表证明刀切法评估是诚实的。答辩时老师最常问的三个问题,提前准备好答案:第一,“为什么用相关矩阵不用协方差矩阵”——答量纲和方差主导问题,并指出标准化后两者等价;第二,“LDA 为什么只降到 2 维”——答S_b秩不超过C-1;第三,“刀切法比交叉验证好在哪”——答留一法在样本量小(150)时偏差最小,虽然方差大但计算可承受。
具体验收步骤可以按这张表走:
| 验收项 | 检查内容 | 合格标准 |
|---|---|---|
| 数据读取 | 列名与符号说明一致,无缺失 | 150 行 5 列,标签分布 50/50/50 |
| PCA | 解释方差比、主成分载荷 | 前两主成分累计解释方差 > 90% |
| LDA | 类间类内比、投影维数 | 维数 ≤ 2,投影后类间可分性优于 PCA |
| GMM | 对数似然收敛、成分数 | 似然单调,K=3 时 BIC 合理 |
| 刀切法 | 四种组合判错率、混淆矩阵 | 判错率可复现,混淆矩阵与错分分析一致 |
最后说个习惯:从那以后我每次带这类降维加聚类的方案,都强制先跑一遍“只降维不聚类”的可视化,把 PCA 和 LDA 投影后的散点图并排画出来,确认类间结构符合预期再往下接 GMM。这一步花不了十分钟,但能提前拦住大部分“降维方向反了”或“标签没对齐”的低级错误。希望帮到你。
本文还有配套的精品资源,点击获取