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(method='knn') # 此处为示意,实际需用KNNImputer
计算每个样本的氧化物总和
sum_per_sample = df_filled.sum(axis=1)
进行定和归一化
df_normalized = df_filled.div(sum_per_sample, axis=0) * 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_size=0.2, random_state=42)
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42) 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], align="center") plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices], rotation=90) 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. 我们可以计算一个风化因子F:F = (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 K=2或3),探索是否存在不同的亚型,并结合考古背景(如出土墓葬等级、纹饰特点)给出推测性解释。
第四步:结果呈现与不确定性说明。
- 最终输出不仅给出“A样本为铅钡玻璃”的结论,更重要的是一份分析报告。报告中包含:分类置信度、关键判定依据(如:“因PbO含量达XX%,且K2O/Na2O比为XX”)、对风化影响的处理说明、以及对于模糊样本存在的其他可能性分析。在学术或考古实践中,诚实报告不确定性比强行给出一个武断的结论更有价值。
通过这样一套从数据清洗、到规律探索、再到模型构建与综合决策的完整流程,我们不仅给出了题目的答案,更模拟了一次完整的跨学科数据分析项目。数学建模的魅力正在于此:它是一套强大的思维工具,能将一个遥远的考古学问题,转化为可计算、可验证、可推理的数据科学流程。这次经历让我深刻体会到,面对复杂问题,清晰的逻辑链条和贴合领域知识的模型设计,远比炫酷的算法本身更重要。