分层聚类算法(Hierarchical clustering)
原文链接:https://blog.csdn.net/u012500237/article/details/65437525
参考文章:http://www.360doc.com/content/19/0623/20/99071_844396658.shtml
1. 分层聚类算法简介
分层聚类法就是对给定数据对象的集合进行层次分解,根据分层分解采用的分解策略,分层聚类法又可以分为凝聚的(agglomerative,即自上而下)和分裂的(divisive,即自下而上)分层聚类。
其有点是可以将结果以树状图谱的形式展现出来,让研究人员根据需要自己划分簇;
1.1 分裂法:
分裂法指的是初始时将所有的样本归为一个类簇,然后依据某种准则进行逐渐的分裂,直到达到某种条件或者达到设定的分类数目。用算法描述:
输入:样本集合D,聚类数目或者某个条件(一般是样本距离的阈值,这样就可不设置聚类数目)
输出:聚类结果
1.将样本集中的所有的样本归为一个类簇;
repeat:
2.在同一个类簇(计为c)中计算两两样本之间的距离,找出距离最远的两个样本a,b;
3.将样本a,b分配到不同的类簇c1和c2中;
4.计算原类簇(c)中剩余的其他样本点和a,b的距离,若是dis(a)<dis(b),则将样本点归到c1中,否则归到c2中;
util:达到聚类的数目或者达到设定的条件
示例:
在平面上有6个点:p0(1,1), p1(1,2), p2(2,2), p3(4,4), p4(4,5), p5(5,6),我现在需要对这6个点进行聚类,对应着上边的步骤我可以这样做:
1.将所有的点归为一个类簇c(p0,p1,p2,p3,p4,p5)
repeat:
2.在类簇c中计算他们的距离(简单的欧式距离)我们可以得到:
由上边的表格可以看出距离最远的两个点为p0和p5
3.将p0分配到类簇c1,将p5分配到类簇c2;
4.查表可以看出,剩余的点中p1和p2与p0的距离小,所以将它们两个归到类簇c1中;p3和p4与p5的距离小,所以将它们两个归到类簇c2中。这样我们得到了一次新的聚类 结果c1=(p1,p2,p3),c2=(p3,p4,p5);
util: 若是我要求就聚类成两个,则这个聚类到此结束,最终我们的聚类 结果是(p1,p2,p3)和(p3,p4,p5)。若是我要求同一个类中,最大样本距离不大于sqrt(2),那么上述的分类结果没有到达要求,则需要返回到repeat处继续聚类,因为c1中的样本的距离都不大于sqrt(2),所以不需要再分了;而类簇c2中的dis(p3,p5)=sqrt(5)>sqrt(2),还需要继续分,c2最后分聚类成两个类(p3,p4)和(p5),这样我们最终得到了三个类簇(p1,p2,p3)、(p3,p4)和(P5)。
1.2 凝聚法:
凝聚法指的是初始时将每个样本点当做一个类簇,所以原始类簇的大小等于样本点的个数,然后依据某种准则合并这些初始的类簇,直到达到某种条件或者达到设定的分类数目。用算法描述:
输入:样本集合D,聚类数目或者某个条件(一般是样本距离的阈值,这样就可不设置聚类数目)
输出:聚类结果
1.将样本集中的所有的样本点都当做一个独立的类簇;
repeat:
2.计算两两类簇之间的距离(后边会做介绍),找到距离最小的两个类簇c1和c2;
3.合并类簇c1和c2为一个类簇;
util: 达到聚类的数目或者达到设定的条件
示例:
1.首先经所有的样本看作是一个类簇,这样我可以得到初始的类簇有6个,分别为c1(p0),c2(p1),c3(p2),c4(p3),c5(p4),c6(p5)
repeat:
2.由上边的表可以得到两两类簇间的最小距离(并不是唯一,其他两个类簇间距离也可能等于最小值,但是先选取一个)是1,存在类簇c1和c2之间
注意:这个类簇间距离的计算方法有许多种。
- 就是取两个类中距离最近的两个样本的距离作为这两个集合的距离,也就是说,最近两个样本之间的距离越小,这两个类之间的相似度就越大
- 取两个集合中距离最远的两个点的距离作为两个集合的距离
- 把两个集合中的点两两的距离全部放在一起求一个平均值,相对也能得到合适一点的结果。
- 取两两距离的中值,与取均值相比更加能够解除个别偏离样本对结果的干扰。
- 把两个集合中的点两两的距离全部放在一起求和然后除以两个集合中的元素个数
- 求每个集合的中心点(就是将集合中的所有元素的对应维度相加然后再除以元素个数得到的一个向量),然后用中心点代替集合再去就集合间的距离
前四种,在点击打开链接中有介绍,后边的两种在工业界也经常使用,当然,还会有其他的一些方法。
3.合并类簇c1和c2,得到新的聚类结果c1(p0,p1),c3(p2),c4(p3),c5(p4),c6(p5)。
util:若是我们要求聚成5个类别的话,我们这里就可以结束了。但是如果我们设定了一个阈值f,要求若存在距离小于阈值f的两个类簇时则将两个类簇合并并且继续迭代,我们又会回到repeat继续迭代从而得到新的聚类结果。