目录
摘要
18 层次聚类
18.1 本章工作任务
18.2 本章技能目标
18.3 本章简介
18.4 编程实战
18.5 本章总结
18.6 本章作业
本章已完结!!!
摘要
本章实现的工作是:首先导入20名学生的3科成绩,然后根据优先聚合距离最近的两个数据组的聚类标准,得到由20名学生划分成的不同簇类。
本章掌握的技能是:1、使用 SciPy 包计算欧式距离。2、使用 dendrogram 画出聚类树图。3、使用 matplotlib 包实现数据可视化,绘制热度图。
18 层次聚类
18.1 本章工作任务
采用层次聚类编写程序,根据语文、数学、英语成绩对不同学生进行分层。1、算法的输入是:20名学生的语文、数学和英语成绩。2、算法的模型需要求解的是:任意两个数据集之间的距离。3、算法的结果是:20个数据组被先后聚合,最终逐层聚成一类。
18.2 本章技能目标
掌握层次聚类的原理。
使用Python计算出欧式距离。
使用Python画出聚类树图。
使用Python画出热度图。
18.3 本章简介
层次聚类分析是指:一种分层聚类的方法,对目标数据集使用某种标准,先后进行聚合,直至聚合到最后一层,得到一个由所有数据集逐层聚合成的集合。
层次聚类分析算法可以解决的实际应用问题是:已知20名学生的语文、数学和英语3科成绩(每一个学生的3科成绩相当于一个原始数据组),计算出任意两个数据组之间的距离后,将距离最近的先聚合,得到新的数据组,再计算任意两个数据组的距离,将距离最近的先聚合,以此类推,聚成一类。
本章的重点是:层次聚类分析的理解和使用。
18.4 编程实战
步骤1 引入相关包。引入pandas、numpy,seaborn和matplotlib,命名为pd,np,sns 和 plt。引入linkage、dendrogram 和 AgglomerativeClustering,以指定层次聚类判别相识度方法、画聚类树图和热度图。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
from sklearn.cluster import AgglomerativeClustering
import seaborn as sns
步骤2 显示数据的绝对路径,导入要使用的数据。
import os
thisFilePath = os.path.abspath('.')
os.chdir(thisFilePath)
os.getcwd()输出结果:'D:\\MyPythonFiles'
myData = pd.read_csv('myData_.csv')
myData.head()
输出结果:
步骤3 计算距离关联矩阵,任意两个簇之间的欧式距离,使用single-linkage(即两簇内最近元素的距离)作为组距。
row_clusters = linkage(pdist(myData, metric = 'euclidean'), method = 'single')
num = len(pdist(myData, metric = 'euclidean'))
步骤4 生成聚类的结果。
print(pd.DataFrame(row_clusters, columns = ['row_label1', 'row_label2', 'distance', 'new'], index=['cluster %d'% (i+1) for i in range(row_clusters.shape[0])]))输出结果:row_label1 row_label2 distance new
cluster 1 0.0 17.0 0.000000 2.0
cluster 2 3.0 11.0 0.000000 2.0
cluster 3 2.0 10.0 0.000000 2.0
cluster 4 19.0 22.0 0.000000 3.0
cluster 5 1.0 18.0 0.000000 2.0
cluster 6 6.0 14.0 4.000000 2.0
cluster 7 5.0 15.0 6.928203 2.0
cluster 8 4.0 12.0 9.000000 2.0
cluster 9 13.0 21.0 11.401754 3.0
cluster 10 26.0 28.0 13.000000 5.0
cluster 11 8.0 16.0 14.000000 2.0
cluster 12 7.0 29.0 17.000000 6.0
cluster 13 27.0 31.0 17.058722 8.0
cluster 14 23.0 32.0 19.131126 11.0
cluster 15 20.0 33.0 22.158520 13.0
cluster 16 30.0 34.0 25.019992 15.0
cluster 17 25.0 35.0 26.851443 17.0
cluster 18 9.0 36.0 32.124757 18.0
cluster 19 24.0 37.0 32.202484 20.0
提示:
(1) 聚类树形成的过程:将符合 single-linkage 的两个簇合并为一个新簇,去除合并前的簇,之后迭代进行此过程。当合并到只有一个簇(聚类树的主干)时,迭代完成,聚类结束。
(2) 聚类的结果:row_label1 和 row_label2 表示聚类合并前的两个簇内最近元素,distance 表示合并前两个簇的距离,new 即为新簇内的元素个数。
步骤5 画出聚类树树图。
row_dendr = dendrogram(row_clusters, 1)
plt.tight_layout()
plt.ylabel('Euclidean distance')
plt.show()
输出结果:
提示:
图的横坐标是簇的类别,纵坐标是簇与簇之间的欧式距离(即簇与簇内元素的最近距离),同色的折线表示两个簇合并。
步骤6 画出热度图。
%matplotlib inline
fig = plt.figure(figsize=(12, 13))
axd = fig.add_axes([0.02, 0.138, 0.418, 0.719])
row_dendr = dendrogram(row_clusters, orientation='left')
myData_rowclust = myData.iloc[row_dendr['leaves'][::-1]]
axm = fig.add_axes([0.08, 0.1255, 0.63, 0.75])
cax = axm.matshow(myData_rowclust, interpolation='nearest', cmap='hot_r')
axd.set_xticks([])
axd.set_yticks([])for i in axd.spines.values():i.set_visible(False)
axm = sns.heatmap(myData_rowclust, annot = True, fmt = "d")
plt.show()
输出结果:
提示:
颜色深度和数据大小正相关(最右边的长条图说明了颜色深浅和数值大小的关系,颜色越深,数值越大),从热图上可以直观地看出簇内元素之间的距离关系,直观理解树图的合并过程。
18.5 本章总结
本章实现的工作是:首先导入20名学生的3科成绩,然后根据优先聚合距离最近的两个数据组的聚类标准,得到由20名学生划分成的不同簇类。
本章掌握的技能是:1、使用 SciPy 包计算欧式距离。2、使用 dendrogram 画出聚类树图。3、使用 matplotlib 包实现数据可视化,绘制热度图。
18.6 本章作业
实现本章的案例,即求出任意两个数组之间的距离,画出聚类树图和热度图。