一、算法介绍
将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,类中的对象彼此间相似度大,而类与类之间的相似度小。
聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法。聚类属于无监督学习。
不同于K-means这种划分式的聚类算法,层次聚类最终生成聚类层次,也就是层次树。聚类的结果不一定是要生成一个类,聚类结束的条件可以是所有对象都归并完成,也可以是达到预期类的数量或类间的距离超过预定值。将所有样点自底而上合并成一棵树或自顶而下分裂成一棵树,这两种方式分别称为凝聚和分裂。
自下而上聚合层次聚类方法(或凝聚层次聚类)。这种自下而上策略就是最初将每个对象(自身)作为一个簇,然后将这些簇进行聚合以构造越来越大的簇,直到所有对象均聚合为一个簇,或满足一定终止条件为止。
自顶向下分解层次聚类方法(或分裂层次聚类)。这种策略的作法与自下而上策略的作法相反。它首先将所有对象看成一个簇的内容,将其不断分解以使其变成越来越小但个数越来越多的小簇,直到所有对象均独自构成一个簇,或满足一定终止条件为止。
二、算法步骤(以凝聚为例)
给定需要聚类的n个对象,每个对象内有多个维度,并计算出n*n的距离矩阵,接下来就是算法的步骤:
a、将每个对象归为单独一个类,即共有n个类,每个类中包含一个类,类与类之间的距离就是类中对象的距离;
b、找出最相似的两个类,即距离最短的两个类,并将两个类归为一个类,于是类的总数减少了一个;
c、重新计算新类与所有旧类之间的距离;
d、重复b和c,直到达到聚类结束。
三、距离计算
计算两个对象之间的距离,可以用欧氏距离或曼哈顿距离等。如果是计算相似度,可以采用余弦相似度。
计算两个类之间的距离,有以下几种方法:
1、SL方法(single-linkage),又称最近邻方法,定义类间距离为两类之间数据的最小 距离。容易造成一种叫做 Chaining 的效果,两个类从“大局”上离得比较远,但是 由于其中个别的点距离比较近就被合并了,并且这样合并之后 Chaining 效应会进一 步扩大,最后会得到比较松散的类。
2、CL方法(complete-linkage),又称最远邻方法,定义类间距离为两类之间数据的最 大距离。这种方法则与SL方法想法,明明两个类距离很近,却由于个别数据离得很 远而导致合并不了。这两种都是比较极端的,没有考虑到类内数据的整体特点。
3、AL方法(average -linkage),定义类间距离为类间数据两两距离的平均值。这种方 法介于上两种之间,考虑到类的整体结构。
4、质心连锁(centroid linkage),定义类间距离为类间质心的距离,质心为类中所有成员 的原始数据的均值。
四、算法评价
层次聚类可以发现类的层次关系,也可以称为嵌套关系。不需要先确定类的数目。但效
率低,时间复杂度高,且不具有可逆性,即一个类一旦合并后就不能撤销,这可能会影
响聚类的准确性。
五、代码
以下是自己写的python代码: