尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

多元统计模拟试题解析:主成分、因子、聚类与判别的可复现代码

多元统计模拟试题解析:主成分、因子、聚类与判别的可复现代码 简介2024年多元统计分析模拟试题以单个PDF文件提供整体压缩包约195KB面向统计专业学生、研究人员及相关从业者可配合课程复习、考试冲刺或数据分析项目中的理论对照使用。试卷共六个题目围绕主成分分析、聚类分析、条件分布、因子模型等核心内容展开题型覆盖填空题、条件分布计算与综合推导既考查T²分布、最大似然估计、模糊等价矩阵等基础概念也要求通过最短距离法聚类、正交因子模型求解和主成分贡献率计算来完成完整解题过程。目前已有140人学习难度适中能帮助读者系统串联多元统计分析主要方法提升理论推导和实际应用能力若有疑问也可按作者承诺及时联系博主获得解答。1. 模拟试题解析的价值在于把每一步运算跑通多元统计分析在2024模拟试题里的考察很少是证明一个公式更多是给定一组多维数据让你完成降维、聚类或判别并解释结果。许多备考者拿到解析时只把答案数字对上就觉得懂了真到自己换一组数据连参数从哪来都不知道。标题里“可实现的”三个字恰恰是关键解析能看明白不算数能复现、能换数据重跑才算真正掌握。如果把试卷里的样本换成运营指标把类别标签换成用户分层试卷和真实分析之间差的就只是一个能跑通的代码过程。下面五章把主成分分析、因子分析、层次聚类、判别分析、多元回归这五类高频题型逐项拆开从选型判断一直写到结果验证。2. 多元统计模拟试题的5类高频考点与模型选型边界模拟题的第一问往往不是计算而是判断这组数据该用哪种方法。判断错了后面所有数字都会失去意义。看过很多试卷解析写了一大篇幅却说不清为什么选主成分而不选因子分析。实际上选型并不难抓住“分析目的”和“数据结构”两条线索就能定。2.1 按分析目的确定方法降维、分类还是解释关系拿到一张数据表先问三个问题。目的是减少变量数量同时尽量保留原有信息选主成分分析目的是找出背后不可观测的公共因子并做业务解释选因子分析目的是按样本相似程度分组选层次聚类或K-means已知道样本类别、要给新样本归类选判别分析要解释多个自变量对一个连续因变量的数量影响选多元线性回归。2024模拟试题最常出现的对比题是把主成分分析和因子分析放在同一道题里让考生区分。出题人想看的不是两个概念的定义背诵而是考生能不能说出本质差别主成分是原始变量的线性组合追求方差最大因子分析是构造潜在变量解释原始变量之间的相关结构。这个差别会在后面的代码实现里直接演变成截然不同的参数和输出格式。2.2 主成分分析与因子分析的适用边界主成分分析的数学目标很清晰设X是n行p列的标准化数据矩阵第一主成分对应的投影方向w₁需要使得Var(Xw₁)最大。它不区分共性方差和特殊方差所有变量的方差全部参与分解。判断该不该用主成分只看累计方差贡献率是否达到足够高的水平一般以0.8为参考线。因子分析不一样。它把每个变量的方差拆成公共因子方差和特殊因子方差两部分模型写为x Λf ε。这里的Λ是载荷矩阵f是公共因子向量ε是特殊因子。因子分析的结果需要靠旋转来让载荷结构更清晰旋转后的载荷不再是唯一解必须结合业务给公共因子命名。出题时如果给碎石图和特征值基本在主成分方向如果给旋转后的载荷矩阵并要求命名因子方向必然是因子分析。2.3 聚类题目的样本量门槛与算法选择模拟题的聚类部分通常给10到20个样本、两到三个变量。这个样本量并不适合一上来就套K-means因为K-means需要提前指定类别数初始质心又带随机性小样本下每跑一次聚类标签可能都不一样。层次聚类更适合这种数据规模它通过不断合并距离最近的簇生成树状图类别数可以在合并过程结束后再观察决定。聚类结果的另一个常见坑是量纲。假设变量x3的取值在80附近、x2在30附近直接算欧氏距离会由x3主导。答题时应该主动写一句“对原始变量标准化后再计算距离”这是阅卷时很看重的采分点。距离度量上欧氏距离在标准化后可用马氏距离理论上能消除变量相关性的影响但样本量n小于变量数p时协方差矩阵不可逆模拟题少给数据时根本用不了马氏距离。能写出这条适用边界的答案基本就站住了。2.4 判别分析与多元回归的答题关键Fisher判别是模拟题里最常考的判别方法。它的核心是求一个投影方向使组间离差平方和与组内离差平方和的比值最大。手推解答流程是先计算各类均值向量再求类内散度矩阵Sw最后得到判别方向w Sw⁻¹(μ₁ - μ₂)。多元回归的答题重点则落在回归系数显著性检验和多重共线性判断上方差膨胀因子VIF超过10需要剔除变量或改岭回归。五类题型的判断速查如下表做模拟题中途卡住时可以直接对照题目特征首选算法关键输出给相关矩阵要求提取综合指标主成分分析载荷矩阵、累计方差贡献率给载荷矩阵要求给因子命名因子分析旋转后载荷、因子得分给样本数据要求分成若干类层次聚类树状图、聚类标签给已知标签训练集和新样本判别分析判别函数、混淆矩阵多个自变量预测连续因变量多元回归回归系数、p值、VIF3. 从相关系数矩阵到主成分载荷试卷题型的可复现实现模拟题给的数据往往不是能直接分析的数据。四个变量的量纲可能差十几倍不标准化就做主成分第一主成分会被方差最大的那个变量单方面牵着走。所以第一步永远是标准化再看相关系数矩阵最后进入特征值分解。3.1 构造样例数据并完成标准化没有现成数据文件时可以用固定随机种子生成一份模拟题风格的样例数据10行4列代表10个样本的4个指标。下面的代码不需要外部数据文件在干净环境里可以直接运行。import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler np.random.seed(42) data pd.DataFrame({ x1: np.random.normal(50, 10, 10), x2: np.random.normal(30, 5, 10), x3: np.random.normal(80, 15, 10), x4: np.random.normal(20, 4, 10), }).round(2) scaler StandardScaler() X_scaled scaler.fit_transform(data) print(pd.DataFrame(X_scaled, columnsdata.columns).round(3))np.random.seed(42)固定随机数种子保证同一份代码每次生成的数据一致。StandardScaler先计算每列的均值和标准差再对每个元素做z-score变换变换后每列均值靠近0、标准差为1。如果试卷给的是Excel文件把第一行改成pd.read_excel(exam_data.xlsx, index_col0)即可后续流程完全不变。这里要提醒一个常见失误fit_transform返回的是NumPy数组而不是DataFrame很多人在标准化之后直接调用data[x1]立刻报KeyError。正确做法是先转成DataFrame再继续操作上面的代码第11行就是这么做的。3.2 相关系数矩阵与KMO检验标准化之后求相关系数矩阵pandas一行完成corr pd.DataFrame(X_scaled, columnsdata.columns).corr() print(corr.round(3))相关系数矩阵的对角线全为1非对角线绝对值越大说明变量间的线性关系越强越适合降维。如果矩阵几乎等于单位阵变量彼此独立主成分分析能提取的信息就很有限。此时用KMO检验做量化判断比肉眼可靠。sklearn没有直接提供KMO接口需要安装factor_analyzerpip install factor_analyzer安装完成后执行from factor_analyzer.factor_analyzer import calculate_kmo kmo_all, kmo_model calculate_kmo(data) print(fKMO {kmo_model:.3f})calculate_kmo接收的是原始数据表data不是相关系数矩阵corr更不是标准化后的NumPy数组。这个位置写错的人很多因为KMO的公式依赖偏相关矩阵函数内部会重新计算相关和偏相关传入已经标准化或已经算好的矩阵会导致双重处理。KMO低于0.5不建议继续做主成分分析高于0.7结果较可靠模拟题给的优质数据一般落在0.6到0.9之间。3.3 主成分分析的完整实现与载荷解读确认适合降维后进入主成分分析。我的习惯是用n_componentsNone先拿到全部主成分再根据方差贡献率决定保留个数而不是一上来就写死n_components2。from sklearn.decomposition import PCA pca PCA(n_componentsNone) pca.fit(X_scaled) explained pca.explained_variance_ratio_ cumsum np.cumsum(explained) for i, (comp, ev, cum) in enumerate(zip(pca.components_, explained, cumsum), 1): print(fPC{i}: 方差贡献率{ev:.4f}, 累计贡献率{cum:.4f}) print(f 载荷向量{comp.round(4)})PCA()不传n_components时默认保留全部主成分一次可以看全所有特征根的贡献率。pca.components_是载荷矩阵每一行对应一个主成分行内每个元素表示该主成分与对应原始变量之间的系数。假设某次运行输出PC1载荷[0.52, -0.48, 0.51, 0.48]那么第一主成分的表达式就是0.52倍标准化x1减0.48倍标准化x2加0.51倍标准化x3加0.48倍标准化x4。试卷要求“写出第一主成分表达式”时必须从载荷向量还原出带变量名的式子并且注明变量是标准化后的取值。只写一串数字不写变量名在阅卷时会被扣步骤分。另外还要留个心眼sklearn输出的特征向量方向不唯一载荷全部取反的情况很常见这个问题放到最后一章专门讲验证方法。4. 聚类、判别与多元回归的落地代码与参数调整模拟题把数据量和输出要求都做了简化但代码里的参数选择不能简化。聚类要解释类别数的确定依据判别要评估错判代价回归要处理共线性问题。每类题型在本章按“可运行最小代码”加“参数说明”的方式展开。4.1 层次聚类树状图输出与类别数确定小样本聚类我首选scipy的层次聚类接口原因是它可以直接输出树状图而树状图是模拟题要求填写的标准输出之一。from scipy.cluster.hierarchy import dendrogram, linkage, fcluster import matplotlib.pyplot as plt Z linkage(X_scaled, methodward, metriceuclidean) plt.figure(figsize(8, 4)) dendrogram(Z, labels[fs{i1} for i in range(X_scaled.shape[0])]) plt.title(Hierarchical Clustering Dendrogram) plt.xlabel(sample) plt.ylabel(distance) plt.show() labels fcluster(Z, t3, criterionmaxclust) print(labels)linkage的method参数决定簇间距离的计算准则。ward方法以合并后类内方差增量最小为目标对连续型数值变量效果稳定single方法容易产生链式效应样本量小时聚类结果往往是一条长链不推荐。fcluster中t3配合criterionmaxclust表示直接分成三类t的具体值应该在看树状图之后确定不是随手拍的。聚类标签回填到原始数据后建议继续算每个类在各变量上的均值向量。这一步的价值在于回答试卷最后一问“对聚类结果做简要分析”指出第几类在哪个变量上显著偏高比单纯报一个标签数组有用得多。4.2 Fisher判别投影方向、准确率与混淆矩阵判别分析在sklearn里用LinearDiscriminantAnalysis实现下面是带数据集划分和效果评估的完整流程。from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix X X_scaled y np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state7, stratifyy ) lda LinearDiscriminantAnalysis(solversvd) lda.fit(X_train, y_train) y_pred lda.predict(X_test) print(判别准确率:, (y_pred y_test).mean()) print(混淆矩阵:\n, confusion_matrix(y_test, y_pred)) print(判别方向系数:, lda.coef_)solversvd是默认值它不显式求类内散度矩阵的逆数值稳定性最好。如果变量数接近样本数甚至超过样本数svd可能会给出过于乐观的分类结果这时改用solverlsqr并设置shrinkageauto可以缓解过拟合。试卷里手推得到的w Sw⁻¹(μ₁ - μ₂)与sklearn的coef_方向一致但数值不完全相同因为sklearn的系数还综合了先验概率和决策边界偏移不能拿手推结果逐位去对。stratifyy保证划分时两类样本比例与原始数据一致。模拟题样本总量只有10个不设置stratify很容易让测试集只剩一个类别准确率数字完全失真。4.3 多元回归方差膨胀因子与显著性检验多元回归我用statsmodels而不是sklearn因为它直接输出每个系数的p值和置信区间这些都是模拟题“判断回归方程是否有效”的采分点。import statsmodels.api as sm from statsmodels.stats.outliers_influence import variance_inflation_factor X_reg pd.DataFrame(X_scaled, columnsdata.columns) X_reg sm.add_constant(X_reg) y_reg np.random.RandomState(1).normal(0, 1, 10) model sm.OLS(y_reg, X_reg).fit() print(model.summary()) vif_data pd.DataFrame({ variable: data.columns, VIF: [ variance_inflation_factor(X_reg.values, i) for i in range(1, X_reg.shape[1]) ] }) print(vif_data)model.summary()输出的F统计量对应整个方程的显著性p值小于0.05说明回归方程整体有效。每个自变量对应的p值则判断该变量的偏回归系数是否显著不为零。VIF计算时从索引1开始因为索引0是截距项截距不需要计算VIF。VIF大于10说明该变量与其他变量存在强多重共线性此时回归系数的标准误被放大系数解释不可靠。add_constant为设计矩阵补一列1用来估计截距。缺了这一步模型会把截距强行设为0导致R²虚高这是回归分析里很常见的误用。4.4 因子分析旋转方法与因子命名模拟题要求因子命名时factor_analyzer把因子个数选择和方差最大旋转都封装好了。from factor_analyzer import FactorAnalyzer fa FactorAnalyzer(n_factors2, rotationvarimax, methodprincipal) fa.fit(data) loading pd.DataFrame(fa.loadings_, indexdata.columns, columns[Factor1, Factor2]) print(loading.round(3)) print(公因子方差:, fa.get_communalities().round(3))n_factors先按特征值大于1的个数来定拿不准时可以跑一次不指定因子数通过特征值列表确定。rotationvarimax做方差最大旋转旋转后每个变量只在少数因子上有高载荷因子含义更清晰。methodprincipal是主成分提取法与多数教材一致若结果解释性不佳可改用methodml最大似然法做稳健性对照。旋转后的载荷矩阵里出现负数是正常现象代表变量与该因子呈负相关。给因子命名时只看每行绝对值最大的载荷落在哪个因子上再结合该因子高载荷变量的业务含义来取名。载荷正负影响的是因子得分的符号方向不影响因子归属判断。5. 模拟题“标准答案”的3个易错点与验证技巧这一章收在怎么判断自己的结果和标准答案谁的更可信上。实际做题时解析里的载荷、贡献率和判别系数经常与本地跑出的结果有出入不一定是算错了。5.1 特征向量符号翻转导致载荷与答案不一致主成分分析的特征向量方向不唯一如果v是特征向量那么-v同样满足特征方程。sklearn底层调用的LAPACK库按自己的规则决定符号同一份数据在不同机器上跑出完全相反的载荷方向是常态。验证方法是用载荷向量和标准化数据做矩阵乘法得到主成分得分再与标准答案里的得分计算皮尔逊相关系数。import numpy as np from scipy.stats import pearsonr score_mine np.dot(X_scaled, pca.components_[0]) # 用标准答案给出的得分替换下面的 score_answer score_answer np.random.normal(0, 1, len(score_mine)) r_value pearsonr(score_mine, score_answer)[0] print(f主成分得分相关系数: {r_value:.3f})相关系数等于1或-1说明两个得分只差一个符号方向把载荷乘以-1再对照即可。相关系数绝对值远小于1才说明真正算错。模拟题里如果载荷明明反号、贡献率却一致多半就是这个原因。5.2 累计贡献率阈值的两种取法与结果冲突保留主成分个数最常见的依据有两个累计方差贡献率不低于0.8以及特征值大于1的Kaiser准则。两者结论有时不同。变量多时Kaiser准则倾向于保留更多成分累计贡献率0.8则更贴近解释性需求。解析里写了保留个数却不写依据是答案不完整如果解析里既写个数又出现两个依据冲突就要核对是不是把特征值序列和贡献率序列抄串了行。顺便说一句碎石图拐点也值得画一下能快速验证解析保留个数是否合理import matplotlib.pyplot as plt plt.plot(range(1, len(pca.explained_variance_) 1), pca.explained_variance_, markero) plt.title(Scree Plot of Eigenvalues) plt.xlabel(component) plt.ylabel(eigenvalue) plt.show()碎石图拐点位置与特征值大于1对应较好时保留个数才站得住。5.3 用相关矩阵重构验证特征值分解是否正确没有标准答案对照时可以用特征值分解的结果反推相关矩阵看能不能还原到原始值。主成分分析得到的载荷和特征值如果正确重构的相关矩阵应该与原始相关矩阵几乎完全相等。cov_original np.cov(X_scaled.T) cov_reconstructed ( pca.components_.T * pca.explained_variance_ ) pca.components_ print(最大重构偏差:, np.max(np.abs(cov_reconstructed - cov_original)))输出偏差在1e-10量级说明分解无误偏差在0.1量级说明载荷或特征值用错了。这个方法不依赖任何外部参考答案适合用来检查自己手推的中间结果是否在合理范围。配合第5.1节的符号验证和5.2节的阈值核对整套解析的可信度就完整了。本文还有配套的精品资源点击获取
返回列表