尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

数学建模竞赛实战:数据挖掘与机器学习在考古玻璃成分分析中的应用

数学建模竞赛实战:数据挖掘与机器学习在考古玻璃成分分析中的应用 1. 项目背景与核心挑战当数学建模遇见考古学去年带队参加全国大学生数学建模竞赛选的就是这道C题。说实话当时看到“古代玻璃制品成分分析与鉴别”这个标题我们团队三个人都愣了一下。这和我们预想的“交通流量优化”、“疫情预测”这类题目画风完全不同它直接把一个非常具体的、跨学科的考古学问题摆在了面前。题目提供了几十件古代玻璃文物主要来自丝绸之路沿线的化学成分检测数据包括氧化硅、氧化钠、氧化钾、氧化钙等十几种氧化物的含量百分比。我们的核心任务就是利用这些数据去回答一系列环环相扣的问题这些玻璃文物该如何科学分类不同类别之间在化学成分上有何规律文物表面风化对其成分产生了怎样的影响以及给定一批未知类别的文物数据我们能否准确判断它们的类型这不仅仅是一道数学题更是一次严谨的科研训练模拟。它要求我们跳出纯数学的舒适区去理解考古学的实际需求将数据挖掘、统计分析、化学原理和考古逻辑结合起来。最大的挑战在于数据是“脏”的——存在大量缺失值未检测出的成分记为NaN成分百分比之和不严格等于100%这是化学成分检测的常见情况而且“风化”这个因素会显著改变文物表面的化学成分如何剥离风化影响看到文物“原本”的面貌是整个问题的关键。下面我就以我们团队的解题思路为主线结合赛后的反思与拓展完整复盘这道题的破题过程、模型构建与核心技巧。2. 数据预处理从“脏数据”到“可用特征”的炼金术拿到的数据通常是一个Excel表格行是文物样本列是各种化学成分。第一步也是最重要的一步就是数据清洗与预处理这直接决定了后续所有模型的可靠性。2.1 缺失值处理不仅仅是填充那么简单数据中存在大量缺失值尤其是铅钡玻璃中的钾钙含量、高钾玻璃中的铅钡含量等。简单粗暴地删除含有缺失值的样本会损失大量信息尤其是当缺失具有某种规律时例如某类玻璃普遍缺失某元素。我们采用了分层处理策略对于关键判别元素缺失的样本例如一个样本的氧化铅PbO和氧化钡BaO含量都缺失但其他成分显示它可能是铅钡玻璃。我们不会直接填充而是将其标记为“待定类别”在后续分类模型中这类样本可以单独处理或作为测试集的一部分。对于非关键元素的随机缺失我们采用了基于K近邻KNN的缺失值填充。原理是在特征空间中与缺失样本最相似的K个“邻居”样本其对应成分的值具有参考价值。我们为数值型特征各氧化物含量计算欧氏距离找到最近邻用这些邻居该成分的均值或中位数进行填充。相比于简单的整体均值填充KNN填充能更好地保留样本的局部结构和类别信息。注意使用KNN填充前必须先将所有成分数据标准化如Z-score标准化消除不同氧化物量纲和数值范围差异对距离计算的巨大影响。否则含量高的氧化物如SiO2将完全主导距离计算。2.2 成分归一化与“总和不为100%”问题化学成分数据通常是百分比形式但检测误差、未测元素等因素导致各样本成分总和在95%~105%之间波动。直接使用原始百分比进行分析会引入误差。我们采用了定和归一化将每个样本的所有氧化物含量除以该样本的氧化物总和再乘以100%。这样每个样本的成分总和严格为100%更符合化学计量学的逻辑也便于不同样本间的比较。python示例代码定和归一化import pandas as pd假设df是包含氧化物列的DataFrame列名如‘SiO2‘, ‘Na2O‘...先处理缺失值假设已用KNN填充df_filled df.fillna(methodknn) # 此处为示意实际需用KNNImputer计算每个样本的氧化物总和sum_per_sample df_filled.sum(axis1)进行定和归一化df_normalized df_filled.div(sum_per_sample, axis0) * 100 2.3 特征工程创造更有判别力的信息原始特征各氧化物含量是基础但我们可以通过创造新特征来提升模型性能比值特征考古学家常关注某些元素的比值。例如钾钠比K2O/Na2O是区分高钾玻璃和钠钙玻璃的关键指标铅钡比PbO/BaO可以帮助细分铅钡玻璃的亚类。这些比值往往比单一含量更具稳定性和判别力。风化相关特征对于风化样品我们计算了表面成分与内部成分如有的差值或根据文献定义“风化指数”如Na2O表面 - Na2O内部/ Na2O内部来量化风化程度。统计特征对于每个文物类别可以计算该类样本各成分的均值、方差、偏度等作为该类别的“指纹”特征用于后续的相似性判断。3. 玻璃文物的分类模型构建从无监督到有监督题目第一问通常要求根据成分对玻璃文物进行分类。这里实际上包含了两个步骤首先是探索性分析看看数据本身能“自然”聚成几类无监督学习然后是建立分类规则对新样本进行判别有监督学习。3.1 无监督聚类探索数据的内在结构我们使用了主成分分析PCA结合K-Means聚类和层次聚类Hierarchical Clustering的方法。PCA降维与可视化将十几种氧化物成分降维到2-3个主成分就能在二维/三维散点图上直观观察样本的分布。我们发现样本明显分成了两大簇经过与文献对照正好对应铅钡玻璃和高钾玻璃这两大体系。这验证了数据的基本可靠性。确定最佳聚类数使用肘部法则Elbow Method和轮廓系数Silhouette Score来确定K-Means中的K值。肘部法则看误差平方和SSE随K值增加下降的拐点轮廓系数衡量每个样本与自己簇和其他簇的相似度越接近1越好。我们综合判断在两大体系下可能还存在亚类如铅钡玻璃可能根据铅钡比例细分但主要分类就是两类。层次聚类验证通过绘制树状图Dendrogram可以清晰地看到样本是如何被逐层聚合的。树状图在某个高度被切割形成的簇应该与PCA和K-Means的结果相互印证。这种多方法交叉验证能让我们对分类结果更有信心。3.2 有监督分类构建准确的判别模型在明确了“铅钡”和“高钾”两大类后我们需要建立一个模型能够根据化学成分自动判别新文物的类别。我们尝试并对比了多种分类器逻辑回归Logistic Regression作为基线模型。它的优势是结果可解释性强我们可以得到每个氧化物成分的系数从而知道哪些成分对判别“铅钡”或“高钾”贡献大。例如PbO和BaO的系数很可能为正且很大意味着它们含量高则倾向于铅钡玻璃。支持向量机SVM特别是线性SVM在特征可能线性可分时效果很好。我们使用了标准化后的数据并尝试了不同的核函数线性、RBF。SVM对于解决小样本、高维度的分类问题通常表现稳健。随机森林Random Forest这是我们最终采用的主力模型。原因有三首先它能自动评估特征重要性直观告诉我们SiO2、PbO、K2O等成分在分类中的决定性排序其次它对缺失值不敏感内部可处理对异常值也有较好的鲁棒性最后它通常能取得较高的准确率。我们通过网格搜索Grid Search来优化随机森林的超参数如树的数量n_estimators、最大深度max_depth等。python示例代码使用随机森林分类与特征重要性分析from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix假设X是特征数据y是类别标签‘铅钡‘ ‘高钾‘X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)rf_clf RandomForestClassifier(n_estimators100, random_state42) rf_clf.fit(X_train, y_train) y_pred rf_clf.predict(X_test)print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))特征重要性可视化importances rf_clf.feature_importances_ feature_names X.columns indices np.argsort(importances)[::-1]plt.figure(figsize(10,6)) plt.title(Feature Importances in Glass Classification) plt.bar(range(X.shape[1]), importances[indices], aligncenter) plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices], rotation90) plt.show() 实操心得不要只追求最高的测试集准确率。在考古学背景下模型的误判代价是不对称的。将一件珍贵的铅钡玻璃误判为高钾玻璃可能会误导考古研究。因此我们需要特别关注召回率Recall尤其是对样本数量可能较少的类别的召回率。在调整模型阈值或使用代价敏感学习时可以适当提高对重要类别的识别要求。4. 风化作用分析与成分预测化学变化的逆向推演这是题目的难点和亮点。风化会改变玻璃表面成分主要是碱金属氧化物如Na2O, K2O流失而某些稳定氧化物如Al2O3, SiO2相对富集。我们的目标是1量化分析风化规律2预测未风化前的原始成分。4.1 风化规律的量化分析我们采用了配对样本T检验和相关性分析。配对T检验对于同时有表面和内部成分数据的样本我们将同一文物表面与内部的各成分含量作为配对样本进行T检验。结果显著p值0.05的成分说明风化作用对其含量产生了统计学上的显著改变。我们预期Na2O、K2O的表面含量显著低于内部。相关性分析计算表面成分与内部成分的皮尔逊相关系数。对于风化稳定的元素如Al2O3, SiO2其表面与内部含量应高度相关而对于易流失元素相关性会减弱。同时可以分析不同氧化物在风化过程中的协同变化关系例如Na2O的流失是否与某种其他氧化物的增加存在负相关。4.2 预测未风化成分建立“回归-校正”模型对于只有表面风化成分的样本我们需要预测其内部原始成分。我们构建了一个多元线性回归模型但思路不是直接用表面成分预测内部成分因为关系可能非线性且受风化程度影响。我们采用的策略是定义风化程度指标利用风化稳定元素通常选Al2O3或SiO2作为内标。假设它们在风化过程中绝对质量不变那么它们在表面百分比升高 solely due to the loss of other components. 我们可以计算一个风化因子FF (Al2O3_surface / Al2O3_interior) - 1。对于只有表面数据的样本我们需要先估计这个F。建立预测模型对于有配对数据的样本我们以表面成分和风化因子F或与之相关的其他表面成分比值作为特征以内部成分作为目标变量训练一系列回归模型每个氧化物一个模型。例如预测内部Na2O含量。迭代优化对于未知样本我们先假设一个初始风化因子预测内部成分然后用预测的内部成分再计算一个新的、更合理的风化因子如此迭代几次直到预测结果稳定。这个方法的关键在于**选择合适的“保守元素”**作为内标。需要结合考古化学知识通常选择在埋藏环境中极其稳定、几乎不参与风化反应的氧化物如氧化铝Al2O3。在我们的实践中假设Al2O3绝对量不变取得了较好的预测效果。踩坑实录最初我们试图直接用所有表面成分通过一个复杂的神经网络来预测内部成分但模型严重过拟合对于风化程度差异大的样本外推能力很差。后来回归到基于化学原理的“内标法”结合简单回归模型物理意义清晰稳定性反而更好。这提醒我们在数模竞赛中一个具有强解释性、贴合问题背景的简单模型往往比一个黑箱复杂模型更受青睐也更容易被评委理解和认可。5. 未知样本鉴别与模型泛化实战中的决策最后一问通常是综合应用给出一批新的、类别未知的玻璃文物成分数据可能包含风化样品要求进行鉴别并分析其可能的产地或年代。我们的解决方案是一个分步决策流水线第一步风化判断与成分还原。首先判断样本是否风化。可以通过观察Na2O、K2O含量是否极低接近0同时Al2O3、SiO2含量是否相对较高来初步判断。更严谨的做法是计算一个基于多种稳定元素比值的“风化概率”指标。对于判定为风化的样本使用第4部分建立的“回归-校正”模型预测其未风化的原始成分。第二步大类分类。将样本或还原后的原始成分输入到训练好的随机森林分类器中得到其属于“铅钡玻璃”或“高钾玻璃”的预测概率。我们设定一个概率阈值如0.7高于阈值则直接分类对于概率接近0.5的模糊样本进入下一步细粒度分析。第三步模糊样本分析与亚类划分。对于模糊样本我们不再依赖单一的分类器结果而是启动一个“专家系统”式的判断 a.关键元素阈值法检查PbO和BaO的绝对含量。如果PbO 5% 且 BaO 2%则强烈指向铅钡玻璃。 b.比值法计算K2O/Na2O比值。如果比值远大于1例如5则指向高钾玻璃如果比值很小但PbO、BaO含量也低则可能是钠钙玻璃本题背景中未出现但可作为可能性考虑。 c.与类中心距离计算该样本到“铅钡类”和“高钾类”成分均值向量的马氏距离选择距离更近的类别。马氏距离考虑了特征之间的相关性比欧氏距离更优。对于大类内的样本可以进一步进行聚类如K-Means with K2或3探索是否存在不同的亚型并结合考古背景如出土墓葬等级、纹饰特点给出推测性解释。第四步结果呈现与不确定性说明。最终输出不仅给出“A样本为铅钡玻璃”的结论更重要的是一份分析报告。报告中包含分类置信度、关键判定依据如“因PbO含量达XX%且K2O/Na2O比为XX”、对风化影响的处理说明、以及对于模糊样本存在的其他可能性分析。在学术或考古实践中诚实报告不确定性比强行给出一个武断的结论更有价值。通过这样一套从数据清洗、到规律探索、再到模型构建与综合决策的完整流程我们不仅给出了题目的答案更模拟了一次完整的跨学科数据分析项目。数学建模的魅力正在于此它是一套强大的思维工具能将一个遥远的考古学问题转化为可计算、可验证、可推理的数据科学流程。这次经历让我深刻体会到面对复杂问题清晰的逻辑链条和贴合领域知识的模型设计远比炫酷的算法本身更重要。
返回列表