
简介本资源是高校数理统计课程的大作业实践报告面向统计学、数据科学及相关专业本科生聚焦经典鸢尾花数据集的多方法综合分析。报告系统应用马氏距离度量样本相似性、混合高斯模型实现无监督聚类、主成分分析与线性判别分析进行降维与可分性提升并采用刀切法留一法评估不同降维策略与模型的泛化性能完整覆盖课程核心知识点与建模流程。资源为1个511KB的Word文档.docx内容结构严谨含摘要、引言、六大算法原理详述3.1–3.5节、四阶段数据处理分析4.1–4.4节及关键词与目录公式推导、代码逻辑说明与结果比对清晰可循。目前已有1426人学习下载适合课程复习、大作业参考、统计建模入门与算法对比研究。1. 鸢尾花数据集不是“玩具数据”它用4维原始特征暴露出PCA与LDA在降维逻辑上的根本性断裂你可能早就跑过sklearn.datasets.load_iris()三行代码画个散点图再套个PCA(n_components2)就完事——但这份孙海燕老师布置的数理统计大作业偏偏要求你不调用现成的fit_transform而是从协方差矩阵手撕特征向量、从类间散度矩阵推导投影方向、用马氏距离替代欧氏距离做判别、再拿刀切法Leave-One-Out一一点验每个样本的泛化鲁棒性。这不是炫技而是一次对“降维”本质的强制解构当原始4维空间中Setosa类天然线性可分、Versicolour与Virginica却严重重叠时PCA只看数据整体方差分布把最大能量方向强行拉成第一主成分而LDA却盯着标签硬生生在两类重叠区“劈”出一条最大化类间分离、最小化类内混杂的直线。结果呢同一组鸢尾花数据PCA降维后画出的二维散点图里Versicolour和Virginica像被揉皱的纸团一样糊在一起LDA降维后它们却像被磁铁南北极推开一样清晰分离——这不是算法“效果好”而是两种降维范式在数学目标上就互不兼容一个在无监督空间里找信息密度峰一个在有监督空间里挖判别性峡谷。这份大作业的真正价值正在于它用最简数据集把统计学习中“无监督压缩”与“有监督判别”这两条底层路径的撕裂感赤裸裸地钉在你眼前。2. 主成分分析为什么必须用相关矩阵而非协方差矩阵——量纲陷阱与特征缩放的物理意义2.1 协方差矩阵失效的根源花萼宽度cm与花瓣长度cm的单位战争鸢尾花四个原始特征的量纲差异是致命的花萼宽度均值约3.0 cm标准差0.43 cm花瓣长度均值约3.76 cm标准差1.76 cm。若直接计算协方差矩阵 Σ其对角线元素即各变量方差将呈现数量级差异import numpy as np from sklearn import datasets iris datasets.load_iris() X iris.data # shape (150, 4) print(各特征方差, np.var(X, axis0)) # 输出示例[0.68569351 0.18802403 3.11317942 0.58100626] # 花瓣长度方差3.11是花萼宽度方差0.188的16.5倍注意协方差矩阵的特征向量方向由方差主导而非结构主导。当某维度方差远超其他维度时最大特征值必然对应此维度方向——这等价于把“花瓣长度”这个单一指标当成主成分彻底忽略花萼宽度、花瓣宽度等变量间的协同关系。这违背PCA“提取多变量联合变异模式”的初衷。2.2 相关矩阵的救赎标准化如何让不同物理量在同一个数学平面上对话相关矩阵 R 的定义为$$ R_{ij} \frac{\text{Cov}(X_i, X_j)}{\sigma_i \sigma_j} $$其中 $\sigma_i$ 是第 $i$ 个变量的标准差。它本质是对原始数据做Z-score标准化$$ Z_i \frac{X_i - \mu_i}{\sigma_i} $$此时所有变量均值为0、标准差为1量纲被彻底抹除。对鸢尾花数据计算相关矩阵后其特征值分布才真实反映变量间的结构关联# 手动构建相关矩阵不依赖sklearn X_centered X - np.mean(X, axis0) stds np.std(X, axis0, ddof1) X_std X_centered / stds # Z-score标准化 R np.cov(X_std, rowvarFalse) # 相关矩阵 标准化后数据的协方差矩阵 eigvals_R, eigvecs_R np.linalg.eigh(R) # 注意eigh用于对称矩阵更稳定 print(相关矩阵特征值降序, np.sort(eigvals_R)[::-1]) # 输出示例[2.91808511 0.91403047 0.14675691 0.02112751] # 前两个主成分累计贡献率 (2.9180.914)/4 ≈ 95.8%符合降维预期关键机制说明特征值 $\lambda_k$ 表示第 $k$ 个主成分解释的标准化后总方差比例因R的迹4即总方差4特征向量 $\mathbf{u}k$ 的分量 $u{kj}$ 表示第 $j$ 个原始变量如花瓣长度对第 $k$ 个主成分的载荷loading其绝对值越大说明该变量对此主成分贡献越强第一主成分方向 $\mathbf{u}1$ 在花瓣长度$u{13}≈0.52$和花瓣宽度$u_{14}≈0.58$上载荷最高印证了“花瓣尺寸”是区分Setosa与其他两类的核心维度——这正是PCA要捕捉的多变量协同变异模式。2.3 PCA降维的完整实现从特征分解到投影坐标的物理重建PCA降维不是黑箱而是严格的线性变换$$ \mathbf{Z} (\mathbf{X} - \boldsymbol{\mu}) \mathbf{U}_k $$其中 $\mathbf{U}_k$ 是前 $k$ 个特征向量组成的矩阵$p \times k$$\mathbf{Z}$ 是降维后坐标$n \times k$。手写实现需严格遵循此流程class ManualPCA: def __init__(self, n_components2): self.n_components n_components self.mean_ None self.std_ None self.components_ None # 特征向量矩阵 U_k def fit(self, X): self.mean_ np.mean(X, axis0) self.std_ np.std(X, axis0, ddof1) # 标准化 X_std (X - self.mean_) / self.std_ # 计算相关矩阵 R np.cov(X_std, rowvarFalse) # 特征分解按特征值降序排列 eigvals, eigvecs np.linalg.eigh(R) idx np.argsort(eigvals)[::-1] eigvals eigvals[idx] eigvecs eigvecs[:, idx] # 取前n_components个特征向量 self.components_ eigvecs[:, :self.n_components] return self def transform(self, X): X_std (X - self.mean_) / self.std_ return X_std self.components_ # 投影Z X_std * U_k # 验证手动PCA vs sklearn pca_manual ManualPCA(n_components2).fit(X) Z_manual pca_manual.transform(X) from sklearn.decomposition import PCA pca_sklearn PCA(n_components2).fit(X) Z_sklearn pca_sklearn.transform(X) # 检查结果一致性允许数值误差 print(坐标最大偏差, np.max(np.abs(Z_manual - Z_sklearn))) # 输出应接近 1e-15证明手写实现与sklearn数学等价参数说明与设计取舍ddof1样本标准差使用贝塞尔校正无偏估计符合统计惯例np.linalg.eigh专用于实对称矩阵相关矩阵R必对称比eig更高效稳定投影公式X_std self.components_是核心——它表明PCA降维本质是在标准化空间中将数据点向主成分方向做正交投影投影坐标即新空间中的“位置”。2.4 避坑PCA常见翻车现场与根因诊断现象1降维后可视化散点图完全无法区分三类且各类样本呈圆形均匀分布原因未对数据做标准化直接使用原始数据计算协方差矩阵。花萼宽度小方差被花瓣长度大方差完全压制导致第一主成分几乎纯为花瓣长度丢失所有判别结构。解决强制使用相关矩阵即先Z-score标准化或在sklearn.PCA中设置svd_solverfull并传入标准化数据。现象2np.linalg.eig报错“Eigenvalues did not converge”或特征向量出现大量NaN原因协方差/相关矩阵存在微小数值误差如浮点精度导致非严格对称eig对非对称矩阵不稳定。解决改用np.linalg.eigh仅接受对称矩阵或预处理矩阵R_sym (R R.T) / 2强制对称。现象3前两个主成分累计方差贡献率仅60%远低于预期的95%原因误用协方差矩阵后特征值之和等于原始方差总和非4导致贡献率计算失真。例如协方差矩阵迹为sum(var(X, axis0)) ≈ 4.5但若某维度方差异常大前两特征值之和可能仅占4.5的60%。解决计算贡献率时务必使用相关矩阵的特征值其迹恒为4公式为cumsum(eigvals[:k]) / 4。现象4transform后得到的坐标矩阵形状为(150, 4)而非(150, 2)原因components_矩阵维度错误——若取前2个特征向量components_应为(4, 2)但代码中误写为(2, 4)导致矩阵乘法X_std components_维度不匹配或结果错位。解决严格检查components_形状assert components_.shape (X.shape[1], n_components)。3. 线性判别分析为什么LDA的投影方向必须同时满足“类内紧致”与“类间分离”双重约束3.1 LDA的目标函数从Fisher准则到广义特征值问题的数学跃迁LDA不是寻找最大方差方向而是求解一个带约束的优化问题找到投影方向 $\mathbf{w}$使得投影后类间离差Between-class scatter与类内离差Within-class scatter的比值最大化。定义类内散度矩阵 $S_W \sum_{i1}^{c} \sum_{\mathbf{x} \in C_i} (\mathbf{x} - \boldsymbol{\mu}_i)(\mathbf{x} - \boldsymbol{\mu}_i)^T$类间散度矩阵 $S_B \sum_{i1}^{c} n_i (\boldsymbol{\mu}_i - \boldsymbol{\mu})(\boldsymbol{\mu}_i - \boldsymbol{\mu})^T$其中 $c3$ 为类别数$n_i$ 为第 $i$ 类样本数$\boldsymbol{\mu}_i$ 为第 $i$ 类均值$\boldsymbol{\mu}$ 为全局均值。Fisher准则函数为$$ J(\mathbf{w}) \frac{\mathbf{w}^T S_B \mathbf{w}}{\mathbf{w}^T S_W \mathbf{w}} $$关键推导对 $J(\mathbf{w})$ 求梯度并令其为零可得广义特征值方程$$ S_B \mathbf{w} \lambda S_W \mathbf{w} $$当 $S_W$ 可逆时等价于 $S_W^{-1} S_B \mathbf{w} \lambda \mathbf{w}$。因此最优投影方向 $\mathbf{w}$ 是矩阵 $S_W^{-1} S_B$ 的最大特征值对应的特征向量。3.2 手撕 $S_W$ 与 $S_B$从原始数据到散度矩阵的逐层构建鸢尾花数据含3类每类50样本。手动计算散度矩阵需精确分组y iris.target # [0,0,...,1,1,...,2,2...] # 分别提取三类数据 X0 X[y0] # Setosa, shape (50, 4) X1 X[y1] # Versicolour, shape (50, 4) X2 X[y2] # Virginica, shape (50, 4) # 全局均值 mu_global np.mean(X, axis0) # 各类均值 mu0 np.mean(X0, axis0) mu1 np.mean(X1, axis0) mu2 np.mean(X2, axis0) # 类内散度矩阵 S_W S_W np.zeros((4,4)) for Xi, mu_i in [(X0, mu0), (X1, mu1), (X2, mu2)]: diff Xi - mu_i # (50,4) S_W diff.T diff # 累加 (4,4) 矩阵 # 类间散度矩阵 S_B S_B np.zeros((4,4)) for mu_i, ni in [(mu0, 50), (mu1, 50), (mu2, 50)]: diff mu_i - mu_global # (4,) S_B ni * np.outer(diff, diff) # (4,4) print(S_W 迹 , np.trace(S_W)) # 类内总离差 print(S_B 迹 , np.trace(S_B)) # 类间总离差 # 输出示例S_W迹≈120.5, S_B迹≈250.3 → 类间离差显著大于类内离差机制说明$S_W$ 的每个元素 $[S_W]_{jk}$ 衡量第 $j$ 和第 $k$ 个变量在同类样本内的协变程度迹 $\text{tr}(S_W)$ 是所有变量类内方差之和代表类内“紧致度”$S_B$ 的迹 $\text{tr}(S_B)$ 衡量各类均值相对于全局均值的偏离总和代表类间“分离度”Fisher比值 $J(\mathbf{w})$ 的物理意义是在方向 $\mathbf{w}$ 上类间分离强度与类内混杂强度的比值。LDA追求此比值最大化。3.3 求解广义特征值$S_W^{-1}S_B$ 的病态性与伪逆解法实际计算中$S_W$ 常为奇异矩阵秩不足4直接求逆失败。正确做法是使用Moore-Penrose伪逆$S_W^$# 计算 S_W 的SVD分解 U_w, s_w, Vt_w np.linalg.svd(S_W) # 构造伪逆对非零奇异值取倒数 tol 1e-10 s_w_inv np.where(s_w tol, 1/s_w, 0) S_W_pinv Vt_w.T np.diag(s_w_inv) U_w.T # 构建 S_W^{-1} S_B M S_W_pinv S_B # 求特征向量LDA最多有 c-12 个非零特征向量 eigvals_M, eigvecs_M np.linalg.eig(M) # 按特征值降序排列 idx np.argsort(eigvals_M.real)[::-1] eigvals_M eigvals_M.real[idx] eigvecs_M eigvecs_M[:, idx] # 取前2个特征向量作为投影矩阵 W_lda (4,2) W_lda eigvecs_M[:, :2] print(LDA前两个特征值, eigvals_M[:2]) # 应为正实数如 [32.5, 0.5]为什么最多2个有效方向LDA的理论上限是 $c-1$类别数减一。因为 $S_B$ 的秩至多为 $c-1$由 $c$ 个均值向量张成的空间维度决定故 $S_W^{-1}S_B$ 最多有 $c-1$ 个非零特征值。对鸢尾花3类LDA只能给出2个判别方向——这解释了为何PCA可选任意 $k4$而LDA降维上限被标签数硬性锁定。3.4 LDA投影与PCA投影的本质对比同一数据两种几何将PCA和LDA的投影结果叠加可视化能直观看到范式差异# PCA投影标准化后 pca ManualPCA(n_components2).fit(X) Z_pca pca.transform(X) # LDA投影无需标准化LDA自身处理量纲 Z_lda X W_lda # 注意LDA投影是 X * W非标准化后X import matplotlib.pyplot as plt fig, axes plt.subplots(1, 2, figsize(12, 5)) # PCA结果 for i, name in enumerate([Setosa, Versicolour, Virginica]): axes[0].scatter(Z_pca[yi, 0], Z_pca[yi, 1], labelname, alpha0.7) axes[0].set_title(PCA降维 (2D)) axes[0].legend() # LDA结果 for i, name in enumerate([Setosa, Versicolour, Virginica]): axes[1].scatter(Z_lda[yi, 0], Z_lda[yi, 1], labelname, alpha0.7) axes[1].set_title(LDA降维 (2D)) axes[1].legend() plt.show()现象解读PCA图中Setosa蓝色被完美分离但Versicolour橙色与Virginica绿色大面积重叠——因PCA只关注整体方差而这两类在花瓣尺寸上本就相似LDA图中三类沿第一判别轴横轴近乎线性分离第二判别轴纵轴进一步拉开Setosa与另两类的距离——因LDA明确以“最大化类间/类内比”为目标强制在重叠区挖掘判别缝隙。这就是“监督”与“无监督”的几何显形PCA在数据云中找最胖的方向LDA在标签峡谷中找最深的裂痕。3.5 避坑LDA实现中的四大死亡陷阱现象1S_W奇异导致np.linalg.inv(S_W)报LinAlgError: Singular matrix原因类内散度矩阵 $S_W$ 秩亏如某类样本共线或样本数维度数。鸢尾花每类50样本4维理论上满秩但浮点误差可能导致近奇异。解决绝不硬求逆改用SVD伪逆如上代码或添加微小正则项S_W_reg S_W 1e-8 * np.eye(4)。现象2np.linalg.eig(M)返回复数特征值且实部很小、虚部震荡原因M S_W^{-1}S_B非对称即使 $S_W$、$S_B$ 对称其乘积也不一定对称eig对非对称矩阵返回复数。解决使用np.linalg.eigh要求矩阵对称故应计算M_sym (M M.T)/2再分解或直接求解广义特征值问题scipy.linalg.eig(S_B, S_W)。现象3LDA投影后Setosa类在第一判别轴上反而与另两类中心重合原因未中心化数据。LDA公式中 $S_B$ 依赖于各类均值与全局均值的差若数据未减去全局均值$S_B$ 计算错误。解决确保X输入LDA前已减去np.mean(X, axis0)或在计算 $S_B$ 时显式使用mu_i - mu_global。现象4W_lda归一化后各列向量模长不为1且投影坐标尺度混乱原因LDA特征向量本身无尺度约束eig返回的向量是任意缩放的。若直接用未归一化的W_lda投影坐标值会极大。解决对每个特征向量W_lda[:, i]执行W_lda[:, i] / np.linalg.norm(W_lda[:, i])保证投影后坐标具有可比性。4. 高斯混合模型与马氏距离判别为什么用马氏距离比欧氏距离更能暴露GMM的拟合缺陷4.1 GMM的MLE求解EM算法如何在“已知成分”与“未知归属”间迭代破局高斯混合模型假设数据由 $K$ 个高斯成分生成$$ p(\mathbf{x}) \sum_{k1}^{K} \pi_k \mathcal{N}(\mathbf{x} \mid \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) $$其中 $\pi_k$ 为第 $k$ 个成分的混合系数$\sum \pi_k 1$$\boldsymbol{\mu}_k$、$\boldsymbol{\Sigma}_k$ 为其均值与协方差。MLE无法解析求解故采用EM算法E步Expectation基于当前参数 $\theta^{(t)}$计算每个样本 $\mathbf{x}i$ 属于第 $k$ 个成分的后验概率责任$$ \gamma{ik}^{(t)} \frac{\pi_k^{(t)} \mathcal{N}(\mathbf{x}_i \mid \boldsymbol{\mu}_k^{(t)}, \boldsymbol{\Sigma}k^{(t)})}{\sum{j1}^{K} \pi_j^{(t)} \mathcal{N}(\mathbf{x}_i \mid \boldsymbol{\mu}_j^{(t)}, \boldsymbol{\Sigma}_j^{(t)})} $$M步Maximization用责任加权更新参数$$ \pi_k^{(t1)} \frac{1}{n} \sum_{i1}^{n} \gamma_{ik}^{(t)}, \quad \boldsymbol{\mu}k^{(t1)} \frac{\sum{i} \gamma_{ik}^{(t)} \mathbf{x}i}{\sum{i} \gamma_{ik}^{(t)}}, \quad \boldsymbol{\Sigma}k^{(t1)} \frac{\sum{i} \gamma_{ik}^{(t)} (\mathbf{x}_i - \boldsymbol{\mu}_k^{(t1)})(\mathbf{x}i - \boldsymbol{\mu}k^{(t1)})^T}{\sum{i} \gamma{ik}^{(t)}} $$关键洞察EM算法本质是在隐变量成分归属与模型参数之间交替优化。E步固定参数猜归属M步固定归属更新参数——这种“猜-改-再猜”的循环最终收敛到局部最优。4.2 马氏距离判别为何GMM分类必须用马氏距离而非欧氏距离GMM拟合后对新样本 $\mathbf{x}$ 的分类不是简单选最大后验概率 $\arg\max_k \gamma_{ik}$而是计算其到各高斯成分中心的马氏距离$$ d_k^2(\mathbf{x}) (\mathbf{x} - \boldsymbol{\mu}_k)^T \boldsymbol{\Sigma}_k^{-1} (\mathbf{x} - \boldsymbol{\mu}_k) $$然后判别为使 $d_k^2$ 最小的类别 $k$。为什么必须是马氏距离欧氏距离 $||\mathbf{x} - \boldsymbol{\mu}_k||^2$ 假设各维度方差相同、且相互独立即 $\boldsymbol{\Sigma}_k \sigma^2 \mathbf{I}$但GMM的 $\boldsymbol{\Sigma}_k$ 是全协方差矩阵它编码了(a) 各维度不同方差如花瓣长度变化大花萼宽度变化小(b) 各维度相关性如花瓣长度与宽度常同向变化马氏距离通过 $\boldsymbol{\Sigma}_k^{-1}$ 对数据进行白化whitening将椭球状的高斯分布拉伸为球形此时欧氏距离才等价于原始空间中的概率密度距离。不使用马氏距离 忽略GMM学到的全部协方差结构退化为K-means球形簇假设。4.3 手写GMM马氏距离判别器从EM迭代到最终分类from scipy.stats import multivariate_normal class ManualGMM: def __init__(self, n_components3, max_iter100, tol1e-3): self.n_components n_components self.max_iter max_iter self.tol tol def _e_step(self, X, pi, mu, cov): n, d X.shape gamma np.zeros((n, self.n_components)) for k in range(self.n_components): # 计算第k个成分的似然 try: pdf_k multivariate_normal.pdf(X, meanmu[k], covcov[k]) except: # 协方差奇异时用伪逆 cov_k_inv np.linalg.pinv(cov[k]) diff X - mu[k] maha_sq np.sum((diff cov_k_inv) * diff, axis1) pdf_k np.exp(-0.5 * maha_sq) / np.sqrt((2*np.pi)**d * np.linalg.det(cov[k] 1e-6*np.eye(d))) gamma[:, k] pi[k] * pdf_k # 归一化得到后验概率 gamma / gamma.sum(axis1, keepdimsTrue) return gamma def _m_step(self, X, gamma): n, d X.shape pi np.sum(gamma, axis0) / n mu np.zeros((self.n_components, d)) cov np.zeros((self.n_components, d, d)) for k in range(self.n_components): mu[k] np.sum(gamma[:, k:k1] * X, axis0) / np.sum(gamma[:, k]) diff X - mu[k] cov[k] (diff.T (gamma[:, k:k1] * diff)) / np.sum(gamma[:, k]) return pi, mu, cov def fit(self, X): n, d X.shape # 初始化K-means启发式 from sklearn.cluster import KMeans kmeans KMeans(n_clustersself.n_components, n_init1).fit(X) self.mu_ kmeans.cluster_centers_ self.pi_ np.full(self.n_components, 1/self.n_components) self.cov_ np.array([np.cov(X[kmeans.labels_k].T, biasTrue) for k in range(self.n_components)]) # EM迭代 for it in range(self.max_iter): gamma_old self._e_step(X, self.pi_, self.mu_, self.cov_) pi_new, mu_new, cov_new self._m_step(X, gamma_old) # 检查收敛 if np.max(np.abs(self.pi_ - pi_new)) self.tol and \ np.max(np.abs(self.mu_ - mu_new)) self.tol: break self.pi_, self.mu_, self.cov_ pi_new, mu_new, cov_new return self def predict(self, X): n, d X.shape dists np.zeros((n, self.n_components)) for k in range(self.n_components): # 计算马氏距离平方 diff X - self.mu_[k] try: cov_inv np.linalg.inv(self.cov_[k]) except: cov_inv np.linalg.pinv(self.cov_[k]) dists[:, k] np.sum((diff cov_inv) * diff, axis1) return np.argmin(dists, axis1) # 测试在PCA降维后的2D数据上拟合GMM Z_pca_2d Z_pca # (150,2) gmm_pca ManualGMM(n_components3, max_iter50).fit(Z_pca_2d) pred_pca gmm_pca.predict(Z_pca_2d) # 对比真实标签 from sklearn.metrics import adjusted_rand_score print(PCAGMM ARI:, adjusted_rand_score(y, pred_pca)) # 输出示例0.72中等聚类质量代码关键点说明_e_step中当协方差矩阵奇异时用伪逆计算马氏距离并代入高斯PDF公式避免崩溃_m_step中协方差更新使用加权样本协方差权重为责任 $\gamma_{ik}$predict方法严格使用马氏距离diff cov_inv * diff实现 $(\mathbf{x}-\boldsymbol{\mu})^T \boldsymbol{\Sigma}^{-1} (\mathbf{x}-\boldsymbol{\mu})$ 的向量化计算。4.4 避坑GMM与马氏距离的五重炼狱现象1EM算法迭代50次后pi中某个成分系数趋近于0cov矩阵出现nan原因某高斯成分坍缩到单一样本点导致协方差矩阵秩0全零求逆失败。这是GMM经典“组件坍缩component collapse”问题。解决在M步后添加协方差正则化cov[k] 1e-6 * np.eye(d)或使用贝叶斯GMMsklearn.mixture.BayesianGaussianMixture。现象2multivariate_normal.pdf报numpy.linalg.LinAlgError: singular matrix原因cov[k]奇异常见于小样本或高维数据。鸢尾花2D降维后问题减轻但原始4D仍可能发生。解决不依赖scipy.stats手动实现PDF计算内部用np.linalg.pinv替代inv。现象3马氏距离计算中diff cov_inv * diff结果为负数原因cov_inv因数值误差非正定导致二次型为负。马氏距离平方必须≥0。解决计算后强制截断dists[:, k] np.clip(dists[:, k], 0, None)。现象4GMM在LDA降维数据上聚类效果ARI反而低于PCA降维原因LDA降维后三类在2D空间中线性可分但GMM假设每类是单高斯分布而Versicolour与Virginica在LDA空间中仍是重叠椭球单高斯无法拟合其复杂边界。解决增加GMM成分数如设n_components6或改用其他判别器如LDA自身分类器。现象5predict结果全为同一类别如全预测为0原因初始化不当K-means未生效导致所有mu[k]初始值过于接近EM收敛到同一局部最优。解决增加n_init参数多次随机初始化取最优或手动指定初始中心如用各类真实均值。5. 刀切法Leave-One-Out为什么它是评估降维GMM流水线泛化能力的终极压力测试5.1 刀切法的残酷逻辑150次训练150次验证0次“偷看”刀切法Jackknife又称留一法Leave-One-Out, LOO其步骤直白到残酷从150个样本中剔除1个用剩余149个训练GMM模型用此模型预测被剔除的那1个样本的类别重复149次覆盖所有样本统计判错总数计算错误率 错误数 / 150。**为什么它比K折交叉验证本文还有配套的精品资源点击获取