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()


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 =

分类问题 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 =

3. 评阅要点

在这里插入图片描述

Logo

长江两岸老火锅,共聚山城开发者!We Want You!

更多推荐