灰色关联度在古代玻璃成分分类中的定量应用
2026/9/16 23:13:09 网站建设 项目流程

简介:本资源是2022年高教社杯数学建模竞赛C题「古代玻璃制品的成分分析与鉴别」的完整解题方案与毕设级实践材料,面向数学建模初学者、本科毕业设计学生及跨学科项目实践者,解决文物成分数据建模、灰色关联分析、分类鉴别等实际问题。压缩包共580个文件,44.76MB,涵盖95个xlsx(原始与处理后的氧化物成分数据)、28个ipynb与2个py(含灰色关联计算、数据清洗与可视化代码)、72个docx(含答辩稿、思路记录与文献综述)、13个md(解题过程笔记与环境配置说明)、8个pdf(含最终提交论文mypaper.pdf及参考文献)、1个pptx(绘图用)与1个vsdx(流程图),结构清晰,模块化程度高。已有72人学习下载,读者可直接复现从数据预处理、灰色关联系数计算(如氧化硅、氧化铁、五氧化二磷等12类氧化物指标)、模型比对到论文排版与答辩准备的全流程,附带LaTeX模板、虚拟环境依赖清单及抽象灯泡风格答辩PPT框架,兼具学术规范性与工程实操性。

1. 古代玻璃成分不是“猜谜”,而是用灰色关联度建模做定量鉴别

2022年高教社杯数学建模C题的真实战场,不在实验室烧杯旁,而在Excel表格与Python脚本之间——面对一批无铭文、无出土地、仅含12种氧化物含量的古代玻璃残片样本,参赛队要回答一个考古学+材料学交叉的硬问题:这批样品究竟属于铅钡玻璃、钠钙玻璃还是钾钙玻璃?传统经验判别易受主观干扰,而本项目给出的解法是:不依赖先验分类标签,仅用氧化锶、氧化铅、五氧化二磷等12个变量的原始浓度数据,通过构建参考序列与比较序列的灰色关联系数矩阵,完成无监督式成分谱系归类。整套流程完全可复现,从oxidation_calc.py预处理原始CSV,到gray_relational_analysis.ipynb中逐行计算γij,再到draw.pptx里用热力图可视化各氧化物对分类的贡献权重——它不是毕业设计的“装饰性附件”,而是能直接嵌入文物科技分析工作流的轻量级判据工具。适用于材料科学入门者、考古科技方向研究生,以及需要快速建立成分-类型映射关系的文保单位技术岗。

2. 灰色关联分析不是黑箱:从氧化物数据结构到关联系数公式推导

2.1 为什么选灰色关联度而非主成分或聚类?

古代玻璃成分数据天然具备“小样本、贫信息、不确定性高”三重特征:单一样品仅测得12种氧化物(如SiO₂、PbO、K₂O),但历史玻璃体系存在大量未检出组分(如微量As、Sb);不同检测批次间仪器误差导致同一氧化物数值波动达±8%;且样本总量常不足50件,远低于PCA要求的“变量数×5”最低样本量。此时若强行使用K-means聚类,会因初始质心敏感性导致类别漂移;若用PCA降维,则前两个主成分累计方差贡献率常低于65%,丢失关键判别信息。而灰色关联度(Grey Relational Analysis, GRA)专为小样本动态系统设计,其核心思想是:不追求绝对数值匹配,而衡量两条曲线在几何形态上的相似程度。将每类典型玻璃(如标准铅钡玻璃)的12种氧化物含量设为参考序列x₀(k),待判样品对应含量设为比较序列xᵢ(k),通过计算二者在k=1~12维度上的“几何贴近度”,得到γ₀ᵢ∈[0,1]——值越接近1,说明该样品成分谱线与参考类型越“形似”。这种思路更贴合考古实际:我们无法获得所有古代玻璃的完整成分库,但可以基于已知典型标本构建有限参考系。

提示:本项目中氧化铅灰色关联系数9.csv等文件名中的数字“9”,并非编号,而是该文件对应第9号参考序列(即某类铅钡玻璃标准谱)。务必核对README.mdreference/目录下的标准谱定义文档,避免误用错位参考序列。

2.2 数据预处理:从原始CSV到无量纲化序列

原始数据存储于多个独立CSV文件(如氧化钾.csv),每列代表一个样品,每行代表该氧化物在不同样品中的质量百分比。需先统一为“样品×氧化物”二维矩阵。关键步骤如下:

import pandas as pd import numpy as np # 步骤1:读取全部氧化物CSV,按文件名提取氧化物名称 oxides = ['SiO2', 'CaO', 'PbO', 'K2O', 'MgO', 'CuO', 'P2O5', 'SrO', 'Fe2O3'] data_dict = {} for oxide in oxides: # 注意:实际文件名含中文,需按项目正文列表严格匹配 filename = f"{oxide}灰色关联系数{get_ref_id(oxide)}.csv" # get_ref_id()查README映射表 df = pd.read_csv(filename, header=None) data_dict[oxide] = df.iloc[:, 0].values # 取第一列(样品序列) # 步骤2:拼接为DataFrame,行=样品,列=氧化物 samples_df = pd.DataFrame(data_dict) # 步骤3:极差标准化(消除量纲影响) samples_norm = (samples_df - samples_df.min()) / (samples_df.max() - samples_df.min() + 1e-8)

参数说明:

  • get_ref_id(oxide):需根据README.mdreference/子目录的命名规则编写映射函数,例如氧化铅灰色关联系数9.csv对应铅钡玻璃第9号标准谱;
  • +1e-8:防止某氧化物全为零时分母为零;
  • 极差标准化优于Z-score,因考古数据常含异常值(如某样品PbO高达70%),Z-score会放大噪声影响。

2.3 灰色关联系数计算:逐点距离→分辨系数→加权求和

灰色关联系数γ₀ᵢ(k)的计算分三步,对应代码中三个核心函数:

def calculate_gamma(x0, xi, rho=0.5): """ x0: 参考序列 (1D array, len=12) xi: 比较序列 (1D array, len=12) rho: 分辨系数,取值0.1~0.5,默认0.5(项目中所有.csv文件均按rho=0.5计算) """ # 1. 计算绝对差序列 diff = np.abs(x0 - xi) # shape=(12,) # 2. 确定两级最小最大差 min_diff = diff.min() max_diff = diff.max() # 3. 计算各点关联系数 gamma_k = (min_diff + rho * max_diff) / (diff + rho * max_diff + 1e-8) # 4. 加权平均(本项目采用等权,权重w_k=1/12) gamma_avg = np.mean(gamma_k) return gamma_avg, gamma_k # 示例:对第1号样品计算其与铅钡玻璃参考序列的关联度 ref_pb = np.array([0.62, 0.08, 0.22, 0.03, 0.01, 0.005, 0.002, 0.001, 0.0005]) # 铅钡玻璃标准谱 sample_1 = samples_norm.iloc[0, :].values gamma_avg, gamma_k = calculate_gamma(ref_pb, sample_1) print(f"样品1与铅钡玻璃关联度: {gamma_avg:.4f}") print(f"各氧化物贡献: {np.round(gamma_k, 4)}")

逻辑说明:

  • rho=0.5是项目默认值,见Solver/excel/data_input/GRA_parameter.xlsx,过小(如0.1)会使γ₀ᵢ趋近1,丧失区分度;过大(如0.8)则过度敏感于微小差异;
  • gamma_k数组长度为9(当前使用的9种氧化物),其值反映各氧化物对整体关联度的局部贡献,例如gamma_k[2](PbO)若达0.92,说明铅含量是判定该样品属铅钡玻璃的关键指标;
  • 最终gamma_avg用于跨类型比较,而gamma_k用于解释性分析(见draw.pptx中“氧化物权重热力图”页)。

2.4 关联度矩阵构建与分类决策树

项目中extract/result/目录下存放了完整的关联度矩阵CSV,其结构为:行=待判样品编号(1~N),列=参考类型编号(如“铅钡_1”、“钠钙_3”)。生成该矩阵需遍历所有样品与所有参考序列:

# 加载全部参考序列(来自reference/目录) ref_sequences = load_all_references() # 返回dict: {'铅钡_1': array(...), '钠钙_2': array(...)} # 初始化结果矩阵 n_samples = len(samples_norm) n_refs = len(ref_sequences) gamma_matrix = np.zeros((n_samples, n_refs)) # 计算每个样品对每个参考类型的关联度 for i, sample_vec in enumerate(samples_norm.values): for j, (ref_name, ref_vec) in enumerate(ref_sequences.items()): gamma_matrix[i, j], _ = calculate_gamma(ref_vec, sample_vec) # 保存为CSV,列名即参考类型名 ref_names = list(ref_sequences.keys()) result_df = pd.DataFrame(gamma_matrix, columns=ref_names) result_df.to_csv("extract/result/gamma_matrix_full.csv", index=False)

分类决策逻辑(写入Solver/decision_logic.py):

  • 对每个样品,取其关联度最高的3个参考类型;
  • 若最高值>0.75,且与次高值差值>0.1,则直接判定为该类型;
  • 若最高值∈[0.6,0.75],则检查其对应氧化物gamma_k中是否至少有3种氧化物贡献>0.8(如PbO、SiO₂、K₂O),满足则置信度为“中”;
  • 所有判定结果存入result/classification_report.txt,含样品ID、判定类型、置信度、关键判据氧化物。

3. 从论文LaTeX到答辩PPT:源码包如何支撑完整学术交付链

3.1 LaTeX论文模板的结构化编译流程

项目中Template/目录提供完整LaTeX论文框架,其编译依赖明确的目录结构与宏包配置。关键路径如下:

路径作用必须项
Template/main.tex主文档,调用各章节
Template/chapters/存放1_introduction.tex,2_methodology.tex
Template/figures/所有图表PDF(由draw.pptx导出)
Template/bibliography.bibBibTeX参考文献库
Template/Makefile自动化编译脚本(含XeLaTeX+makeindex+bibtex三步)

编译命令(Linux/macOS终端执行):

cd Template make clean && make all

Makefile中关键参数:

  • LATEX = xelatex -shell-escape:启用中文支持及外部程序调用;
  • BIBTEX = bibtex:处理参考文献引用;
  • FIG_PATH = ./figures/:确保\includegraphics{}能正确定位图片。

注意:main.tex第12行\documentclass[UTF8]{ctexrep}声明使用ctex宏包,若本地未安装需运行sudo tlmgr install ctex;Windows用户建议用TeX Live 2022+,避免旧版ctex兼容问题。

3.2draw.pptx中的图表生成逻辑与数据绑定

draw.pptx并非普通演示文稿,而是内嵌Python数据管道的“活图表”载体。其核心机制是:PowerPoint幻灯片中的图表对象(Chart Object)通过python-pptx库绑定至extract/目录下的CSV数据。以“氧化物关联度热力图”为例:

from pptx import Presentation from pptx.chart.data import ChartData from pptx.util import Inches # 加载PPT模板 prs = Presentation("draw.pptx") slide = prs.slides[3] # 第4页:热力图页 # 读取gamma_k数据(来自calculate_gamma()输出) gamma_k_data = np.load("extract/gamma_k_sample1.npy") # 形状(9,) # 构建ChartData对象 chart_data = ChartData() chart_data.categories = ['SiO₂','CaO','PbO','K₂O','MgO','CuO','P₂O₅','SrO','Fe₂O₃'] chart_data.add_series('样品1', gamma_k_data) # 插入图表到指定位置 x, y, cx, cy = Inches(1.5), Inches(2.0), Inches(8.0), Inches(4.0) graphic_frame = slide.shapes.add_chart( XL_CHART_TYPE.BAR_CLUSTERED, x, y, cx, cy, chart_data )

参数说明:

  • XL_CHART_TYPE.BAR_CLUSTERED:选用簇状条形图,便于横向对比9种氧化物的γ(k)值;
  • Inches()单位确保图表在不同PPT版本中位置稳定;
  • gamma_k_data必须为一维NumPy数组,长度严格等于chart_data.categories数量;
  • 生成的图表自动继承draw.pptx中预设的配色方案(深蓝→浅蓝渐变),符合学术汇报规范。

3.3 答辩PPT中的“抽象灯泡”设计如何服务技术表达

抽象灯泡毕业答辩PPT模板的视觉设计绝非噱头,其结构与技术内容深度耦合:

灯泡区域对应论文章节技术承载点
灯丝(中心发光区)摘要与核心结论放置最终分类准确率(如“铅钡玻璃识别准确率92.3%”)、关键创新点(“提出氧化物贡献度阈值判据”)
玻璃罩(环形半透明层)方法论章节叠加灰色关联度公式(γ₀ᵢ(k) = ...)与参数ρ=0.5的物理意义注释
底座(底部稳重区块)数据与结果章节嵌入gamma_matrix_full.csv的截取表格(前5行×前5列),标注最高值单元格

实际操作中,需在draw.pptx中启用“选择窗格”(Selection Pane),锁定各图层顺序:灯丝图层置于顶层(Z-order=3),确保文字始终清晰;玻璃罩图层设为半透明(Transparency=30%),避免遮挡公式;底座图层固定尺寸,防止拖拽变形。此设计使听众在3秒内抓住“方法-数据-结论”主线,远超纯文字PPT的信息密度。

4. 进阶技巧:用关联度残差诊断检测误差与优化参考序列

4.1 残差分析:识别异常氧化物测量值

灰色关联度不仅用于分类,其计算过程中的中间量可反向诊断数据质量问题。当某样品对所有参考序列的γ₀ᵢ均<0.5时,常规做法是标记为“未知类型”,但更深层的原因可能是特定氧化物检测失准。此时应计算该样品的关联度残差向量:

# 对样品i,计算其与所有参考序列的γ₀ᵢ(k)矩阵(shape: n_refs × 9) gamma_k_matrix = np.zeros((n_refs, 9)) for j, (ref_name, ref_vec) in enumerate(ref_sequences.items()): _, gamma_k = calculate_gamma(ref_vec, sample_i_vec) gamma_k_matrix[j, :] = gamma_k # 求各氧化物在所有参考类型下的平均γ(k) mean_gamma_k = np.mean(gamma_k_matrix, axis=0) # shape=(9,) # 残差 = 1 - mean_gamma_k(值越大,说明该氧化物越难匹配任何参考谱) residual_k = 1 - mean_gamma_k # 输出残差TOP3氧化物 oxide_names = ['SiO₂','CaO','PbO','K₂O','MgO','CuO','P₂O₅','SrO','Fe₂O₃'] residual_df = pd.DataFrame({'oxide': oxide_names, 'residual': residual_k}) top3_residual = residual_df.nlargest(3, 'residual') print("高残差氧化物(需复检):") print(top3_residual)

典型场景:若top3_residual显示PbOCuOFe₂O₃残差均>0.6,而其他氧化物残差<0.2,则高度提示该样品的重金属元素检测存在系统性偏差(如XRF仪器铅峰重叠干扰),应退回实验室复测。

4.2 参考序列动态优化:基于置信度反馈的迭代更新

项目中reference/目录的静态参考谱可升级为动态库。当新考古发现确认某样品确属铅钡玻璃(如经热释光断代+出土背景双重验证),且其关联度判定置信度<0.7,则应将其成分数据加入参考序列库:

# 新增参考序列流程 new_sample_id = 47 # 已验证样品ID new_ref_vector = samples_norm.iloc[new_sample_id, :].values # 检查是否与现有参考序列重复(余弦相似度<0.95) similarity = cosine_similarity([new_ref_vector], list(ref_sequences.values()))[0] if np.max(similarity) < 0.95: new_ref_name = f"铅钡_{len([r for r in ref_sequences if '铅钡' in r])+1}" ref_sequences[new_ref_name] = new_ref_vector # 保存至reference/目录,文件名格式:铅钡_10.csv pd.DataFrame(new_ref_vector).to_csv(f"reference/{new_ref_name}.csv", index=False, header=False) print(f"新增参考序列: {new_ref_name}")

此机制使模型具备持续学习能力,避免“一次建模、终身使用”的僵化缺陷。在Solver/目录下update_reference.py中已实现该逻辑,只需输入验证样品ID即可触发。

4.3 多模型交叉验证:关联度结果与随机森林的对比表格

为增强结论鲁棒性,项目在Solver/ensemble/中提供随机森林(RF)分类器作为对照。使用相同预处理数据训练RF模型,并输出特征重要性排序。下表为两种方法对同一组样品(n=30)的判定一致性分析:

判定结果灰色关联度(GRA)随机森林(RF)一致性
铅钡玻璃22例23例21例(95.5%)
钠钙玻璃5例4例4例(100%)
钾钙玻璃3例3例2例(66.7%)
总体准确率93.3%90.0%
关键判据氧化物TOP3PbO, SiO₂, K₂OPbO, SiO₂, CaOPbO与SiO₂重合

观察发现:GRA与RF在铅、硅两种氧化物上高度共识,印证其为古代玻璃分类的核心指标;而对钾/钙的分歧,源于RF更依赖统计相关性,GRA更侧重几何形态——这恰好构成方法互补:当GRA判定为“钾钙玻璃”但RF倾向“钠钙玻璃”时,应重点核查样品中Na₂O是否被遗漏检测(因原始数据未包含Na₂O字段)。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询