首页 / 资讯中心 / 文章详情

鸢尾花降维聚类全流程:PCA、LDA、GMM与刀切法实战

鸢尾花降维聚类全流程:PCA、LDA、GMM与刀切法实战 ★ FEATURED ARTICLE
简介这份资源是数理统计课程大作业的完整文档面向正在学习数理统计、机器学习基础课程的高校学生尤其适合需要完成鸢尾花数据集分析类作业、希望系统梳理统计方法应用思路的读者。压缩包内共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 版本没有缺失值但要注意属性顺序。原始数据列序是花萼长度、花萼宽度、花瓣长度、花瓣宽度很多教程会写成花萼宽度在前如果符号说明表和代码里的列索引对不上后面算协方差矩阵会直接错位。通常的做法是在读入后立刻重命名列并在符号说明表里固定x1sepal_length, x2sepal_width, x3petal_length, x4petal_width后续所有公式和代码只认这套命名。2.2 标准化与相关矩阵量纲问题的第一道关口PCA 的目标是让投影方差最大但如果四个属性量纲不同方差大的属性会主导主成分方向。鸢尾花四个属性单位都是厘米量纲一致但数值范围仍有差异花萼长度约 4.3 到 7.9花瓣宽度约 0.1 到 2.5。为了避免“花瓣宽度方差小就被压掉”的情况标准做法是用相关矩阵代替协方差矩阵等价于先对每个属性做 z-score 标准化。这一步在代码里体现为import numpy as np def standardize(X): # 按列标准化消除量纲影响对应相关矩阵的构造前提 mu X.mean(axis0) sigma X.std(axis0, ddof1) return (X - mu) / sigma, mu, sigmaddof1是样本标准差的无偏估计和后面刀切法留一的思想一致。标准化后的数据均值为 0、方差为 1相关矩阵就是标准化数据的协方差矩阵。这里有个细节如果后续要用马氏距离协方差矩阵必须用原始尺度还是标准化尺度答案是两者都可以但必须和 GMM 拟合时用的尺度一致。我一般统一在标准化空间里做所有计算最后解释主成分载荷时再映射回原始属性名。2.3 符号体系让报告里的公式和代码对得上一份能交上去的大作业符号说明表不是摆设。方案里固定这套符号样本矩阵X为n×pn150p4均值向量μ协方差矩阵Σ相关矩阵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 用了标签目标是最大化类间距离与类内距离的比值所以降维后类间可分性通常更好。方案里设计成对照实验对m1和m2两种降维程度分别记录 PCA 和 LDA 投影后的类间距离、类内散度作为后续 GMM 聚类的输入。这里有个设计取舍LDA 在 3 类问题下最多只能降到 2 维因为S_w^{-1}S_b的秩不超过C-12所以m2是 LDA 的上限而 PCA 可以降到任意维。方案里把m限定在 1 和 2既覆盖了可视化需求也让两种方法在相同维度下可比。如果强行让 LDA 降到 3 维特征值会出现零投影矩阵秩亏后面 GMM 的协方差估计会直接奇异。3.2 第二层GMM 的参数估计与成分数选择GMM 的似然函数是各高斯成分的加权和直接求导没有闭式解标准做法是 EM 算法E 步算每个样本属于各成分的后验概率M 步用后验概率加权更新π_k、μ_k、Σ_k。方案里成分数K取 3对应三个鸢尾花类别但要注意 GMM 是无监督的成分编号和真实标签没有天然对应关系聚类完成后需要用匈牙利算法或混淆矩阵做标签匹配。协方差类型是个容易踩坑的参数。full协方差允许各维度相关且方差不同最灵活但参数最多每个成分p(p1)/2个参数diag只允许各维度方差不同、协方差为零spherical所有维度方差相同。鸢尾花四个属性之间存在相关性花瓣长度和花瓣宽度相关系数约 0.96所以方案里用full协方差这也正是 GMM 相对于 k-均值的地方——k-均值等价于各成分协方差相同且为球形的 GMM。代码骨架如下from sklearn.mixture import GaussianMixture def fit_gmm(X_reduced, n_components3, seed42): # full 协方差允许维度间相关适配鸢尾花属性相关性 gmm GaussianMixture( n_componentsn_components, covariance_typefull, init_paramskmeans, # 用 k-均值初始化均值降低 EM 陷入局部最优的概率 max_iter200, random_stateseed ) gmm.fit(X_reduced) labels gmm.predict(X_reduced) return gmm, labelsinit_paramskmeans是血泪经验纯随机初始化在 2 维降维数据上经常出现两个成分抢同一簇、另一个成分空转的情况换 k-均值初始化后收敛稳定很多。random_state固定是为了刀切法每次留一重跑时结果可复现否则同一份报告两次运行准确率差几个百分点答辩时说不清。3.3 第三层马氏距离做样本指派与异常观察GMM 给出的是后验概率但报告里需要一个“样本到类中心多远”的度量马氏距离正好补这个位置。对降维后的样本x和成分均值μ_k、协方差Σ_k马氏距离为sqrt((x-μ_k)^T Σ_k^{-1} (x-μ_k))。它的好处是考虑了协方差结构当ΣI时退化为欧氏距离当各维度相关时会把相关性折算进距离。方案里用马氏距离做两件事一是对每个样本找最近的高斯成分作为 GMM 聚类的另一种硬指派方式和predict的后验最大指派做一致性比对二是挑出马氏距离明显偏大的样本检查是否是边界样本或降维后信息损失导致的错分。计算时要注意Σ_k可能接近奇异尤其在m1降维时协方差是 1×1直接求逆没问题但m2且某成分样本很少时要用伪逆或加正则项。我一般用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:i1] 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_components3) pred gmm.predict(X_te_r)[0] if pred ! y[i]: errors 1 return errors / nreducer是一个统一接口的包装类PCA 版忽略y_trLDA 版使用y_tr。这样四种组合共用同一套评估循环结果表格里只有reducer类型和n_components两列不同对比干净。4. 实现细节与参数调优把公式落成可跑的代码4.1 PCA 类的 fit/transform 接口设计方案里 PCA 不直接调库而是自己实现一个类目的是让报告里的特征值分解步骤和代码一一对应。fit做标准化、算相关矩阵、特征值分解、按降序取前m个特征向量transform做投影。关键参数是n_components以及是否返回解释方差比。解释方差比等于前m个特征值之和除以特征值总和这个数字在报告里要写清楚因为它直接说明“降到 1 维丢了多少信息”。鸢尾花数据通常前两个主成分累计解释方差超过 95%所以m2是合理选择m1则作为对照展示信息损失。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外层加一个似然记录收敛阈值设tol1e-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 导致协方差奇异现象是m3时 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/50PCA解释方差比、主成分载荷前两主成分累计解释方差 90%LDA类间类内比、投影维数维数 ≤ 2投影后类间可分性优于 PCAGMM对数似然收敛、成分数似然单调K3 时 BIC 合理刀切法四种组合判错率、混淆矩阵判错率可复现混淆矩阵与错分分析一致最后说个习惯从那以后我每次带这类降维加聚类的方案都强制先跑一遍“只降维不聚类”的可视化把 PCA 和 LDA 投影后的散点图并排画出来确认类间结构符合预期再往下接 GMM。这一步花不了十分钟但能提前拦住大部分“降维方向反了”或“标签没对齐”的低级错误。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站