首页 > 编程知识 正文

python实现学生成绩聚类分析,python实现聚类算法

时间:2023-05-06 06:06:11 阅读:51950 作者:1285

分层聚类算法所谓壮实的头发、分层聚类,可以从上到下划分大的类别(cluster ),称为分裂法; 也可以自下而上聚合小范畴,称为凝聚法; 但是,普遍使用的是自下而上的凝聚方法。

分裂法:分裂法是初期将所有样本划分为一个聚类,根据一定的标准逐步分裂,直到达到一定的条件或达到设定的分类数。 用算法描述:

输入:采样集合d、集群数或某个条件(通常是采样距离阈值,可以不设定集群数)。

输出:聚类结果

1 .将样本集中的所有样本组合成一个集群; repeat: 2 .在同一个集群(假设为c )上计算两个样本之间的距离,找到最远的两个样本a、b; 3 .将样本a和b分配给不同集群c1和c2; 4 .计算原簇(c )中剩余的其他样本点与a、b之间的距离,如果是dis ) a ) dis ) b ),则将样本点分类为c1,否则分类为c2; util )达到集群数或达到设定条件的凝聚法(凝聚法是指初始每个样本点视为一个集群,因此原始集群的大小等于样本点的数量,达到某个条件或达到设定的分类数用算法描述:

输入:采样集合d、集群数或某个条件(通常是采样距离阈值,可以不设定集群数)。

输出:聚类结果

1 .将样本集中的所有样本点作为一个独立的聚类; repeat: 2 :计算两种集群之间的距离,找到距离最小的两种集群c1和c2; 3 .合并集群c1和c2是一个集群; util :达到集群数量或达到设定的条件图:

类簇间距离的计算方法有许多种:

)1)将两个类中位于最近距离处的两个样本的距离设置为这两个集合的距离。 也就是说,最近两个样本间的距离越小,这两个类别间的相似度越大

2 )将两个集合中最远的两个点的距离作为两个集合的距离

)3)把两个集合中的点和点两个距离全部加起来求出一个平均值,就能得到相对恰当的结果。

关于e.g.u的所有点I和v的所有点j

其中|u|,|v|是簇u和v中元素的个数,也称为UPGMA算法(非加权组平均)法。

)4)取两个距离的中值,与取平均值相比,可以消除各个偏离样本对结果的干扰。

)5)求出各集合的中心点(将集合中所有要素的对应维度相加并除以要素个数的向量),用中心点代替集合求出集合间的距离

实现可以通过世界银行的样本数据集轻松实现。 数据集以标准格式存储在名为WBClust2013.csv的CSV格式文件中。 有80行数据和14个变量。 数据源

将数据分为3个聚类,实现分层聚类后,添加PCA降维并与原始结果进行比较。

from scipy.cluster.hierarchyimportlinkage,dendrogram, flusterimportmatplotlib.pyplotaspltimportpandasaspdimportnumpyasnpdata=PD.read _ CSV (data/WBC lust 2013.CSV ' ) country=list(data(country ) ) data.pop (country ) ) data_zs=1.0*data/data.max ) #规范化# print (data7) PLL method='average ) ) Dendrogram ) mergings,labels leaf _ font _ size=8(PLT.show ) cluster _ assignments=f cluster 4 ) :打印(' cluster ',I,' : ' ) num=1 for index, valueinenumerate (cluster _ assignments ) : if value==I : ifnum %5==0: print ) num=1print ) country [ in deder

return: """ n, m = data.shape for i in range(m): aver = np.sum(self.X[:, i])/n x = np.tile(aver, (1, n)) self.X[:, i] = self.X[:, i]-x def runPCA(self): # 计算协方差矩阵,得到特征值,特征向量 S = np.dot(self.X.T, self.X) S_val, S_victors = np.linalg.eig(S) index = np.argsort(-S_val)[0:self.d] Y = S_victors[:, index] # 得到输出样本集 Y = np.dot(self.X, Y) return Ydata_for_pca = np.array(data_zs)pcaObject=myPCA(data_for_pca,d=2)pcaObject.mean_center(data_for_pca)res=pcaObject.runPCA()# plt.figure(figsize=(9, 7))# plt.title("after pca")# mergings = linkage(res,method='average')# print(mergings)# dendrogram(mergings,labels=country,leaf_rotation=45,leaf_font_size=8)# plt.show()# cluster_assignments = fcluster(mergings, t=3.0, criterion='maxclust')# print(cluster_assignments)# for i in range(1,4):# print('cluster', i, ':')# num = 1# for index, value in enumerate(cluster_assignments):# if value == i:# if num % 5 ==0:# print()# num+=1# print(country[index],end=' ')# print()

原始数据分类后的聚簇:

cluster 1 :Pakistan Nigeria Bangladesh Ethiopia cluster 2 :United States Indonesia Brazil Russian Federation Japan Mexico Germany Turkey Thailand France United Kingdom cluster 3 :China India Philippines Vietnam Egypt, Arab Rep.

PCA降维后的分类聚簇:

cluster 1 :Pakistan Nigeria Bangladesh Ethiopia cluster 2 :China India Philippines Vietnam Egypt, Arab Rep. cluster 3 :United States Indonesia Brazil Russian Federation Japan Mexico Germany Turkey Thailand France United Kingdom

可以看出,分类结果都是一样的。

通过树状图对结果进行可视化

以下为建树数据(以原始数据为例):

[[18. 19. 0.21641882 2. ] [15. 20. 0.32365701 3. ] [ 2. 9. 0.39212766 2. ] [16. 21. 0.45344319 4. ] [ 8. 22. 0.50024778 3. ] [ 4. 10. 0.50648091 2. ] [13. 14. 0.51344362 2. ] [23. 24. 0.58762227 7. ] [ 3. 25. 0.58872577 3. ] [11. 26. 0.64184605 3. ] [ 5. 6. 0.71918707 2. ] [17. 28. 0.72310738 4. ] [ 0. 1. 0.84679303 2. ] [ 7. 12. 0.90714675 2. ] [30. 33. 0.97508395 4. ] [27. 31. 1.00112956 11. ] [29. 32. 1.15491503 5. ] [35. 36. 1.29675568 16. ] [34. 37. 1.76337101 20. ]]

对以上数据解析为:第一列和第二列为聚类簇编号;第三列为两个聚簇之间的距离;第四列为包含的聚簇数量。
其中聚簇间距离的计算为上文提到的第三种方法。

原始数据树状图:

PCA降维后的结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。