几张GIF了解K-means聚类原理K-means聚类的数学推导和python实现我在上一篇文章中说了k-means聚类,它是基于中心的聚类方法,通过迭代将样本分成k个类,使每个样本最接近其所属类的中心或均值。今天我们来看一下无监督学习聚类方法的另一种算法,层次聚类:层次聚类的前提是假设类别之间存在直接的层次关系,通过计算不同类别数据点之间的相似度来创建层次嵌入树.一组聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的最顶层是一个簇的根节点。创建聚类树有两种方法:聚合聚类(自下而上的合并)和分裂聚类(自上而下的分裂)。分裂聚类一般很少用到,就不介绍了。聚合聚类的具体过程aggregationclustering对于给定的样本集,开始将每个样本归为一类,然后根据一定的规则(比如类距离最小),合并满足规则的类,如此反复直到满足停止条件。聚合聚类的三个要素是:①距离或相似度(闵可夫斯基距离、相关系数、角余弦)②合并规则(最长/最短距离、中心距离、平均距离)③停止条件(类数或类直径达到或超过阈值)聚合聚类算法输入:由n个样本组成的样本集和样本间的距离输出:样本集的层次聚类(1)计算欧氏距离{dij}(2)构造n个类,每个类只包含一个样本(3)合并类间距离最小的两个类,构造新类(4)计算新类与其他类的距离,如果类数为1,则终止计算,否则返回(3)动画表示:python实现和案例importqueueimportmathimportcopyimportnumpyasnpimportmatplotlib.pyplotaspltclassclusterNode:def__init__(self,value,id=[],left=None,right=None,distance=-1,count=-1,check=0):'''value:节点的值,合并节点时等于原始节点值的平均值id:节点的id,包括节点left和right下的所有单个元素:合并得到该节点的两个子节点distance:两个子节点之间的距离count:节点包含的单个元素个数check:标识符,用于记录是否遍历时节点已经遍历'''self.value=valueself.id=idself.left=leftself.right=rightself.distance=distanceself.count=countself.check=checkdefshow(self):#显示节点相关属性print(self.value,'',self.left.idifself.left!=NoneelseNone,'',\self.right.idifself.right!=NoneelseNone,'',self.distance,'',self.count)classhcluster:defdistance(self,x,y):#计算两个节点之间的距离,可以换成另一个距离returnmath.sqrt(pow((x.value-y.value),2))defminDist(self,dataset):#计算所有节点间距离最小的节点对mindist=1000foriinrange(len(dataset)-1):ifdataset[i].check==1:#跳过合并节点continueforjinrange(i+1,len(dataset)):ifdataset[j].check==1:继续dist=self.distance(dataset[i],dataset[j])ifdist
