最大的优点是;
可以一次性得到整个聚类的过程,只要得到下面的第一个聚类树,想要分成多少的簇都可以,不需要因为改变簇的个数而重新进行聚类。
缺点:<1>计算量很大,因为每次都需要计算任意2个簇内所有数据点的两两距离。
<2>参差聚类使用的是贪心算法,得到的是局部最优,而不是全局最优。
所谓聚类,就是将相似的事物聚集在一起,而将不相似的事物划分到不同的类别的过程,是数据分析之中十分重要的一种手段。
比如古典生物学之中,人们通过物种的形貌特征将其分门别类,可以说就是 一种朴素的人工聚类。
如此,我们就可以将世界上纷繁复杂的信息,简化为少数方便人们理解的类别,可以说是人类认知这个世界的最基本方式之一。
在数据分析的术语之中,聚类和分类是两种技术。
分类是指我们已经知道了事物的类别,需要从样品中学习分类的规则,是一种有指导学习;
而聚类则是由我们来给定简单的规则,从而得到分类,是一种无指导学习。两者可以说是相反的过程。
网上关于聚类算法的资料很多,但是其实大都是几种最基本的方法,如K-means、层次聚类、SOM,dbscan等,
本篇文章,我们主要讲解层次聚类
层次聚类,是一种很直观的算法。
顾名思义就是要一层一层地进行聚类,可以从下而上地把小的cluster合并聚集,也可以从上而下地将大的cluster进行分割。
似乎一般用得比较多的是从下而上地聚集,因此这里我就只介绍这一种。
所谓从下而上地合并cluster,具体而言,就是每次找到距离最短的两个cluster,然后进行合并成一个大的cluster,直到全部合并为一个cluster。整个过程就是建立一个树结构,类似于下图。

相似性度量?
对于聚类,关键的一步是要告诉计算机怎样计算两个数据点的“相似性”,不同的算法需要的“相似性”是不一样的。
比如有的数据集合给出了每个数据点的空间坐标,我们就可以用数据点之间的欧式距离来判断,距离越近,数据点可以认为越“相似”。当然,也可以用其它的度量方式,这跟所涉及的具体问题有关。
那么,如何判断两个cluster之间的距离呢?
一开始每个数据点独自作为一个类,它们的距离就是这两个点之间的距离。
而对于包含不止一个数据点的cluster,就可以选择多种方法了。
最常用的,就是average-linkage,即计算两个cluster各自数据点的两两距离的平均值。
类似的 还有single-linkage/complete-linkage,选择两个cluster中距离最短/最长的一对数据点的距离作为类的距离。
个人经验complete-linkage基本没用,single-linkage通过关注局域连接,可以得到一些形状奇特的cluster,但是因为太过极端,所以效果也不是太好。
层次聚类较大的优点,就是它一次性地得到了整个聚类的过程,只要得到了上面那样的聚类树,想要分多少个cluster都可以直接根据树结构来得到结果,改变cluster数目不需要再次计算数据点的归属。
层次聚类的缺点是计算量比较大,因为要每次都要计算多个cluster内所有数据点的两两距离。
另外,由于层次聚类使用的是贪心算法,得到的显然只是局域最优,不一定就是全局最优,这可以通过加入随机效应解决,这就是另外的问题了。
如何确定应该取多少个cluster?这是聚类里面的一个非常重要的问题。
对于层次聚类,可以根据聚类过程中,每次合并的两个cluster的距离来作大概判断,如下图。

因为总共有2000个数据点,每次合并两个cluster,所以总共要做2000次合并。
从图中可以看到在后期合并的两个cluster的 距离会有一个陡增。
假如数据的分类是十分显然的,就是应该被分为K个大的cluster,K个cluster之间有明显的间隙。
那么如果合并的两个小cluster同属于一个目标cluster,那么它们的距离就不会太大。
但当合并出来K个目标cluster后,再进行合并,就是在这K个 cluster间进行合并了,这样合并的cluster的距离就会有一个非常明显的突变。
当然,这是十分理想的情况,现实情况下突变没有这么明显,我们只 能根据下图做个大致的估计。