【2022年高教杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(五)(部分代码)

本文介绍了参与2022年高教杯数学建模竞赛C题的解决方案,主要涉及古代玻璃制品的成分分析和鉴别。文章分为四个部分,分别探讨了不同问题,使用Python和pandas进行数据分析,并提供了部分代码实现。
摘要由CSDN通过智能技术生成

完整版随后更新到资源中!

1.问题1

import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
for m in range(2,16):
    # 设置kde=True添加密度曲线
    sns.distplot(data_2_1_new.iloc[:,m],hist=True, kde=True)
    plt.show()
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
for i in range(2,16):
    plt.title('%s含量的变化情况'%(data_2_1_new.columns[i]))
    plt.scatter(data_2_1_new.iloc[:14,0],data_2_1_new.iloc[:14,i],c='green',label='未风化')
    plt.scatter(data_2_1_new.iloc[14:,0],data_2_1_new.iloc[14:,i],c='red',label='风化')
    plt.legend()
    plt.show()
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
for m in range(2,16):
    # 设置kde=True添加密度曲线
    sns.distplot(data_3_1.iloc[:,m],hist=True, kde=True)
    plt.show()
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
for i in range(2,16):
    plt.title('%s含量的变化情况'%(data_3_1.columns[i]))
    plt.scatter(data_3_1.iloc[:24,0],data_3_1.iloc[:24,i],c='green',label='未风化')
    plt.scatter(data_3_1.iloc[24:,0],data_3_1.iloc[24:,i],c='red',label='风化')
    plt.legend()
    plt.show()

2.问题2

from tqdm import tqdm
import re
tqdm.pandas()
def clear_id(s):
    ss = str(s)
    n = int(re.findall(r"\d+",ss)[0])
    return n
data_2_['id'] = data_2_['文物采样点'].progress_apply(clear_id)
data_2['id'] = data_2['文物编号'].progress_apply(clear_id)
cols = ['纹饰', '类型', '颜色', '表面风化', '二氧化硅(SiO2)',
       '氧化钠(Na2O)', '氧化钾(K2O)', '氧化钙(CaO)', '氧化镁(MgO)', '氧化铝(Al2O3)',
       '氧化铁(Fe2O3)', '氧化铜(CuO)', '氧化铅(PbO)', '氧化钡(BaO)', '五氧化二磷(P2O5)',
       '氧化锶(SrO)', '氧化锡(SnO2)', '二氧化硫(SO2)']
cols1 = ['二氧化硅(SiO2)',
       '氧化钠(Na2O)', '氧化钾(K2O)', '氧化钙(CaO)', '氧化镁(MgO)', '氧化铝(Al2O3)',
       '氧化铁(Fe2O3)', '氧化铜(CuO)', '氧化铅(PbO)', '氧化钡(BaO)', '五氧化二磷(P2O5)',
       '氧化锶(SrO)', '氧化锡(SnO2)', '二氧化硫(SO2)']
cols2 = ['纹饰', '类型', '颜色', '表面风化']
file_data = pd.merge(data_2,data_2_,on='id')
Gao_data = file_data[file_data['类型']=='高钾'][cols]
Qian_data = file_data[file_data['类型']=='铅钡'][cols]
from sklearn.preprocessing import LabelEncoder

Gao_train = pd.DataFrame() # 用于存放编码后的训练数据
label = LabelEncoder() # 标号编码器

X= Gao_data
for c in X.columns:
    if X[c].dtype=='object': # 如果是字符串形式的(字符串读到pandas里dtype是object)
        Gao_train[c] = label.fit_transform(X[c]) # 将整个这一列进行标号编码,写到新的dataframe里
    else: # 其它类型的特征(数值,布尔)保持原样写入
        Gao_train[c] = list(X[c])

Qian_train = pd.DataFrame() 
label = LabelEncoder() 
X= Qian_data
for c in X.columns:
    if X[c].dtype=='object':
        Qian_train[c] = label.fit_transform(X[c])
    else:
        Qian_train[c] = list(X[c])
from sklearn.cluster import AgglomerativeClustering #导入sklearn的层次聚类函数
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['STSong']
data = np.array(Gao_train)

Scores = []  # 存放轮廓系数
SSE = []  # 存放每次结果的误差平方和
for k in range(2, 9):
    estimator = AgglomerativeClustering(n_clusters = k, linkage = 'ward')
    estimator.fit(data)
    Scores.append(silhouette_score(
        np.array(data), estimator.labels_, metric='euclidean'))
X = range(2,9)
plt.xlabel('k值',fontsize=20)
plt.ylabel('聚类系数',fontsize=20)
plt.plot(X, Scores, 'o-')
plt.show()
k = 4
plt.figure(figsize=(20,15))

model = AgglomerativeClustering(n_clusters = k, linkage = 'ward')
data =Gao_train
model.fit(data) #训练模型
# 详细输出原始数据及其类别
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #详细输出每个样本对应的类别
from scipy.cluster.hierarchy import linkage,dendrogram
#这里使用scipy的层次聚类函数
Z = linkage(data, method = 'ward', metric = 'euclidean') #谱系聚类图
P = dendrogram(Z, 0) #画谱系聚类图
plt.show()
from scipy.cluster.hierarchy import linkage,dendrogram
plt.figure(figsize=(20,15))
k = 4
model = AgglomerativeClustering(n_clusters = k, linkage = 'ward')
data =Qian_train
model.fit(data) #训练模型
#详细输出原始数据及其类别
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #详细输出每个样本对应的类别

#这里使用scipy的层次聚类函数
Z = linkage(data, method = 'ward', metric = 'euclidean') #谱系聚类图
P = dendrogram(Z, 0) #画谱系聚类图
plt.show()
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
df1 = Gao_train
data1 = np.array(df1)

clf1 = AgglomerativeClustering(n_clusters = 2, linkage = 'ward')
s = clf1.fit(data1)
pred1 = clf1.fit_predict(data1)
score1 = silhouette_score(data1, pred1)
pca = PCA(n_components=2)  # 输出两维
newData1 = pca.fit_transform(data1)  # 载入N维
x1, y1 = [], []
x2, y2= [], []
x3, y3= [], []
x4, y4= [], []
x5, y5= [], []
x6, y6= [], []
for index, value in enumerate(pred1):
    if value == 0:
        x1.append(newData1[index][0])
        y1.append(newData1[index][1])
    elif value == 1:
        x2.append(newData1[index][0])
        y2.append(newData1[index][1])
plt.figure(figsize=(12, 8))

k = 50
plt.scatter(x1, y1,s=k)
plt.scatter(x2, y2,s=k)
plt.show()
df2 = Qian_train
data2 = np.array(df2)

clf2 = AgglomerativeClustering(n_clusters = 5, linkage = 'ward')
s = clf2.fit(data2)
pred2 = clf2.fit_predict(data2)
score2 = silhouette_score(data2, pred2)

pca = PCA(n_components=2)  # 输出两维
newData2 = pca.fit_transform(data2)  # 载入N维

x1, y1 = [], []
x2, y2= [], []
x3, y3= [], []
x4, y4= [], []
x5, y5= [], []
x6, y6= [], []
for index, value in enumerate(pred2):
    if value == 0:
        x1.append(newData2[index][0])
        y1.append(newData2[index][1])
    elif value == 1:
        x2.append(newData2[index][0])
        y2.append(newData2[index][1])
    elif value == 2:
        x3.append(newData2[index][0])
        y3.append(newData2[index][1])
    elif value == 3:
        x4.append(newData2[index][0])
        y4.append(newData2[index][1])
    elif value == 4:
        x5.append(newData2[index][0])
        y5.append(newData2[index][1])
# plt.subplot(132)
plt.figure(figsize=(12, 8))
k = 50
plt.scatter(x1, y1,s=k)
plt.scatter(x2, y2,s=k)
plt.scatter(x3, y3,s=k)
plt.scatter(x4, y4,s=k)
plt.scatter(x5, y5,s=k)
plt.show()

3.问题三

file1 = pd.read_excel('./附件.xlsx',sheet_name='表单1')
file2 = pd.read_excel('./附件.xlsx',sheet_name='表单2')
file3 = pd.read_excel('./附件.xlsx',sheet_name='表单3')
from tqdm import tqdm
import re
tqdm.pandas()
def clear_id(s):
    ss = str(s)
    n = int(re.findall(r"\d+",ss)[0])
    return n
file2['id'] = file2['文物采样点'].progress_apply(clear_id)
file1['id'] = file1['文物编号'].progress_apply(clear_id)
cols = ['表面风化', '二氧化硅(SiO2)',
       '氧化钠(Na2O)', '氧化钾(K2O)', '氧化钙(CaO)', '氧化镁(MgO)', '氧化铝(Al2O3)',
       '氧化铁(Fe2O3)', '氧化铜(CuO)', '氧化铅(PbO)', '氧化钡(BaO)', '五氧化二磷(P2O5)',
       '氧化锶(SrO)', '氧化锡(SnO2)', '二氧化硫(SO2)']
file_data = pd.merge(file1,file2,on='id')
Gao_data = file_data[file_data['类型']=='高钾'][cols]
Qian_data = file_data[file_data['类型']=='铅钡'][cols]
test_all = file3[cols]
Qian_data = Qian_data.fillna(0)
Gao_data = Gao_data.fillna(0)
test_all = test_all.fillna(0)
train_all = pd.concat([Gao_data,Qian_data])
encode_data = pd.concat([train_all,test_all])
len(train_all)
from sklearn.preprocessing import LabelEncoder

all_data = pd.DataFrame() # 用于存放编码后的训练数据
label = LabelEncoder() # 标号编码器
X= encode_data
for c in X.columns: # 对每个特征列
    if X[c].dtype=='object': # 如果是字符串形式的(字符串读到pandas里dtype是object)
        all_data[c] = label.fit_transform(X[c]) # 将整个这一列进行标号编码,写到新的dataframe里
    else: # 其它类型的特征(数值,布尔)保持原样写入
        all_data[c] = list(X[c])
train = all_data[0:len(train_all)]
test = all_data[len(train_all):]
from sklearn.model_selection import train_test_split # 拆分数据
import numpy as np
X_var,y_var= train,[0]*len(Gao_data)+[1]*len(Qian_data)
X_train, X_test, y_train, y_test = train_test_split(X_var, y_var, test_size = 0.2, random_state = 123)
from sklearn.tree import DecisionTreeClassifier as dtc # 树算法
from sklearn.metrics import accuracy_score
model = dtc(criterion = 'entropy', max_depth = 5)
model.fit(X_train, y_train)
pred_model = model.predict(X_test)
print(accuracy_score(y_test, pred_model))
from sklearn.tree import plot_tree # 树图
import matplotlib.pyplot as plt
model = dtc(criterion = 'entropy', max_depth = 5)
model.fit(X_var, y_var)
feature_names = X_var.columns
target_names = ['高钾玻璃','铅钡玻璃']
 
plot_tree(model, 
          feature_names = feature_names, 
          class_names = target_names, 
          filled = True, 
          rounded = True)
 
plt.show()
model.predict(test)

4.问题四

file1 = pd.read_excel('./附件.xlsx',sheet_name='表单1')
file2 = pd.read_excel('./附件.xlsx',sheet_name='表单2')
file3 = pd.read_excel('./附件.xlsx',sheet_name='表单3')
from tqdm import tqdm
import re
tqdm.pandas()

def clear_id(s):
    ss = str(s)
    n = int(re.findall(r"\d+",ss)[0])
    return n
file2['id'] = file2['文物采样点'].progress_apply(clear_id)
file1['id'] = file1['文物编号'].progress_apply(clear_id)
cols = ['表面风化', '二氧化硅(SiO2)',
       '氧化钠(Na2O)', '氧化钾(K2O)', '氧化钙(CaO)', '氧化镁(MgO)', '氧化铝(Al2O3)',
       '氧化铁(Fe2O3)', '氧化铜(CuO)', '氧化铅(PbO)', '氧化钡(BaO)', '五氧化二磷(P2O5)',
       '氧化锶(SrO)', '氧化锡(SnO2)', '二氧化硫(SO2)']
file_data = pd.merge(file1,file2,on='id')
Gao_data = file_data[file_data['类型']=='高钾'][cols]
Qian_data = file_data[file_data['类型']=='铅钡'][cols]
Qian_data = Qian_data.fillna(0)
Gao_data = Gao_data.fillna(0)
import seaborn as sns 
f, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 8))
df = Gao_data
shifted_cols = df.columns
corrmat = df[shifted_cols].corr()

heatmap = sns.heatmap(corrmat,annot = True,vmax = 1,square = True)
ax.set_title('高钾玻璃化学成分相关性', fontsize=16)
plt.tight_layout()
plt.show()
f, ax = plt.subplots(nrows=1, ncols=1, figsize=(12, 8))
df_1 = Qian_data
shifted_cols = df_1.columns
corrmat = df_1[shifted_cols].corr()

heatmap = sns.heatmap(corrmat,annot = True,vmax = 1,square = True)
ax.set_title('铅钡玻璃化学成分相关性', fontsize=10)
plt.tight_layout()
plt.show()
df = Qian_data
shifted_cols = df.columns
corrmat = df[shifted_cols].corr()
sns.pairplot(corrmat) 
df = Gao_data
shifted_cols = df.columns
corrmat = df[shifted_cols].corr()
sns.pairplot(corrmat) 
古代玻璃制品matlab代码实现是一个有趣且具有挑战性的问。在实现这个代码之前,我们需要先了解一下古代玻璃制品的特点和制作过程。 古代玻璃制品通常是用砂石、碱和一些特殊的添加剂经过熔融、成形和退火等过程制成的。其中,砂石和碱的配比以及其他添加剂的使用对玻璃制品的质量和特性有着重要的影响。 首先,我们需要确定一些参数,如砂石与碱的配比、熔融温度、退火温度等。然后,使用matlab编写代码来模拟古代玻璃制品的制作过程。以下是一个简单的示例: ```matlab % 古代玻璃制品的matlab代码实现 % 定义参数 proportion = 0.7; % 砂石与碱的配比 melting_temp = 1200; % 熔融温度 annealing_temp = 600; % 退火温度 % 模拟熔融过程 melted = 0; while melted < melting_temp melted = melted + 10; % 每次增加10度 % 其他熔融过程的代码 end % 模拟成形过程 % 成形过程的代码 % 模拟退火过程 annealed = 0; while annealed < annealing_temp annealed = annealed + 10; % 每次增加10度 % 其他退火过程的代码 end % 模拟制品检验和评估过程 % 检验和评估过程的代码 % 展示结果 % 结果展示的代码 ``` 需要注意的是,这只是一个简单的示例代码,实际实现过程涉及到更多复杂的参数和过程。具体的代码实现应该根据实际情况进行调整和完善。 总之,使用matlab编写古代玻璃制品模拟代码可以帮助我们更好地理解古代技术的制作过程,进而对古代玻璃制品有更深入的认识。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值