• A9.玻璃制品的成分分析与鉴别-分析与讨论


    2022年数学建模国赛(A题/B题/C题)评阅要点



    1. 更新讨论

    讨论只能点到为止。愿意思考的同学,可以琢磨一下。没有看懂的同学,就当我无知乱说好了。

    1.1 题目读几遍都不多

    1. “空白处表示未检测到该成分”

    未检测到该成分,能否理解为不含该成分,即含量为 0?

    2. “各成分的累加之和应为 100%,但可能导致成分比例累加和非 100%”

    如果成分比例累加和非 100%,是否需要进行归一化处理?

    3. “将成分比例累加和介入 85~105%之间的数据视为有效数据”

    有没有在此区间之外的数据,如何处理?

    4. “对表面风化与玻璃类型,纹饰和颜色的关系进行分析”
    • 逐一分析,还是综合分析?
    • 如果综合分析,其中有些行的颜色数据缺失,如何处理?
    5. “根据风化点检测数据,预测风化前化学成分含量”
    • 初看无从着手,其实有很多方法,当然都要做一定的假设。
    • 采用什么方法,如何假设,取决于读者,但假设要相对合理。
    6. “分析高钾、铅钡的分类规律。”
    • 其实不用建模都能说清楚,当初分类时显然不是通过数学建模,而是人为总结规律进行分类的
    • 这是比较简单的二分类问题,所有数据往模型里一装就能得到结果。但是,这样做合理吗?
    7. “亚类划分,对合理性和敏感性进行分析”
    • 分几类,如何分类?这是分类问题,还是聚类问题?真的吗?
    • 亚类划分的合理性,有标准答案吗?中国古代分几个阶段?
    • 亚类划分的敏感性,这是指什么?用什么指标来反映敏感性?
    • 按照数学建模方法,基于合理性和敏感性划分的亚类,真的科学合理吗?此问跑题了。

    先聊到这里,有兴趣的同学,点赞收藏,我今晚或明天可以再更新一下。


    2. 算法讨论

    2.1 基本分析:分类问题+聚类问题+预测问题


    2.2 聚类问题参考例程—只供参考,非赛题解答

    Python数模笔记-Sklearn(2)聚类分析 Python数模笔记-Sklearn (2)聚类分析


    Kmeans 聚类例程:
    
    # Kmeans_sklearn_v1d.py
    # K-Means cluster by scikit-learn for problem "education2015"
    # v1.0d: K-Means 聚类算法(SKlearn)求解:各地区高等教育发展状况-2015 问题
    # 日期:2021-05-10
    
    #  -*- coding: utf-8 -*-
    import numpy as np
    import pandas as pd
    from sklearn.cluster import KMeans, MiniBatchKMeans
    
    # 主程序 = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
    def main():
        # 读取数据文件
        readPath = "../data/education2015.xlsx"  # 数据文件的地址和文件名
        dfFile = pd.read_excel(readPath, header=0)  # 首行为标题行
        dfFile = dfFile.dropna()  # 删除含有缺失值的数据
        # print(dfFile.dtypes)  # 查看 df 各列的数据类型
        # print(dfFile.shape)  # 查看 df 的行数和列数
        print(dfFile.head())
    
        # 数据准备
        z_scaler = lambda x:(x-np.mean(x))/np.std(x)  # 定义数据标准化函数
        dfScaler = dfFile[['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']].apply(z_scaler)  # 数据归一化
        dfData = pd.concat([dfFile[['地区']], dfScaler], axis=1)  # 列级别合并
        df = dfData.loc[:,['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']]  # 基于全部 10个特征聚类分析
        # df = dfData.loc[:,['x1','x2','x7','x8','x9','x10']]  # 降维后选取 6个特征聚类分析
        X = np.array(df)  # 准备 sklearn.cluster.KMeans 模型数据
        print("Shape of cluster data:", X.shape)
    
        # KMeans 聚类分析(sklearn.cluster.KMeans)
        nCluster = 4
        kmCluster = KMeans(n_clusters=nCluster).fit(X)  # 建立模型并进行聚类,设定 K=2
        print("Cluster centers:\n", kmCluster.cluster_centers_)  # 返回每个聚类中心的坐标
        print("Cluster results:\n", kmCluster.labels_)  # 返回样本集的分类结果
    
        # 整理聚类结果
        listName = dfData['地区'].tolist()  # 将 dfData 的首列 '地区' 转换为 listName
        dictCluster = dict(zip(listName,kmCluster.labels_))  # 将 listName 与聚类结果关联,组成字典
        listCluster = [[] for k in range(nCluster)]
        for v in range(0, len(dictCluster)):
            k = list(dictCluster.values())[v]  # 第v个城市的分类是 k
            listCluster[k].append(list(dictCluster.keys())[v])  # 将第v个城市添加到 第k类
        print("\n聚类分析结果(分为{}类):".format(nCluster))  # 返回样本集的分类结果
        for k in range(nCluster):
            print("第 {} 类:{}".format(k, listCluster[k]))  # 显示第 k 类的结果
    
        return
    # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
    if __name__ == '__main__':
        main()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    2.3 分类问题参考例程—只供参考,非赛题解答

    Python数模笔记-Sklearn(5)支持向量机 Python数模笔记-Sklearn (5)支持向量机

    说明:支持向量机也可以用于多分类问题。


    分类问题 Python 例程1:LinearSVC 使用例程
    # skl_SVM_v1a.py
    # Demo of linear SVM by scikit-learn
    # v1.0a: 线性可分支持向量机模型(SciKitLearn)
    # Copyright 2021 YouCans, XUPT
    # Crated:2021-05-15
    
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.svm import SVC, LinearSVC
    from sklearn.datasets import make_blobs
    
    X, y = make_blobs(n_samples=40, centers=2, random_state=27)  # 产生数据集: 40个样本, 2类
    modelSVM = SVC(kernel='linear', C=100)  # SVC 建模:使用 SVC类,线性核函数
    # modelSVM = LinearSVC(C=100)  # SVC 建模:使用 LinearSVC类,运行结果同上
    modelSVM.fit(X, y)  # 用样本集 X,y 训练 SVM 模型
    
    print("\nSVM model: Y = w0 + w1*x1 + w2*x2") # 分类超平面模型
    print('截距: w0={}'.format(modelSVM.intercept_))  # w0: 截距, YouCans
    print('系数: w1={}'.format(modelSVM.coef_))  # w1,w2: 系数, XUPT
    print('分类准确度:{:.4f}'.format(modelSVM.score(X, y)))  # 对训练集的分类准确度
    
    # 绘制分割超平面和样本集分类结果
    plt.scatter(X[:,0], X[:,1], c=y, s=30, cmap=plt.cm.Paired)  # 散点图,根据 y值设置不同颜色
    ax = plt.gca()  # 移动坐标轴
    xlim = ax.get_xlim()  # 获得Axes的 x坐标范围
    ylim = ax.get_ylim()  # 获得Axes的 y坐标范围
    xx = np.linspace(xlim[0], xlim[1], 30)  # 创建等差数列,从 start 到 stop,共 num 个
    yy = np.linspace(ylim[0], ylim[1], 30)  #
    YY, XX = np.meshgrid(yy, xx)  # 生成网格点坐标矩阵 XUPT
    xy = np.vstack([XX.ravel(), YY.ravel()]).T  # 将网格矩阵展平后重构为数组
    Z = modelSVM.decision_function(xy).reshape(XX.shape)
    ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])  # 绘制决策边界和分隔
    ax.scatter(modelSVM.support_vectors_[:, 0], modelSVM.support_vectors_[:, 1], s=100,
               linewidth=1, facecolors='none', edgecolors='k')  # 绘制 支持向量
    plt.title("Classification by LinearSVM (youcans, XUPT)")
    plt.show()
    # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    分类问题 Python 例程2:NuSVC 使用例程
    # skl_SVM_v1b.py
    # Demo of nonlinear SVM by scikit-learn
    # v1.0b: 线性可分支持向量机模型(SciKitLearn)
    # Copyright 2021 YouCans, XUPT
    # Crated:2021-05-15
    
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.svm import SVC, NuSVC, LinearSVC
    from sklearn.datasets import make_moons
    
    # 数据准备:生成训练数据集,生成等高线网格数据
    X, y = make_moons(n_samples=100, noise=0.1, random_state=27) # 生成数据集
    x0s = np.linspace(-1.5, 2.5, 100)  # 创建等差数列,从 start 到 stop,共 num 个
    x1s = np.linspace(-1.0, 1.5, 100)  # start, stop 根据 Moon 数据范围选择确定
    x0, x1 = np.meshgrid(x0s, x1s)  # 生成网格点坐标矩阵
    Xtest = np.c_[x0.ravel(), x1.ravel()]  # 返回展平的一维数组
    # SVC 建模,训练和输出
    modelSVM1 = SVC(kernel='poly', degree=3, coef0=0.2)  # 'poly' 多项式核函数
    modelSVM1.fit(X, y)  # 用样本集 X,y 训练支持向量机 1
    yPred1 = modelSVM1.predict(Xtest).reshape(x0.shape)  # 用模型 1 预测分类结果
    # NuSVC 建模,训练和输出
    modelSVM2 = NuSVC(kernel='rbf', gamma='scale', nu=0.1)  #'rbf' 高斯核函数
    modelSVM2.fit(X, y)  # 用样本集 X,y 训练支持向量机 2
    yPred2 = modelSVM2.predict(Xtest).reshape(x0.shape)  # 用模型 2 预测分类结果
    
    fig, ax = plt.subplots(figsize=(8, 6))  
    ax.contourf(x0, x1, yPred1, cmap=plt.cm.brg, alpha=0.1) # 绘制模型1 分类结果
    ax.contourf(x0, x1, yPred2, cmap='PuBuGn_r', alpha=0.1) # 绘制模型2 分类结果
    ax.plot(X[:,0][y==0], X[:,1][y==0], "bo")  # 按分类绘制数据样本点
    ax.plot(X[:,0][y==1], X[:,1][y==1], "r^")  # XUPT
    ax.grid(True, which='both')
    ax.set_title("Classification of moon data by LinearSVM")
    plt.show()
    # = 关注 Youcans,分享原创系列 https://blog.csdn.net/youcans =
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3. 评阅要点

    在这里插入图片描述

  • 相关阅读:
    selenium.chrome怎么写扩展拦截或转发请求?
    栈的概念及用法
    公众号留言功能怎么恢复?评论功能如何开启?
    微商怎么引流客源,谈谈我这些年引流的经验
    力扣第100题 相同的数 c++ 二叉 简单易懂+注释
    超级记忆节目
    Android中使用kotlin进行xutils数据库版本升级
    数字图像处理笔记
    LeetCode1137第N个泰波那契数
    git远程仓库的基本操作及解决远程合并冲突问题
  • 原文地址:https://blog.csdn.net/youcans/article/details/126878752