层次聚类
层次聚类,顾名思义,就是一层一层的进行聚类,它试图在不同层次对数据集进行划分,可以由上向下把大的类别分割,即“自顶向下”的分拆策略(见下面AGNES部分),也可以由下向上对小的类别进行聚合,即“自底向下”的聚合策略:开始把所有的样本都归为一类,然后逐步将他们划分为更小的单元,直到最后每个样本都成为一类。在这个迭代的过程中通过对划分过程中定义一个松散度,当松散度最小的那个类的结果都小于一个阈值,则认为划分可以终止。这种方法用的不普遍,在这里不予详细介绍。下面本文主要对采用自底向上聚合策略的AGNES(AGglomerative NESting)做一个介绍。
AGNES
AGNES,是一种采用自底向上聚合策略的层次聚类算法,是先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,该过程不断重复,直至达到预设的聚类簇个数,这里的关键是如何计算聚类簇之间的距离。其实每个聚类簇就是一个样本集合,聚类簇之间的聚类就是集合之间的聚类。
簇直接的距离
最小距离,是由两个簇的最近样本决定。如果层次聚类的距离度量函数采用 dmin d m i n ,两个簇之间的相似度由两个簇中最近样本决定,这样容易造成Chaining的效果,即两个簇明明从“大局”上离得比较远,但是由于其中个别点的距离比较近就被合并了,并且这样合并之后Chaining效应会进一步扩大,最后会得到比较松散的簇。
python代码实现:
#计算欧几里得距离,a,b分别为两个元组
def dist(a, b):
return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1], 2))
#dist_min
def dist_min(Ci, Cj):
return min(dist(i, j) for i in Ci for j in Cj)
最大距离,由两个簇的最远样本决定。这个则是最小距离 dmin d m i n 的反面极端,其效果也是刚好相反的,限制非常大,两个 cluster 即使已经很接近了,但是只要有不配合的点存在,就顽固到底,老死不相合并,也是不太好的办法。 dmin d m i n 和 dmax d m a x 这两种相似度的定义方法的共同问题就是指考虑了某个有特点的数据,而没有考虑类内数据的整体特点。