| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 2021高教社杯E题 -> 正文阅读 |
|
[人工智能]2021高教社杯E题 |
参考文献
本人专挑数据挖掘、机器学习和 NLP 类型的题目做,有兴趣也可以逛逛我的数据挖掘竞赛专栏。 如果本篇博文对您有所帮助,请不要吝啬您的点赞 😊 赛题官网:http://www.mcm.edu.cn/html_cn/node/4d73a36cc88b35bd4883c276afe39d89.html 文章目录第一题第1题旨在根据附件一给出的不同编号的药材的中红外谱数据,研究药材的种类。意思已经很明显了,就是一个聚类的问题。 传统的聚类算法在这个问题中是不适用的原因在于:在中红外谱数据中,每个药材的数据(每一行),以其说可以看成一个点,不如说可以看成一条线,这是一个线的聚类问题,而非点的聚类问题。 因此如果用碘的聚类去解决,就会导致“点”的维度太多,而数据量较少,导致聚类的效果不好。另一方面,附件一中的数据已经帮我们标准化过了,并且每一列的数据的量纲都是相同的,因此我们不能直接套用点的聚类去解决这个问题。 当然我们可以结合点的聚类来进行线的聚类,为了更好的阐述,我们首先简要地介绍一下,点聚类的常见方法: Kmeans 聚类方法 Kmeans 聚类这里采用的 Kmeans 聚类算法如下: 1、 选择一个聚类簇数?K 2、 从数据集中任意地选出个?K?个点,作为聚类中心 ????3、 求出数据集中的每个点与这?K?个聚类簇的距离,并根据与聚类簇距离的远近,将数据划分成?K?个子数据集 ????4、 将?K?个子数据集的均值作为新的聚类中心 ????5、 重复步骤?3、4,直到聚类簇不发生变化为止 \begin{aligned} \text{1、}& \text{选择一个聚类簇数 K} \\ \text{2、}& \text{从数据集中任意地选出个 K 个点,作为聚类中心} \\ \text{~~~~3、}& \text{求出数据集中的每个点与这 K 个聚类簇的距离,并根据与聚类簇距离的远近,将数据划分成 K 个子数据集} \\ \text{~~~~4、}& \text{将 K 个子数据集的均值作为新的聚类中心} \\ \text{~~~~5、}& \text{重复步骤 3、4,直到聚类簇不发生变化为止} \\ \end{aligned} 1、2、????3、????4、????5、?选择一个聚类簇数?K从数据集中任意地选出个?K?个点,作为聚类中心求出数据集中的每个点与这?K?个聚类簇的距离,并根据与聚类簇距离的远近,将数据划分成?K?个子数据集将?K?个子数据集的均值作为新的聚类中心重复步骤?3、4,直到聚类簇不发生变化为止? 距离表示若采用上述的聚类算法,我们可以看到最关键的一步是如何表示数据集中的每个点与聚类簇的距离: 数据分析为了更好的分析数据,我们首先将数据进行可视化。当然将所有附件一中的药材的红外谱图画出来是有点不现实的,因此我们挑出编号为0 100 200 300 400的5个药材来展示,其药材的中红外谱图如下所示: 从上图可以看出药材 200 很明显与其他药材的差距是很大,这是因为药材 200 的吸光度曲线,与其他药材的吸光度曲线的 "距离” 太大了。 积分法表示距离对于直线来说距离比较好求,但对于曲线来说,距离应该如何定量表示呢? 这里可以考虑采用积分的方法: 鱿鱼我们没有曲线的具体表达式,因此只能用数值积分来求解,但是鉴于 X 轴的数据点间隔比较大,进行积分时产生的误差就会较大。因此在进行积分之前,我们可以采用三次插值法,进行数据填充,从而提高积分的精度。 Kmeans 聚类法对曲线进行聚类如上所述,我们可以采用 Kmeans 聚类法对曲线进行聚类,同时用上述的积分法求解的距离,作为划分子数据集,从而产生不同的聚类簇,聚类中心由子数据集的所有数据的均值产生。 很多时候,采用 Kmeans 进行聚类,会因为聚类中心的初始化,导致在划分子数据及时,有些聚类中心会没有用到。例如选定的聚类簇数 K,很有可能因为聚类中心的初始化不当,导致仅划分出了 K-1 各个子数据集。另外选择一个较好的初始化聚类中心,也可以提高算法的迭代效率,这里采用的一种初始化聚类中心的方法如下所示: Elbow 法选择聚类簇数采用 Kmeans 方法进行聚类11个比较困难的点在于聚类簇数的选择上,虽然聚类簇数的选择具有一定的主观性,但是我们可以借助一些方法,来帮助我们选择一个较好地聚类簇数 K。 这里我们遍历 K = { 1 , 2 , ? ? , 21 } K=\{1,2,\cdots, 21\} K={1,2,?,21},并求出每一个 K 下,数据集与其各自的聚类中心的距离之和,如下图所示: 根据 Elbow 图的拐点原则,可以选择 K=4,8,12,16 作为聚类簇数。考虑到距离之和越小聚类的效果越好,因此这里选择 K=8 作为最终的聚类簇数。 第一问求解综上所述,我们选择 K=8 的 Kmeans 聚类法,对附录 1 中的数据进行聚类,最终得出 8 个聚类中心如下所示: 实际上从上图也可以看出,将聚类簇数设置为 K=2 会好一点,我们在求解 K=2 的情况,得出各聚类中心的中红外谱图如下所示: K=8 时,在我们的结果中,子数据集 k=0 也就是聚类簇 0 的数量占了绝大部分,其他聚类簇包含的数据量仅仅为 1~2 个!所以可以认为,附件一中包含的药材种类大致有8种档,其中有一种占了绝大部分,其红外光谱图的特性,如上图的蓝色曲线所示(K=8时),这里就不再多做赘述了。 缺点与改进该算法的缺点分析上述聚类得出某一聚类簇包含的数据量及占绝大多数,这实际上可能意味着聚类的效果并不好!笔者亦调整了距离的计算公式,如用:
改进方法如果真的要改进,应该破而后立,不能再用这种以积分的形式表示距离,从而采用点聚类的方法来聚类曲线。我们可以考虑传统的点聚类方法,然后将每一段波数的数据采用均值等方式合并成一列,从而降低数据量,在采用点距类的方式进行聚类即可。 虽然这样做也会造成一些细节无法体现,但考虑到同一个药材的情况下,波数 x x x 附近的波数区间 [ x ? δ , x + δ ] [x-\delta, x+\delta] [x?δ,x+δ] 的吸光率是非常接近的,因此这些细节忽略了也影响不大,所以可以这么做。 博主这里没有实现这种改进方法,各位聪明的读者可以根据我的代码,自己实现一个。 第二题(第三题、第四题)说实话,这一题我想了很久,因为像这种比赛的话,一般是第1题要作为第2题的基础的。但我们第一题,采用了曲线聚类的方法,难以分析出各波段的特征。理想的第1题的解法应该是考虑并分析各波段的数学特性,再来进行聚类;或者将数据进行降维,再来进行聚类。于是第2题可以在第1题的基础上进行数据降维,于是问题二并可以作为一个机器学习的经典问题——分类问题来解决。 所以我们在第2题中考虑,先考虑将数据进行降维。在此之前,我们先用上述曲线锯类的方法,对附件2的数据进行一番分析吧。 聚类分析选择聚类簇数为 K=9,对附件2的数据进行聚类,得到9个聚类中心,如下图所示: 根据聚类结果来看,依旧是聚类簇 0 占了绝大部分数据。从上图来看,聚类中心 0 比较棱角鲜明,因此我们也可以猜到大部分的药材都是差不多跟聚类中心 0 一样的曲线走向的。 另外从上图也可以看出,聚类的几个聚类中心,它们都比较接近,换句话说,这个药材可能是同一种药材,只是因为他们的场地不同导致他们的吸光率不同罢了。 从上图可以看出我们完全可以将数据,作为用于分类问题的机器学习训练数据和测试数据。 数据降维我们对数据进行 PCA 降维,为了观察 PCA 降维后的效果,我们可以采用解释方差占比来衡量。所谓解释方差占比可以定量地衡量,数据在降维前后其相似度,或者信息量的保留程度,当解释方差占比为 1 时,可以证明降维前后数据是等效的。 数据再进行 PCA 降维后,若原始数据(高维度)能够以较少的正交数据(低纬度)完全表示,则数据转换前后原始数据的总方差,欲穷转换后的数据的总方差是相等的。 PCA 降维原理是在于: 设原始数据 X = ( x 1 , x 2 , ? ? , x n ) X=(x_1, x_2, \cdots, x_n) X=(x1?,x2?,?,xn?),转换后的数据为 X ′ = ( x 1 ′ , x 2 ′ , ? ? , x n ′ ) X^\prime=(x_1^\prime, x_2^\prime, \cdots, x_n^\prime) X′=(x1′?,x2′?,?,xn′?),变量 x 1 , x 2 , ? ? , x n x_1, x_2, \cdots, x_n x1?,x2?,?,xn? 的方差为 v 1 , v 2 , ? ? , v n v_1, v_2, \cdots, v_n v1?,v2?,?,vn?。一般都,原始数据的 v i v_i vi? 的大小是无序的,其占比有大有小,很少会出现某个 v i v_i vi? 占了 ∑ v i \sum v_i ∑vi? 的半壁江山的情况。 而 PCA 转换的精髓,就在于转换后 X ′ X^\prime X′ 的,每一个变量的方差 v 1 ′ , v 2 ′ , ? ? , v n ′ v_1^\prime, v_2^\prime, \cdots, v_n^\prime v1′?,v2′?,?,vn′? 之和与 ∑ v i \sum v_i ∑vi? 相等,但往往 v 1 ′ v_1^\prime v1′? 会占 ∑ v i ′ \sum v_i^\prime ∑vi′? 的一大半,一般超过 50%,甚至超过 80%(如本例)。 换句话说,经过 PCA 降维后,前 k 个变量的数据的方差占比很高,这意味着这几个变量已经覆盖了原始数据的大部分信息量,因此可以考虑仅保留这 k 个变量,其余删除即可。 我们对数据进行 PCA 降维,保留
k
=
{
1
,
2
,
?
?
,
10
}
k=\{1, 2, \cdots, 10\}
k={1,2,?,10} 个变量,并观察保留下来的变量的方差之和,占原始数据的方差总和之比: 从上图可以看出,我们可以保留 6 个变量就可以了。但考虑到数据量有600多个,还是蛮多的,因此可以考虑保留较多的信息量,于是本文保留了 9 个变量。 机器学习方法解决分类如上所述,根据附件 2 的数据,识别下述的药材编号的药材产出地:
而附件 2 给出了许多药材对应的中红外谱数据,以及药材对应的产出地。因此这是一个机器学习中的分类问题,我们采用机器学习就可以解决了。 筛选模型参数鉴于数据量比较充足,我们就不用进行特征过滤了。不过,根据
其中随机森林的基模型是最大深度为 5 的决策树,AdaBoost 的基模型是逻辑回归。 为了筛选参数,首先需要构建一个参数网格,如下所示:
(鉴于逻辑回归,朴素贝叶斯分类器不需要进行参数选择,这里并不考虑) 采用 5 折交叉验证、配合网格参数,以 F1 值为目标,最后筛选出各模型的参数如下:
F1 值(补充介绍)这里一个需要注意的是采用 F1 值来评价模型或模型参数时,首先是其计算公式: 但细心的读者应该已经注意到了,上述的讨论都是基于阴性阳性这种二分类问题进行的。而我们的题目,很明显是一个多分类问题,OP 一共有 11 个,因此在使用的时候需要对上述的公式进行一定的调整。 多分类问题的评价指标介绍如前所述要将二分类问题的分类指标用于多分类问题需要进行一定的调整。设多分类问题中 y y y 共有 N 个取值,即有 N 个类别,那么按照类别将数据集拆分为 N 个子数据集,设模型的预测结果为 y ^ \hat{y} y^?,我们以具体实例解释:设 y y y的取值为 {1,2,3},实际数据集与模型的预测结果如下表所示:
我们根据
y
y
y 将数据集拆分为三部分,对于误分类的我们都将其归为 F,正确分类的为 T,于是对于每一个子数据集,可以得到: 筛选最佳模型我们采用网格寻优法找到各模型的最佳参数之后,将数据集按 7:3 拆分为训练集和测试集,将模型在训练集中训练并计算相应的 F1 值,从而观察模型的训练效果;再将训练好的模型应用于测试集中,计算模型在测试集中的 F1 值,结果如下所示:
综合考虑的话,从上面的7个模型来看,很明显 kNN 算法、决策树、随机森林过拟合了;而 AdaBoost、逻辑回归、贝叶斯分类器有些欠拟合,只有 SVC 还勉强可以用。 我们采用精确度准确率和召回率来评价模型,可得:
预测结果如下所示: 深度学习:多层感知器模型解决除了机器学习之外,我们还可以用深度学习的方法来解决这个分类问题,这里采用一种比较简单的深度学习模型——多层感知器来解决附录 2 中的分类问题。 特征预处理待采用深度学习进行分类问题时,由于附件二中给出的药材种类共有11种,很明显,不是一个双分类问题。直接将次序变量直接用鱼深度学习模型的训练中是无法实现的,因此在训练模型之前,我们需要对数据进行 one-hot 编码法,将次序变量转换为11个二值变量,如下所示: 模型训练与结果多层感知器的网络拓扑结构如下所示:
我们以交叉熵为损失函数,以 Adam 为优化算法,用精确度(Accuracy)评价模型,并设置训练步数为 500,梯度下降时用于计算的 batch_size 数量为 100 个数据,训练上述的模型,并计算模型在训练集和测试集中的精确度,得到模型的精确度与训练次数关系图如下所示: 我们从上图中选择测试集中精确度最大的 epoch 对应的参数,作为模型最终的参数,并求出最佳模型的效果:
最终得出的分类结果如下: 大家可以自行对比一下机器学习和多层感知器得出的分类结果。 第三题、第四题其实从第2题中就可以引申到第3题和第4题,因此这里就不实现了,大致的讲一下思路吧。 首先是第3题的中红外数据,这完全可以用第2题来求解。当在求解之前,需要考虑的一个点在于:将数据采用问题一的曲线聚类方法进行聚类,并画出聚类中心,观察各聚类中心的差距大不大,如果各聚类中心的差距并不大,就像第2题一样,那么可以考虑,附件3给出的中红外数据的药材,属于同一类型,只是产出地不同(OP)而已,我们套用第2题的机器学习方法或者深度学习方法就可以解决。 假设聚类出来的,结果各聚类中心曲线的差别比较大,那么意味着附件三中给出的药材不仅是产出地不同,而且还有可能不属于同一种类。此时可以考虑将不同的聚类簇数据单独提取出来,在采用问题2的方法逐个击破,确保用问题二进行深度学习或机器学习分析时,数据集中的药材是属于同一种类的。 对于近红外光谱数据也是一样。 其次是第4题,第4题要求我们根据所给出的数据,对药材的种类和产出地进行分类,这实际上也是一个分类问题,不同的一点在于这是一个多标签分类,它有两个分类标签,也即药材的种类和产出地。这两个标签都是次序变量,因此在进行 one-hot 编码时,无论次序变量有多少个,我们都可以将其转换为多个二值变量进行替代,因此说到底,我们可以用问题 2 中的深度学习方法来解决问题 4。 另一种方法是将药材的种类和产出地拆分出来,然后用问题二中的深度学习方法或机器学习方法单独对待。 代码与提问若需要代码,请点赞,关注、私信、说明题目和年份 如果有其他问题,请到评论区留言,私信提问,概不回答。也在此鼓励大家独立思考。 本人不会回访,不互关,不互吹,以及谢绝诸如此类事 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 8:30:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |