简介这份数理统计大作业文档面向高校统计学、数据分析相关课程的学生围绕经典鸢尾花数据集展开完整分析可作为课程作业参考或统计方法实践范本。压缩包内共1个docx文件约511KB内容涵盖数据及符号说明、算法原理分析、数据处理与结果比对等章节结构完整。文档系统运用马氏距离度量样本相似度借助主成分分析与线性判别分析完成降维去噪并以混合高斯模型在极大似然意义下聚类最后用刀切法留一法比较不同降维方法与模型的差异兼顾类间离差放大与类内离差缩小。已有1429人学习下载适合需要理解统计方法如何落地到真实数据、对照实验流程与结论撰写作业的读者参考。1. 鸢尾花降维分类为什么四个特征里藏着两条“看不见的轴”鸢尾花数据集常被当成入门练手的第一课150 个样本、4 个数值特征、3 个类别看起来简单到没什么可挖。但真正动手做过分类的人会发现一个反直觉的现象把 4 维特征直接丢进分类器效果往往不如先降到 2 维再分类。这不是玄学而是因为花萼长度、花萼宽度、花瓣长度、花瓣宽度这四个量之间存在明显的线性相关信息本身是冗余的。数理统计大作业里围绕鸢尾花做的这套分析核心就在回答一个问题降维到底降掉了什么、保留了什么以及为什么带标签的降维比不带标签的降维更“懂”数据。搞懂这条链路比背十个算法名字有用得多。2. 马氏距离为什么欧氏距离在相关特征上会翻车2.1 欧氏距离的隐含假设欧氏距离的公式是两点坐标差的平方和开根号它默认了一件事各个维度是同等重要、彼此独立的。这个假设在鸢尾花数据上直接翻车。花萼长度和花瓣长度高度正相关一个样本在这两个维度上同时偏大欧氏距离会把这份“同向偏移”重复计算两次导致距离被放大。更麻烦的是量纲问题如果某个特征用厘米、另一个用毫米数值差几个数量级欧氏距离几乎只由大数值那个维度决定小维度等于被忽略了。马氏距离要解决的就是这两件事。它把协方差矩阵 Σ 引入距离计算本质上是先对数据做一次白化变换把相关的、量纲不一的特征拉回到同一个标准正态空间里再算距离。当 Σ 等于单位矩阵时马氏距离退化成欧氏距离这个退化关系恰好说明了欧氏距离是马氏距离的一个特例。2.2 协方差矩阵如何“校正”距离马氏距离的定义是 $d(x,\mu)\sqrt{(x-\mu)^T\Sigma^{-1}(x-\mu)}$。关键在于 $\Sigma^{-1}$ 这个逆矩阵协方差大的方向逆矩阵对应元素小距离被压缩协方差小的方向逆矩阵元素大距离被放大。换句话说它自动给“信息量大的方向”加权给“噪声大的方向”降权。这里有个容易踩的坑Σ 必须是正定的才能求逆。样本量小于特征维度时协方差矩阵会奇异直接求逆会报错或者得到数值爆炸的结果。常见的处理是加一个很小的对角扰动正则化或者先做降维再算马氏距离。鸢尾花只有 4 维、150 个样本Σ 是良态的所以可以直接求逆但换成高维小样本场景这一步就是血泪经验的来源。import numpy as np def mahalanobis(x, mu, cov, reg1e-6): # cov 可能奇异加对角扰动保证可逆 cov_reg cov reg * np.eye(cov.shape[0]) inv_cov np.linalg.inv(cov_reg) diff x - mu # 二次型 (x-mu)^T Σ^-1 (x-mu) return np.sqrt(diff.T inv_cov diff)这段代码里reg参数就是后悔药数值一般取 1e-6 到 1e-3太大则校正失效、退化成欧氏距离太小则压不住奇异。diff.T inv_cov diff是标准的二次型写法注意顺序不能反矩阵乘法不满足交换律。2.3 尺度无关性带来的实际好处马氏距离是无量纲的这一点在鸢尾花上体现得很直接四个特征虽然都是厘米但花萼长度跨度约 4.3 到 7.9花瓣宽度只有 0.1 到 2.5数值范围差了好几倍。不做标准化直接算欧氏距离花瓣宽度几乎不起作用马氏距离通过 Σ 自动完成了标准化不需要手动做 z-score。这也是为什么后面用高斯混合模型时判断样本归属用的是马氏距离而不是欧氏距离——它和协方差结构是自洽的。3. 高斯混合模型为什么聚类不能只找一个中心3.1 从单高斯到混合分布k-均值聚类的假设非常强每个簇是一个球球的大小一样、方向无关。鸢尾花三个类别里Setosa 和另外两类分得很开但 Versicolour 和 Virginica 在花瓣长度上有重叠而且各类的协方差形状并不相同。用一个球去套所有簇边界必然错位。高斯混合模型换了个思路不假设每个簇是球而是假设每个簇服从一个多元高斯分布有自己的均值 μ、自己的协方差 Σ、自己的混合权重 π。整个数据的分布是若干个高斯的加权和$$p(x)\sum_{k1}^{K}\pi_k \mathcal{N}(x|\mu_k,\Sigma_k)$$Σ 是完整矩阵而不是对角阵这意味着它同时刻画了每个维度自己的方差不同方向上的散布和维度之间的相关性协方差。这正是它比 k-均值强的地方椭球可以倾斜、可以胖瘦不一贴合真实簇的形状。3.2 极大似然估计与 EM 的必然性有了模型形式下一步是求参数。直接对对数似然求导会发现方程里出现了“样本属于某个高斯的后验概率”这个隐变量导数方程没有闭式解。这就是为什么 GMM 的参数估计必须走 EM 算法E 步用当前参数算每个样本属于各高斯的责任度后验概率M 步用责任度加权更新 μ、Σ、π交替迭代直到似然收敛。def e_step(X, weights, means, covs): # 计算每个样本对每个高斯的责任度 n, k X.shape[0], len(weights) resp np.zeros((n, k)) for j in range(k): diff X - means[j] inv np.linalg.inv(covs[j]) # 多元高斯密度省略归一化常数后面统一归一化 resp[:, j] weights[j] * np.exp(-0.5 * np.einsum(ni,ij,nj-n, diff, inv, diff)) resp / resp.sum(axis1, keepdimsTrue) # 按行归一化成概率 return respeinsum(ni,ij,nj-n, diff, inv, diff)是批量计算马氏距离平方的紧凑写法等价于对每个样本算二次型。resp.sum(axis1)按行求和再归一化保证每个样本对 K 个高斯的责任度加起来等于 1。M 步则用resp做加权平均更新均值和协方差权重更新为各列责任度的均值。3.3 协方差矩阵的退化风险GMM 最脆弱的地方在 Σ。如果某个高斯只分到极少数样本或者样本在某个方向上几乎共线Σ 会接近奇异求逆时数值不稳定责任度计算直接崩掉。工程上的常见做法是给 Σ 加一个小的对角正则项或者限制 Σ 为对角阵代价是丢掉维度间相关性。鸢尾花数据量足够、维度低完整协方差是可行的但换成高维数据这个取舍就必须提前想清楚。4. 主成分分析与线性判别分析降维的两种世界观4.1 PCA 在优化什么PCA 的目标函数很纯粹找一个投影方向 u使得投影后的方差最大即 $\max_u u^T\Sigma u$约束 $u^Tu1$。解是 Σ 最大特征值对应的特征向量。第二个主成分在与第一个正交的约束下继续最大化方差依此类推。整个过程只用了 X完全没看标签。这带来一个根本性的局限方差大的方向不一定是分类有用的方向。鸢尾花里花瓣长度方差很大PCA 会优先保留它但如果两个类别恰好在这个方向上均值接近、只是散布不同PCA 帮不上分类的忙。更极端的情况是判别信息藏在一个方差很小的方向上PCA 会把它当噪声丢掉。4.2 LDA 如何把标签信息编进目标函数LDA 的目标函数换成了 Fisher 准则最大化类间散度与类内散度的比值。定义类内散度矩阵 $S_w$ 和类间散度矩阵 $S_b$目标是 $\max_u \frac{u^T S_b u}{u^T S_w u}$。解是 $S_w^{-1}S_b$ 的特征向量。这个式子的物理意义很直白分子希望投影后不同类别的中心离得远分母希望同一类别内部的点聚得紧。PCA 只看分母总方差LDA 同时看分子和分母所以它是在“为分类而降维”而不是“为保留信息而降维”。鸢尾花上 LDA 通常只需要 2 个判别方向就能把三类分得很开因为类别数减一就是判别方向数的上界。def lda_fit(X, y): classes np.unique(y) mean_all X.mean(axis0) Sw np.zeros((X.shape[1], X.shape[1])) Sb np.zeros_like(Sw) for c in classes: Xc X[y c] mean_c Xc.mean(axis0) # 类内散度各类协方差之和 Sw (Xc - mean_c).T (Xc - mean_c) # 类间散度类中心相对总中心的加权外积 n_c Xc.shape[0] diff (mean_c - mean_all).reshape(-1, 1) Sb n_c * (diff diff.T) # 求解广义特征值问题 Sw^-1 Sb eigvals, eigvecs np.linalg.eig(np.linalg.inv(Sw) Sb) idx np.argsort(eigvals.real)[::-1] return eigvecs[:, idx].realSw累加的是每个类内部去中心化后的外积Sb累加的是类中心偏移的外积并按类样本数加权。np.linalg.eig返回的特征值可能是复数取实部排序是常规操作。注意Sw同样可能奇异实践中常加正则项或用伪逆。4.3 降维即去噪的机制把 4 维降到 2 维丢掉的那两个方向是什么对 PCA 来说是最小特征值对应的方向也就是方差最小、最可能是测量噪声的方向。对 LDA 来说是类内散度大而类间散度小的方向也就是“对分类没帮助的变异”。两种方法丢的东西不一样但都起到了去噪作用。降维之后再做 GMM参数数量大幅减少4 维完整协方差有 10 个自由参数2 维只有 5 个小样本下的估计方差随之下降这就是“降维提升聚类效果”的底层原因不是什么玄学调参。5. 刀切法比对为什么留一法能给出更诚实的评价5.1 回报法的乐观偏差如果用训练集本身来评估分类器准确率会虚高。模型在训练时已经“见过”这些样本尤其是 GMM 这种参数多的模型对训练样本的拟合天然偏好。回报法resubstitution就是这种评估方式它的误差估计是有偏的、偏乐观的。5.2 留一法的机制与代价刀切法留一法每次从 n 个样本里剔除一个用剩下 n-1 个训练对被剔除的那个做预测重复 n 次统计判错个数。这样每个样本都恰好当过一次测试集评估结果几乎无偏。代价是训练 n 次计算量是回报法的 n 倍。鸢尾花只有 150 个样本这个代价完全可接受换成百万级样本留一法就不现实了得退到 k 折交叉验证。在降维方法比对里留一法的价值在于它把“降维 聚类 判别”整条链路当成一个整体来评估。PCA 降到几维、LDA 降到几维每种组合都走一遍留一法得到的判错率才是可比的。如果只在训练集上比PCA 和 LDA 的差距会被系统性低估或高估。提示留一法评估时降维的变换矩阵必须在每一折的训练集上重新拟合不能在全量数据上先降维再切分否则测试样本的信息会泄漏进训练过程评估结果偏乐观。6. 避坑与排查这套流程里最容易翻车的几处6.1 现象PCA 降维后分类效果反而变差原因没有对数据做标准化直接对原始协方差矩阵做特征分解量纲大的特征主导了主成分方向。解决用相关矩阵代替协方差矩阵等价于先做 z-score 再 PCA消除量纲影响。6.2 现象GMM 迭代过程中似然值不升反降或震荡原因协方差矩阵接近奇异求逆数值不稳定责任度计算出 NaN。解决给 Σ 加对角正则项或改用对角协方差同时检查是否有高斯分到了零个有效样本必要时重新初始化。6.3 现象LDA 求解时报矩阵奇异原因$S_w$ 不满秩常见于样本数少于特征维度或某个类别样本极少。解决对 $S_w$ 加正则项或用伪逆np.linalg.pinv代替直接求逆。6.4 现象留一法准确率异常高接近 100%原因降维步骤在全量数据上先做了测试样本信息泄漏进训练。解决把降维拟合放进每一折的训练循环内部严格隔离测试样本。6.5 现象马氏距离算出来是 NaN 或极大值原因协方差矩阵奇异导致求逆失败或某个维度方差为零。解决检查是否有常数列特征加正则扰动或先剔除零方差维度。7. 设计取舍降维程度到底该由谁决定这套流程里最值得琢磨的取舍是“降到几维”这个决定该由什么来定。PCA 降到 2 维还是 3 维LDA 用 1 个还是 2 个判别方向表面上是超参数实际上反映的是你对“信息”和“噪声”边界的判断。PCA 的碎石图能告诉你方差贡献率但方差大不等于分类有用LDA 的判别方向数有理论上界类别数减一但上界之内选几个仍然要靠留一法这类外部评估来定。我一般的理解是降维方法负责“生成候选表示”评估方法负责“挑选表示”两者不能混在一起。如果拿训练集上的聚类紧致度去选降维维度等于让模型自己给自己打分结果一定偏乐观。留一法在这里扮演的角色就是一个不参与训练的裁判。另一个取舍是 GMM 的协方差结构。完整协方差最灵活但参数多、易奇异对角协方差稳但丢掉了维度间相关性。鸢尾花的四个特征相关性明显完整协方差是合理选择如果特征维度上升到几十维、样本量又不大对角协方差或者先降维再建模往往是更稳的路子。这个取舍没有标准答案取决于你对数据相关结构的先验判断和样本量。还有一个容易被忽略的点马氏距离、GMM、LDA 三者其实共享同一个协方差假设。GMM 的每个高斯有自己的 ΣLDA 用 pooled 的 $S_w$马氏距离用全局 Σ。如果数据本身不满足高斯假设这条链路的每一环都会打折扣。鸢尾花数值型、近似高斯所以走得通换成类别型或重尾分布的数据就得换工具。从那以后我每次做降维加聚类的流程都会强制走一遍“先留出评估、再拟合变换”的顺序哪怕数据量小到看起来没必要。这个习惯帮我避开了好几次信息泄漏导致的虚高准确率。希望帮到你。本文还有配套的精品资源点击获取