python实现学生成绩聚类分析,如何评判聚类的结果
1 聚类算法简要介绍
1.1什么是集群?
聚类是机器学习中一种重要的无监督算法,可以将数据点归纳成一系列特定的组合。聚类算法可以将数据点分成不同的类,揭示数据集中蕴含的未知规律,指导我们的生产和生活。简单来说,聚类就是把对象分组,把相似的对象分组在一起。其实我对聚类不太熟悉。我们常说“物以类聚,人以群分”。
1.2聚类算法的应用场景
当聚类是一个单独的过程时,用来寻找数据本身的“分布结构”规律。例如,cluster可以通过结合已知移动客户的位置数据,为新的连锁餐厅的位置提供参考。
聚类可以用于监控学习前期的数据准备,也可以用于后期的数据进一步细化。
2 通俗地讲聚类算法的过程
聚类算法是一种典型的无监督学习算法,其中K-means算法是最典型的算法。K-means算法需要预先设定聚类数K,不断更新聚类中心,直到算法收敛或达到预设阈值。K-means算法的过程总结如下。
(1)从包含n个点的数据集中随机选取k个对象作为初始聚类中心。
)2)计算从1)中设置的K个聚类中心到每个数据点到这些K个中心的距离。
(3)在步骤(2)的距离计算之后,每个数据点具有距K个聚类中心的距离值。这些远近的将数据点分类为离它最近的聚类中心。
(4))之后,数据集被分类成K个聚类。
(5)重复(步骤)和(4)直到分类稳定或分类变化小。
2.1相似度用距离来衡量。
聚类是以数据的相似性为基础,按照类内数据相似性大,类间相似性小的方式划分为多个类。这种“相似”是用距离来表示的。距离越大,相似度越小,距离越小,相似度越大。最常见的距离是“一本亮书的距离”:
)当时亮的书《不等式》是高中数学中的距离,也就是欧洲距离。
)当时的亮书不等式是曼哈顿距离。
(3)当时的亮书不等式是yjfdj距离。
2.2如何衡量集群性能?
有两种方法来评估性能。
(1)数据集包含标签信息。数据可能包含标签信息,但原始数据包含正确的分类信息。但是在对数据进行聚类时,可以考虑使用调整wndrg系数的指标[ari]。ARI类似于监督学习的精度,可以通过sklearn模块的metrics调用。
)2)数据不包含标签信息。如果不包含属于数据集的类别信息,可以考虑轮廓因子来评价聚类效果。稍后将描述轮廓系数。一般来说,轮廓系数越大,聚类效果越好。可以通过调用sklearn模块metrics中的silhouette_score来实现轮廓系数。
2.3具体算法介绍:K-means算法
K-means算法是最简单最常用的聚类算法,其算法流程如下。
(1)随机选取数据集中的K个初始点作为聚类中心。
)2)对于数据集的每个点,)在1)中找到最近的聚类中心,将数据集的最近中心赋给该聚类中心对应的聚类。
(3)通过(2)后,将原始数据集分类为K个聚类。此时,计算每个聚类的平均值,并将该平均值作为新的聚类中心。
(4)转到步骤(5)和(6)和(3),无变化或变化不大时关闭聚类中心。
K-means算法随机选择K个初始聚类中心。一个自然的问题是,不同的初始聚类中心不影响最终的聚类结果。答案是肯定的。在实际问题中,根据具体的实际问题选择一个合理的k值是合理的。
仔细考虑K-means算法的过程,随机选取K个点作为初始聚类中心确实会影响聚类结果。这也是K-means算法的缺陷。因此,K-means算法改善了这个问题。
2.4具体算法介绍:K-means算法
针对K-means算法随机选取K个初始点的问题,孤独白猫等人在2007年提出了K-means算法。K-means解决这个问题的中心思想是初始聚类中心不是随机选取的,而是我们想知道K个初始聚类中心尽可能的远。整个算法过程如下。
1)随机选择一个初始点作为第一个聚类中心,为了便于描述,记为点A。
)2)首先计算除A点和A点之外的所有数据点之间的距离,并表示如果数据集包含n个点,则得到的距离值应为n-1。其次,剩下的n-1个点成为下一个聚类中心的概率。
(2)计算每个数据点与当前已有聚类中心中最近的聚类中心之间的距离。(2)开始时,聚类中心只有A点,step) (2)。然后计算数据点被选到下一个聚类中心的概率P(P的计算是(2)已经给定的)。
3)通过轮盘赌方法选择下一个簇。
心。(轮盘赌法是什么?我们以后再谈。)
(4)重复步骤(2)和(3)直到K个聚类中心被选择。
(5)K个聚类中心选定后,可以使用经典的K-means算法。
下面,举个简单的例子来熟悉一下上面的流程:
假设我们有一个数据集。为了方便采用二维点集,数据集中有8个样本,如下图所示:
首先,随机选择一个初始聚类中心。我们不妨选择点1,那么选择第二个聚类中心的计算过程如下表所示:
K-means样本数据序列号123456780000.3140,其中数据与最初选择的第一个聚类中心1号点之间的距离表示该数据点被选为下一个聚类中心的概率,即概率的累积值。通过轮盘赌方法选择下一个聚类中心:
首先确定每个数据点的区间,比如2号点的区间为[0.034,0.102],3号点的区间为[0.102,0.136],4号点的区间为[0.136,0.178],以此类推。接下来,生成一个介于0和1之间的随机数,该随机数在哪个区间,对应的数据点被选为第二聚类中心。
当K个聚类中心的选择完成后,可以使用经典的K-means算法。
3 机器学习库sklearn实战——K-means算法
为了方便起见,使用sklearn.datasets.make_blobs()来生成聚类所需的数据。make.blobs()函数可以根据指定特征变量个数、聚类中心个数等参数生成指定类别的数据。用于测试聚类算法的效果。make.blobs()的参数语句可以查询相关信息。
首先,导入所需的包:
import numpy as NP import pandas as PD import matplotlib . py plot as PLT from sk learn . cluster import kmeans from sk learn . datasets import make_blobs from matpl ot . font _ manager import字体属性使用make _ blobs生成聚类的示例数据:
#样本数据量为300,聚类数为4,每个聚类中样本的标准差为0.50,x,y=make _ blobs (n _ samples=300,centers=4,cluster _ std=0.50,random _ state=0) # x: 300行2列数据根据生成的样本数据,
#遍历从1到10的类簇个数,以便后面找到K的合适值:list1=[] for I in range (1,11): kmeans=kmeans (n _ clusters=i,init= k-means ,max _ iter=300,n _ init=10,Random_state=0) #初始化聚类中心的方式为k-means,最大迭代次数为300,算法运行10次, 且随机数种子为0 kmeans.fit(X) #训练数据list1.append(kmeans.inertia_) #将每次训练数据循环到列表中时聚类得到的每个聚类的误差平方和相加即可看到列表。
Print(第十个结果的误差平方和:,list1)# Running result:第十个结果的误差平方和:[1000] .20000.000000000004另一方面,为了图形的可视化,相关的标签用中文和负号显示,需要尽量做pyplot支持. 49606 . 4866666676
PLT。RC params[ font . sans-serif ]=[ sim hei ]PLT。RC params[ axes . unicode _ MINUS ]=false此处开始绘制误差随k (1~10)值变化的图像:
Plt.ylim(0,max(list1)) #设置Y轴Plt的范围. xlim(0,11) #设置X轴plt的范围。Plot (range (1,11),list1,c= r )。标题(“k误差曲线”)PLT.
从图中可以看出,当k为4时,上述曲线的拐点出现,此后曲线的下降幅度很小。因此,考虑K=4的聚类:
K=4的cluster:new _ K means=K means(n _ clusters=4,init= k-means ,max _ iter=300,Random _ state=0)result_y=new _ K means . fit _ predict(x)#特征数据的聚类结果存储在result _ y中, 打印(结果y) #打印测试# 结果:[0 21 200 3 1 2 3 2 2 2 1 1 1 0 3 0 3 3 1 0 1 3 1 3 1 2 2 3 1 3 1 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 3 2 3 3 3 3 2 3 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 2 3 3 2 3 2 3 2 3 2 3 3 2 3 3 2 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 1 0 2 0 1 0 0 2 1 0 1 2 2 1 0 2 3 3 1 0 0 1 3 2 0 2 0 1 0 0 1 2 1 3 3 0 2 0 1 2 0 0 1 3 0 3 0 0 0 0 3 0 3 2 3 3 0 2 3 3 2 1 2 2 3 1 3 1 3 2 1 2 2 2 1 2 1 0 3 2 3 0 1 2 1 1 0 1 3 3 1 0 1 1 2 0 1 3 2 0 0 1 3 0 1 3 3 1 1 1 1 0 2 1 3 1 1 3 3 3 1 3 2 1 3 0 3 1 2 3 2 1 2 1 3 1 1 2 3 3 0 0 1 2 0 0 3 0 1 2 2 1 2 1 0 3 3 3 3 0 1 0 2 2 2 3 3 3 3 3 3 3 3 0 2 1 3 3 3 1 3 3 3 3 3 1 0 1 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2
d enter=new _ k means . cluster _ centers _ # cluster center print( cluster center:,denters) # print test #运行结果:cluster center:[[1.99469693 0.8727049][0.95415778 4.3985544][-1.354]
#画个图:FIG=PLT。FIG (FIG size=(90,8)) AX1=PLT。支线剧情(131) AX1。Scatter (x [:0],x [:1]) AX1。散点图(D输入[:0])
操作结果如下图所示:
从图像中可以看出,K=4时聚合效果更好。
当然,在选择k时,并不局限于上述方法。也可以使用sklearn模块metrics中的函数adjusted_rand_score计算ARI,找到合适的k进行聚类。然而,应该注意的是,该方法仅在数据集包含正确的分类标签时才适用。当数据集不包含分类标签时,除上述方法外,还可以根据轮廓系数与K变化关系选择合适的K值,当轮廓系数最大时,对应最合适的K值。轮廓系数可以通过sklearn库中的metrics中的silhouette_score函数来计算。上面提到的sklearn.metrics中的两个函数,参数语句可以在相关资料中找到,这里就不展开解释了。
学习python两个月了,对Python的数据分析和机器学习很感兴趣。我想借此机会分享我的收获,并与您交流相关方面。这篇论文肯定有很多不足之处。希望大家能给我提意见。
在撰写本文的过程中,主要参考了以下资料:
1.《Python数学实验与建模》 ——重庆石材有限公司
2.《Python数据分析从入门代实践》 ——jydfs、mrdl
3.《从0开始机器学习的数学原理和算法实践》 ——zddfh
4.《Scikit-learn机器学习详解》 ——zydm,真正的店员
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。