数学建模C题:PCA与因子分析预测玻璃风化前成分的完整流程
简介2022年全国大学生数学建模竞赛C题完整参赛方案面向数学建模参赛者及数据分析学习者以古代玻璃文物成分分析与鉴别为实战案例。包内为1个PDF文档整体3.55MB系统梳理了数据预处理、数据探索、主成分分析降维、因子分析、亚类划分、灰色关联度分析等核心环节并给出问题一至问题四的求解步骤、模型构建与结果解读。文档覆盖风化系数定义、化学成分统计规律、风化前成分预测、玻璃类型判别及化学成分关联性分析并对模型进行敏感性分析与鲁棒性讨论形成从数据到结论的完整闭环。同时保留了摘要、问题重述、数据探索等章节便于读者对照论文结构理解建模思路对文物的纹饰、颜色、风化状态等属性也做了交叉分析帮助把握数据中的潜在规律。目前已有927人学习下载适合备赛复现、方案参考也可作为考古数据分析与化学计量学的入门范例。1. 这道C题真正的分水岭风化系数你定义对了吗铅钡玻璃的风化系数是 (PbOBaO)/SiO2高钾玻璃的风化系数却是 SiO2/(K2OCaOMgOAl2O3Fe2O3CuOP2O5SrO)——两套公式方向完全相反不少参赛队第一天就栽在这个细节上。这道C题表面在分析古代玻璃内核是一条完整的数据分析流水线数据探索、降维、分类、敏感性验证、关联分析五步走完就能拿分。文档把四个问题的建模过程完整拆解适合赛前练手、赛后复盘也适合想快速掌握PCA因子分析灰色关联度这套组合的备赛者。它不是让你抄答案是告诉你每一步该输出什么、评委想看到什么。2. 考点分布四问的建模链条与得分权重2.1 四个小问在考同一件事从数据到结论的完整闭环这道题最容易看走眼的地方是把它当成四个孤立的统计题去准备。实际上四个问题是一条建模链问题一解决“风化规律与原始成分预测”问题二解决“分类规律与亚类划分”问题三把问题二的区间直接拿来鉴别未知样品问题四又回到问题二选出的主成分上做关联分析。前一个问题的输出就是后一个问题的输入。能把这个递进关系在论文开头写清楚属于高分写法。大多数获奖论文的共同点是先兜底再往上垒先用肉眼统计把规律找全再用PCA降维然后在降维后的成分上做区间、聚类、关联分析。如果一上来就堆深度学习的黑匣子模型反而会丢掉这道题最看重的可解释性分。2.2 各问难点与得分点对照表小问问题类型核心方法难点等级主要得分点问题一风化规律分析 未风化成分预测数据探索、卡方检验、PCA、因子分析高风化系数的定义、转换矩阵反推预测值问题二分类规律 亚类划分PCA降维、区间划分、最短距离法聚类中分类区间的构造过程、敏感性分析问题三未知样品鉴别套用问题二的区间 3%扰动验证低鉴别结果表、敏感性结论问题四化学成分关联关系灰色关联度分析中关联度排序、类别间差异性对比问题一最难因为它没有标准答案风化系数怎么定义、因子分析矩阵怎么求逆、预测值怎么解释都是开放式的评委看重的是你的定义逻辑而不是数字本身。问题二属于中等难度最短距离法是死的但区间合理性论证是活的。问题三基本是查表加验证问题四的关键不是跑通公式而是能不能读出“四个类别中二氧化硅关联度均最强”这个差异性结论。2.3 备赛需要掌握的模型清单主成分分析标准化、相关系数矩阵、特征值特征向量、累计贡献率85%以上取主成分。本题里四类样品分别做PCA保留贡献率最高的几个化学成分作为后续分类依据。因子分析模型形式是XμAFεA是载荷矩阵F是公共因子。本题用A的逆把风化后的观测成分反推回未风化成分本质是因子得分的应用。最短距离法定义类间距离为两类间最近样品的距离递归合并直到聚成目标类数。本题用来对二氧化硅数据求两个聚点再切分成两个亚类的区间。灰色关联度分析参考数列与比较数列做无量纲化算关联系数再取平均得到关联度最后排序。本题用来比较四类玻璃化学成分之间的关联强弱。卡方检验检验类型、纹饰、颜色、风化与否之间的相关性用显著性p值说话。本题表4给出类型与纹饰、颜色的p值都小于0.01表面风化与类型在10%水平上显著。2.4 数据探索是整道题的得分基本盘数据探索不需要模型但它是问题一拿分的地基。表单1里能肉眼看出的规律有三条纹饰B全部是高钾玻璃、全部风化、颜色全部是蓝绿色纹饰A的高钾玻璃全部无风化且全是蓝绿色铅钡玻璃风化与无风化比例11比5纹饰C的高钾玻璃全部无风化铅钡玻璃风化与无风化比例17比73。从这三点可以直接推出两个结论同等条件下铅钡玻璃比高钾玻璃更容易风化纹饰B代表的环境风化效应更强因为连相对耐风化的高钾玻璃都全部风化。这两条结论写进论文就是基础分。再往后才是对表单2的预处理补全P列成分合计、从A列抽取编号、通过编号关联表单1的类型、是否风化、颜色、纹饰信息。这一套操作在论文里体现为“数据处理流程”是评委判定你工作量的直接依据。3. 高频考点一PCA因子分析预测风化前成分的答题全流程3.1 数据探索三个结论怎么表达才能拿分问题一要求“研究风化与类型、纹饰、颜色的关系”最稳的答法是统计表加卡方检验。先对表单1做量化把纹饰、颜色、类型、表面风化转换成数值然后导入SPSS做相关性分析得到相关系数和显著性p值纹饰与颜色相关系数-0.492p值小于0.01类型与颜色相关系数0.554p值小于0.01表面风化与类型相关系数0.272p值0.051在10%水平显著。接着做卡方检验表4的结果直接引用类型与纹饰的卡方值16.394p值小于0.001颜色与类型的卡方值26.017p值小于0.001风化与类型的卡方值23.861卡方校正值12.758p值0.049。写论文时把这些p值和显著性星号标清楚统计证据就有了。再用效应量化表补一个Crammers V值纹饰0.561、颜色0.707、表面风化0.272说明纹饰和颜色与类型的关联强度中等偏强。很多参赛队在这一步只堆数据不写结论这是浪费。数据探索的价值在于“肉眼看到规律统计验证规律”两者都要落到纸面上。哪怕只用一张表把风化的铅钡样品二氧化硅从82%降到36%、氧化铅从极低升到47.43%这个对比列出来比写一大段文字更有说服力。3.2 风化系数两套公式的适用条件与阈值判定风化系数是这道题第一个真正的分水岭因为铅钡和高钾两类玻璃在风化中的成分变化方向正好相反。铅钡玻璃风化后二氧化硅显著降低氧化铅、氧化钡显著升高所以用(PbOBaO)/SiO2分子是被风化富集的成分分母是被消耗的主要成分系数越大风化越重。高钾玻璃恰好反过来风化后二氧化硅占比显著提升氧化钾等组分显著降低所以用SiO2/(K2OCaOMgOAl2O3Fe2O3CuOP2O5SrO)系数越大同样代表风化越重但方向是二氧化硅的相对富集。阈值怎么定从排序突变处找铅钡玻璃的风化系数在0.879和1.399之间出现明显跳跃判定阈值取1.0高钾玻璃的风化系数在7.23和12.41之间跳跃判定阈值取10.0。要注意的是原始标签里样本20、48、30部位1的“是否风化”标注和风化系数判定不一致文档的处理是以风化系数为准手工修正。这种处理细节写进论文能体现你的严谨性属于增量得分点。答题时还要补一句风化系数的物理意义它是一个相对量化指标反映的是风化过程中成分迁移的方向和程度而不是风化绝对年龄。这样定义之后后面所有区间划分都建立在这个指标的可解释性之上。3.3 主成分分析五步流程与代码实现主成分分析在本题里承担两个任务降维减少运算量以及避免干扰成分对分类和预测的影响。标准流程是五步对原始m个指标做标准化得到标准化变量根据标准化数据矩阵求相关系数矩阵R计算R的特征值λ1≥λ2≥…≥λm和对应的标准正交化特征向量计算主成分贡献率取累计贡献率达85%以上的前k个主成分用选出的主成分去分析问题。import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # 只取成分列参与降维第一列是编号不参与计算 X data.iloc[:, 1:14].values scaler StandardScaler() X_scaled scaler.fit_transform(X) # 每个特征去均值除以标准差 pca PCA(n_components0.90) # 自动保留累计贡献率≥90%的主成分 X_pca pca.fit_transform(X_scaled) print(各主成分贡献率: , pca.explained_variance_ratio_) print(累计贡献率: , np.cumsum(pca.explained_variance_ratio_))n_components0.90表示自动选择能让累计贡献率达到90%的主成分个数explained_variance_ratio_输出每个主成分的方差解释比例累计后就是贡献率。如果跑完发现累计贡献率不足85%先检查标准化有没有做再考虑是不是把四类样品混在一起降维了——本题必须分四类分别处理。这步的实际结果要背下来铅钡无风化类型里二氧化硅、氧化钠、氧化钾、氧化钙、氧化镁、氧化铝六个成分累计贡献率88.89%高钾无风化类型五个成分累计贡献率88.89%铅钡风化类型五个成分累计贡献率87.36%高钾风化类型三个成分累计贡献率95.41%。这四个数字是问题二的直接素材写论文时必须出现。3.4 因子分析从风化成分反推未风化成分的原理因子分析模型是XμAFε把玻璃某个时刻的化学成分特征分解为期望向量μ、公共因子F和特殊因子ε的线性组合。这里的F被赋予具体的物理含义未风化时的公共因子成分。载荷矩阵A通过相关系数矩阵的特征分解得到A(sqrt(λ1)u1, sqrt(λ2)u2, ..., sqrt(λm)um)。关键在于处理式(6)把原变量表示为公共因子的线性组合后对A求逆就能从风化后的特征反推未风化时的公共因子特征。实际操作中对“铅钡-C纹”保留8个主成分可以保留97%以上的成分构成信息然后从转换系数矩阵得到每个样品的未风化成分预测值。答题时不需要推导全部矩阵运算重点讲清楚两件事因子分析在这个场景下的物理意义是“把风化成分看成未风化成分经过线性变换的结果”反推后的预测值要列成表格输出。文档给出的预测结果表里每一个文物采样点都对应一组完整的未风化成分预测值这就是问题一要求输出的核心成果。3.5 真题演练问题一的论文结构问题一的标准答题结构可以按六个段落组织。第一段写背景玻璃以二氧化硅为主并含多种其他成分风化导致成分与环境产生交换第二段写数据探索三条规律和两条结论第三段写相关性分析给出相关系数、p值、卡方检验结果第四段写风化系数定义两套公式、物理意义、阈值判定、样本修正第五段写PCA降维加因子分析反推说明保留主成分个数、转换矩阵来源第六段给出预测结果表并说明模型假设前提。特别要说的是问题假设同一纹饰对应相近的生成时间与地域同一种类的风化化学反应相同风化是连续过程但只有超过阈值才称为风化严重风化前成分变化基本线性。这四条假设支撑了因子分析线性模型的合理性也解释了为什么能用线性变换反推原始成分。缺少这些假设因子分析的适用性就会被评委质疑。4. 高频考点二亚类划分、敏感性分析与灰色关联度的实战套路4.1 主成分区间法四类样品各自的分类区间怎么生成问题二的分类逻辑是“先主成分后区间”。对高钾风化、高钾未风化、铅钡风化、铅钡未风化四类样品分别做PCA选出其中贡献率较高的化学成分然后针对每个成分去掉最大值和最小值用剩余数据的最大值和最小值构成一个区间数值落在这个区间内或靠近区间就判定属于该类。def build_interval(vals): # 去掉最大值和最小值后用剩余数据形成分类区间 sorted_vals np.sort(vals)[1:-1] return (sorted_vals.min(), sorted_vals.max()) # 对四类样品的每个关键成分分别调用输出区间 for cls in groups: print(cls, build_interval(groups[cls][SiO2].values))这段代码的关键是np.sort之后用[1:-1]切掉极值再取min和max。为什么要去掉极值因为区间端点如果直接取原始数据的最大最小值异常值会把区间撑得太宽把不属于该类的样品框进来。这个操作是文档里明确写过的也是最容易被忽略的细节。四个类别的分类区间要背下来铅钡无风化SiO2区间[50.61,69.71]高钾无风化SiO2区间[59.81,69.33]铅钡风化SiO2区间[4.61,37.36]高钾风化SiO2区间[92.35,95.02]。只看二氧化硅这一项四类区间几乎没有交叠这就是用区间法分类的可行性基础。4.2 最短距离法聚类亚类划分的具体操作亚类划分选择二氧化硅作为划分变量因为它在四类样品中的数据差异最大。最短距离法定义类与类之间的距离为两类中最近的两个样品之间的距离每次把距离最近的两类合并递归进行直到聚成目标数量的类。文档中的操作是聚成2类得到每个类别的两个聚点然后以聚点连线的中点切开形成两个亚类区间。结果要背清楚铅钡无风化两个聚点64.82和52.49划分区间为[50.61,58.70)和[58.70,69.71]高钾无风化聚点71.22和62.77区间[59.81,67.00)和[67.00,76.68]铅钡风化聚点33.96和15.63区间[4.61,24.80)和[24.80,37.36]高钾风化聚点94.66和92.57区间[92.35,93.62)和[93.62,95.02]。合理性的验证方式是画饼状图观察四类样品中第一类和第二类的样本占比。文档的结论是两类分布比例不存在偏差过大或过小的情况所以分类结果合理。这一步要写成从聚点生成区间、按区间分配样本、用分布图验证比例。4.3 敏感性分析两道题结论反着的细节敏感性分析是这道题最容易踩坑的地方因为问题二和问题三的结论正好相反不少人写论文时直接抄成同一种表述。问题二把已有数据随机变化3%后重新划分区间有三类数据的误差超过20%所以结论是“分类结果的敏感性较强”。问题三把表单3的数据随机变化3%后再套用问题二的区间鉴别结果与原结果完全一致所以结论是“敏感性不强”。同一个3%扰动为什么结论不同问题二是在小样本上重新估计聚点和区间边界样本数量少任何一个样品的扰动都可能移动聚点的位置导致接近边界线的样品改判问题三是把问题二求出的固定区间当作标准去判定新样本3%的随机扰动不足以让数值越过区间边界。答题模板先说明扰动方式给已有数据添加3%随机扰动再展示扰动前后分类结果的对比表最后用具体误差百分比或变化样本数下结论。只写“模型鲁棒性强”而不写数字等于没做。4.4 灰色关联度五步流程与结果排序灰色关联度的五步流程是确定参考数列和比较数列对变量做无量纲化处理初值化或均值化都可以计算关联系数分辨系数ρ通常取0.5对每个比较数列的关联系数求平均得到关联度按关联度大小排序。def grey_relation(ref, comp, rho0.5): # ref: 参考数列一维数组 # comp: 比较数列每行是一个比较序列的二维数组 ref ref / ref[0] # 初值化处理 comp comp / comp[:, 0][:, None] # 初值化处理 diff np.abs(ref[None, :] - comp) min_diff diff.min() max_diff diff.max() # 关联系数分子是两级最小差rho倍两级最大差 xi (min_diff rho * max_diff) / (diff rho * max_diff) return np.mean(xi, axis1) # 关联度关联系数取平均 r grey_relation(ref_y, X_comp, rho0.5)rho是分辨系数取值在0到1之间越小分辨力越好0.5是文档采用的标准值。初值化是每个值除以序列第一个值均值化是除以序列均值如果各成分的量纲差异大不做无量纲化直接算关联度结果会被量纲大的成分主导这一步必须在论文里交代。四类样品的关联度排序是问题四的答案。铅钡未风化排序二氧化硅大于氧化钙大于氧化钾大于氧化铝大于氧化镁大于氧化钠高钾未风化二氧化硅大于氧化钙大于氧化钾大于氧化镁大于氧化钠高钾风化二氧化硅大于氧化钠大于氧化钾。核心结论是四个类别里二氧化硅的关联度都最强其他成分的关联性差异不大。4.5 真题演练问题二、三、四的解题顺序问题二的标准顺序是分开四类样品做PCA选贡献率高的成分逐个成分去极值后形成区间选出二氧化硅做最短距离法聚类求聚点按聚点中点切分区间形成亚类画饼状图验证合理性最后加3%扰动做敏感性分析。问题三没有新的模型把表单3的化学成分依次套入问题二求出的区间落在哪个区间就属于哪一类做完鉴别后再加3%扰动验证一次。问题四是纯关联分析沿用问题二选出的主成分以样品编号序列为参考数列各化学成分序列为比较数列分四类做灰色关联度输出排序并对比差异性。5. 易错点五个最容易失分的细节与改正方法5.1 风化系数公式不分玻璃类型直接套用错在拿到数据后不分高钾和铅钡统一用一套风化系数公式计算。为什么错因为两类玻璃风化后的成分变化方向正好相反铅钡玻璃风化后二氧化硅降低、氧化铅和氧化钡升高高钾玻璃风化后二氧化硅升高、氧化钾等降低同一套公式对其中一类完全没有判别力。怎么答对先把样品按“铅钡-风化、铅钡-未风化、高钾-风化、高钾-未风化”分组再分别使用对应的风化系数公式在论文里单独写一节“风化系数的定义与分组”把两套公式并列展示并说明适用条件。5.2 全量数据一起做PCA错在把高钾、铅钡、风化、未风化的样品全部混在一起做主成分分析。为什么错不同类别的成分分布差异巨大混合样本会让主成分偏向方差最大的类别得到的主成分方向被少数类别主导对后面的分类完全没有解释力。怎么答对严格按四类分别做PCA。文档给出的结果全部是“铅钡无风化类型”“高钾无风化类型”这样的分类表述每一类单独计算贡献率。写论文时连图标标题都要写清楚类别这就是按类建模的证据。5.3 区间端点直接取原始极值错在构建分类区间时直接用原始数据的最大值和最小值作为端点。为什么错最大值和最小值只是样本里的极端观测不代表类别的代表范围区间过宽会把不属于该类的样品框进来。怎么答对先对每个成分的数据去掉一个最大值和一个最小值再用剩余数据的极值形成区间。这个操作在文档里写得很明确而且从结果来看去掉极值后的区间更紧凑、类别之间更可分。5.4 敏感性分析只有结论没有数字错在论文里只写“模型鲁棒性强”“结果稳定”就收尾。为什么错评委没法判断你做过什么计算这类泛泛而谈在建模竞赛里等于没写。怎么答对写出扰动幅度、误差统计量和结论。比如问题二写“数据随机变化3%后有三类数据的误差超过20%分类结果敏感性较强”问题三写“表单3数据随机变化3%后鉴别结果与原结果一致敏感性不强”。有数字、有对比、有结论才是完整的敏感性分析。5.5 灰色关联度的数列方向设反错在把化学成分当成参考数列、把样品编号当成比较数列。为什么错参考数列反映系统行为特征本题研究的是化学成分之间的关联关系样品编号序列1到15才是参考各化学成分序列是影响因素设反后计算虽然能跑通但得到的关联度排序没有任何实际含义。怎么答对参考数列选样品编号序列比较数列选每个化学成分的观测序列先做无量纲化再算关联系数和关联度最后对关联度排序并解释结果。6. 答题技巧考前一周的模型复盘与应试输出节奏6.1 考前一周的模型复盘清单模型核心公式这道题怎么用PCA累计贡献率85%以上取主成分四类样品分别降维选出高贡献率化学成分因子分析XμAFε载荷矩阵A求逆反推未风化成分最短距离法d_pqmin{d_pi, d_qj}二氧化硫数据求聚点切分亚类区间灰色关联度ξ_i(k)公式 关联度取平均四类化学成分的关联排序与差异性对比卡方检验显著性p值类型、纹饰、颜色、风化的相关性证据复盘时每一类模型至少要在自己电脑上跑一遍完整流程跑完只记三件事输入数据长什么样、输出结果是什么格式、论文里怎么描述合理性。最怕的是考前只背公式考场上第一步标准化就写错。6.2 考场上的输出节奏每问写多少字、放几张表按结论先行原则组织每问的正文。问题一开头三行写“发现铅钡比高钾更易风化、纹饰B环境风化效应更强”然后给统计表和风化系数定义问题二开头写“四类区间无交叠SiO2是最佳亚类划分变量”然后给区间表问题三开头直接写每个未知样品的鉴别结果问题四开头给出关联度排序和差异性结论。图表数量控制在对评阅友好的范围问题一至少2张表相关性表、未风化预测值表问题二至少1张区间表加2张分布图问题三1张鉴别结果表问题四1张关联度排序表。代码不放正文关键结果全部落到表和图上。某导师带团队训练时有个习惯拿到任何一道建模题都强制先走一遍“分层级数据到规律、规律到模型、模型到输出”的流程。后来我自己参加比赛、带队伍都坚持这个顺序每一次都是靠它兜住了没翻车。这道C题也是一样数据探索给结论、PCA给特征、区间给分类、扰动给稳定性、灰色关联度给关联排序一层都不跳。希望帮到你。本文还有配套的精品资源点击获取