2022数学建模国赛C题详细思路:基于随机森林和灰色关联度分析

2022数学建模国赛C题 古代玻璃制品的成分分析与鉴别,已经写出完整思路和代码见文末

subplot(1,2,2);
bar(sortW);
xlim([0 c+1]);   % 设置x轴范围
xlabel('指标名称','FontSize',12,'FontWeight','bold');
set(gca,'xtick',1:c);
set(gca,'XTickLabel',sortIndex,'FontWeight','light');
ylabel('权重','FontSize',12,'FontWeight','bold');
set(gca,'YGrid','on');
for i=1:c
    text(i-0.35,sortW(i)+0.005,sprintf('%.3f',sortW(i)));
end
title('指标权重可视化(降序排列)');
box off;
 
 
%% 关联度分析结果展示
[sortP,IX]=sort(P,'descend');  % 关联度降序排序,IX确保对应的样本序号一致
sortSamNo=samNo(IX);           % 排序后与关联度对应的样本序号
figure;
subplot(2,1,1);
plot(P,'--rs',...
    'LineWidth',2,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor','g',...
    'MarkerSize',10);
xlim([1 r]);   % 设置x轴范围
xlabel('样本序号','FontSize',12,'FontWeight','bold');
set(gca,'xtick',1:r);
set(gca,'XTickLabel',samNo,'FontWeight','light');
ylabel('关联度','FontSize',12,'FontWeight','bold');
title('XXX事物灰色关联度综合评价结果');
grid on;
 
subplot(2,1,2);
plot(sortP,'--rs',...
    'LineWidth',2,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor','g',...
    'MarkerSize',10);
xlim([1 r]);   % 设置x轴范围
xlabel('样本序号','FontSize',10,'FontWeight','bold');
set(gca,'xtick',1:r);
set(gca,'XTickLabel',sortSamNo,'FontWeight','light');
ylabel('关联度','FontSize',10,'FontWeight','bold');
title('XXX事物灰色关联度综合评价结果(降序排列)');
grid on;
hold off;
 
end

丝绸之路是古代中西方文化交流的通道,其中玻璃是早期贸易往来的宝贵物证。早期的玻璃在西亚和埃及地区常被制作成珠形饰品传入 我 国, 我 国古代玻璃吸收其技术后在本土就地取材制作,因此与外来的玻璃制品外观相似,但化学成分却不相同。玻璃的主要原料是石英砂,主要化学成分是二氧化硅(SiO2)。由于纯石英砂的熔点较高

为了降低熔化温度,在炼制时需要添加助熔剂。古代常用的助熔剂有草木灰、天然泡碱、硝石和铅矿石等,并添加石灰石作为稳定剂,石灰石煅烧以后转化为氧化钙( CaO)。添加的助熔剂不同,其主要化学成分也不同。例如,铅钡玻璃在烧制 过程 中加入铅矿石作为助熔剂,其氧化铅( PbO)、氧化钡 BaO 的 含量较高,通常被认为是我国自己发明的玻璃品种,楚文化的玻璃就是以铅钡玻璃为主。钾玻璃是以含钾量高的物质如草木灰作为助熔剂烧制而成 的 ,主要流行于我国 岭南以及东南亚和印度等区域。

古代玻璃极易受埋藏环境的影响而风化。在风化过程中,内部元素与环境元素进行大量交换,导致其成分比例发生变化, 从而 影响对其类别的正确判断。如图 1的文物标记为表面无风化,表面能明显看出文物的颜色、纹饰,但不排除局部有较浅的风化;图 2的 文物标记为表面风化,表面大面积灰黄色区域为风化层,是明显风化区域,紫色部分是一般风化表面。在部分风化的文物中,其表面也有未风化的区域。

2022数学建模国赛C题详细思路:基于随机森林和灰色关联度分析_第1张图片

图1 未风化的蜻蜓眼玻璃珠样品

2022数学建模国赛C题详细思路:基于随机森林和灰色关联度分析_第2张图片

​图 2 风化的玻璃棋子样品

现有一批我国古代玻璃制品的相关数据 考古工作者依据这些文物样品的化学成分和其他检测手段已将其分为高钾玻璃和铅钡玻璃两种类型。 附件 表单 1给出了这些 文物的分类信息,附件 表单 2给出了 相应的主要成分所占比例(空白处表示未检测到该成分)。这些数据的特点是成分性,即各成分比例 的 累加和应为 100%,但因检测手段等原因可能导致其成分比例 的 累加和非 100%的情况 。 本题中将成分比例累加和介于 85%~105%之间的数据视为有效数据。

请你们团队依据附件中的相关数据进行分析建模,2022数学建模国赛,解决以下问题:

问题1 对这些玻璃文物 的 表面风化与其玻璃类型、纹饰和颜色的关系进行分析;结合玻璃的类型,分析文物样品表面 有无 风化化学成分含量的 统计 规律 并根据风化点检测数据,预测其风化前的化学成分含量 。

问题2 依据附件数据分析高钾玻璃、铅钡玻璃的分类规律;对于每个类别选择合适的化学成分对其进行亚类划分,给出具体的划分方法及划分结果 并对分类结果的合理性和敏感性进行分析 。

问题3 对附件表单 3中未知类别玻璃文物的化学成分进行分析,鉴别其所属类型 并对分类结果的敏感性进行分析。

问题4 针对不同类别的玻璃文物样品,分析其化学成分之间的关联关系,并比较不同类别之间的化学成分关联关系的差异性 。

附件

表单1 玻璃文物的基本信息

表单2 已分类玻璃文物的化学成分比例 ,其中

(1) 文物采样点为该编号文物表面某部位的随机采样,其风化属性与附件表单 1中相应文物一致。

(2) 部位 1和部位 2是文物造型上不同的两个部位,其成分与含量可能存在差异。

(3) 未风化点是风化文物表面未风化区域内的点。

(4) 严重风化点取自风化层。

表单3 未分类玻璃文物的化学成分比例

思路分析

问题1 对这些玻璃文物 的 表面风化与其玻璃类型、纹饰和颜色的关系进行分析;结合玻璃的类型,分析文物样品表面有无风化化学成分含量的统计规律并根据风化点检测数据,预测其风化前的化学成分含量 。

问题1使用微分方程模型,建立风化过程中化学成分含量的微分方程模型,(可以参考放射性元素微分方程模型类似建模)

问题2 依据附件数据分析高钾玻璃、铅钡玻璃的分类规律;对于每个类别选择合适的化学成分对其进行亚类划分,给出具体的划分方法及划分结果 并对分类结果的合理性和敏感性进行分析 。

问题2需要对于每个类别选择合适的化学成分对其进行亚类划分,使用随机森林算法划分亚类

特征工程

"""
特征工程:
    特征抽取:
        字典特征抽取
        文本特征抽取
    特征预处理:
        归一化
        标准化
        缺失值处理
    特征降维:
        过滤式
        主成分分析
"""

import numpy as np
import pandas as pd


# ndarray与dataframe之间的相互转换
def nd_da():
    data = [[1, 2], [4, 5], [7, 8]]
    print(type(data))
    print("列表:", data)

    # 列表转ndarray
    nd_data = np.array(data)
    print(type(nd_data))
    print("ndarray:", nd_data)

    # ndarray转dataframe
    da_data = pd.DataFrame(nd_data)
    print(type(da_data))
    da_data.columns = ["a", "b"]
    da_data.index = ["A", "B", "C"]
    print("DataFrame:", da_data)

    # dataframe转ndarray
    np_data = np.array(da_data)
    print(type(np_data))
    print(np_data)


# 字典特征抽取:针对特征值是非数值型的特征,进行one_hot编码
from sklearn.feature_extraction import DictVectorizer

问题3 对附件表单 3中未知类别玻璃文物的化学成分进行分析,鉴别其所属类型并对分类结果的敏感性进行分析。

问题3根据问题2建立的随机森林模型,预测划分所属类型

问题4 针对不同类别的玻璃文物样品,分析其化学成分之间的关联关系,并比较不同类别之间的化学成分关联关系的差异性 。

2022数学建模国赛C题详细思路:基于随机森林和灰色关联度分析_第3张图片

问题4分需要析其化学成分之间的关联关系,可以使用灰色关联度分析

   # 特征预处理
    # 查看有没有缺失值
    print(pd.isnull(feature).any())
    # 填充缺失值
(见文末地址)

    # 字典特征抽取
    dv = DictVectorizer()
    feature = dv.fit_transform(feature.to_dict(orient="records"))
    feature = feature.toarray()
    print(feature)
    print(dv.get_feature_names())

    # 划分数据集
    x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.25)
    print("训练集:", x_train.shape, y_train.shape)
    print("测试集:", x_test.shape, y_test.shape)

    # 建立模型
    rf = RandomForestClassifier()

    # 超参数搜索
    param = {"n_estimators":[10, 20, 30, 40], "max_depth":[25, 35, 45]}
    gc = GridSearchCV(rf, param_grid=param, cv=5)

    # 训练
    gc.fit(x_train, y_train)

    # 交叉验证网格搜索的结果
    print("在测试集上的准确率:", gc.score(x_test, y_test))
    print("在验证集上的准确率:", gc.best_score_)
    print("最好的模型参数:", gc.best_params_)
    print("最好的模型:", gc.best_estimator_)

灰色关联度,完整代码见文末

% 第三步:求差序列
for i=1:m
    for ii=1:k
      X0(i,ii)=abs(x0(ii)-X(i,ii));
    end
end

% 第四步:求两极差
Max=max(max(X0));  
Min=min(min(X0));

% 第五步:求关联系数
for i=1:m
    for ii=1:k
      R0(i,ii)=(Min+0.5*Max)/(Min+0.5*Max+X0(i,ii));
    end
end

完整思路和代码地址:正在为您运送作品详情

你可能感兴趣的:(随机森林,算法,机器学习,线性代数,人工智能)