9月7日18:00开赛后我们将会第一时间跟进~
2023数学建模国赛在即,我们团队将在竞赛周期内为大家提供包括但不限于:解题思路、代码撰写、行文思路等内容的精细指导。
团队成员由南大等985高校计算机类与数学类学生与优秀毕业生组成,所获建模类奖项包括国赛国二 美赛F奖mathorcup一等奖等,团队自2022年创办至今,在多场次比赛中协助大量学生获得了较为优异的成绩。
在比赛开始前,我们将以2022年国赛真题为例进行分析,并在23国赛真题发布后第一时间以同样的精度与详细度进行解析与解题指导,敬请期待~
22年C题剖析如下:
C题:古代玻璃制品的成分分析与鉴别
命题背景
本题考查古代玻璃制品的成分分析与鉴别的方法。背景是考古发现的古代玻璃制品。相比现代工业化生产的玻璃,古代玻璃的制作配方和技术更具地域特色。中国古代的铅钡玻璃和亚洲南部的钾玻璃是两个典型的古代玻璃类别。因此通过对不同来源玻璃样品成分的分析,可以判断其工艺流派和产地。
但是古代玻璃长期埋藏在土壤中,容易受各种环境条件影响而风化变质。这给正确鉴定其类别带来困难。本题的目的是通过数学建模分析古代玻璃的成分规律,研究风化对成分的影响,并最终判断不明样品的类别。
解题思路
一、根据风化点的检测数据预测风化前的成分
- 检查数据的有效性,删除无效数据
- 统计不同类型、纹饰、颜色的玻璃在风化程度上的区别,分析风化对成分的影响
- 选择机器学习算法(如:线性回归、SVM、随机森林等)以未风化点的数据作为训练样本,建立模型预测风化点风化前的成分。
具体代码如下:
import pandas as pd
from sklearn.linear_model import LinearRegression
data = pd.read_excel('data.xlsx')
# 删除无效数据
data = data[data['sum'] > 85]
data = data[data['sum'] < 105]
# 提取特征变量和目标变量
X = data[['SiO2', 'CaO' ,...]]
y = data['K2O']
# 拆分训练数据和测试数据(详见参考文献)
......
# 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = model.predict(X_test)
import matplotlib.pyplot as plt
# 计数不同类型玻璃的风化情况
count_dict = dict()
# 生成条形图(详见参考文献)
......
二、划分玻璃的亚类,并分析分类的合理性与敏感性
- 依据不同成分的含量分布情况,可以使用聚类分析算法对每个大类玻璃进行亚类划分。
- 根据主材料进行分类,并比较不同的聚类算法(如K-means, 层次聚类),选取聚类效果最好的。
- 分析不同聚类数量对分类结果的影响,选择合理的聚类数。
- 评估分类质量,可以采用轮廓系数等指标。
- 调整算法初始聚类中心,层次聚类可以调整距离度量方法,观察分类结果是否发生较大变化。
- 如果结果相对稳定,则说明对参数不太敏感
参考代码如下(以k-means为例):
from sklearn.cluster import KMeans
# 高钾玻璃数据
X_k = data[data['Type']=='高钾玻璃'][['K2O','Na2O']]
# 使用K-means聚类
kmeans = KMeans(n_clusters=3)
y_pred = kmeans.fit_predict(X_k)
# 评估聚类效果
print(kmeans.inertia_)
print(silhouette_score(X_k, y_pred))
from sklearn.utils import resample
# Bootstrap抽样测试结果稳定性(详见参考文献)
.......
# 调整K-means参数测试敏感性
y_pred_2 = KMeans(n_clusters=3, random_state=1).fit_predict(X_k)
print(rand_score(y_pred, y_pred_2))
import matplotlib.pyplot as plt
# 绘制聚类图
plt.scatter(X_k[:,0], X_k[:,1], c=y_pred)
# 添加聚类中心(详见参考文献)
.........
三、判断新样本类别
- 可以直接使用之前训练好的分类模型来预测新样本的类别
- 也可以使用无监督学习方法。计算新样本与各类别模板的相似度,或依据最大似然分析结果进行分类。
- 预测类别后,分析结果的可信度。可以基于分类模型的置信度或相似度大小来判断结果的可靠性。
参考代码如下:
# KNN分类模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
y_pred = knn.predict(X_new)
# 相似度分类(详见参考文献)
..........
# KNN置信度分析
proba = knn.predict_proba(X_new)
print(np.average(np.max(proba, axis=1)))
# 相似度阈值法
y_pred_2 = dist_1 < threshold_1
print(np.sum(y_pred != y_pred_2))
四、分析各成分之间的关联关系,并比较不同玻璃类型的成分关联差异
- 采用相关性分析,计算各成分之间的皮尔逊相关系数。
- 可视化成关联系数热力图,直观显示成分间相关性。
- 比较不同类型玻璃的相关系数绘制热图并分析其差异
参考代码如下:
import pandas as pd
import matplotlib.pyplot as plt
# 相关系数计算
corr_k = X_k.corr()
corr_p = X_p.corr()
# 绘制热力图 (详见参考文献)
.........
plt.show()
参考文献:2023国赛C题深入剖析与问题解答