层次聚类中,起初每一个实例或观测值属于一类,聚类就是每一次把两类聚成新的一类,直到所有的类聚成单个类为止,算法如下
a、定义每个观测值(行或单元)为一类
b、计算每类和其他各类的距离
c、把距离最短的两类合并成一类,这样类的个数就减少一个
d、重复步骤(b)和(c)。直到包含所有观测值的类合并成单个的类为止
在层次聚类中,主要的区别是它们对类的定义不同(步骤(b)),五种常见的聚类方法的定义和其中两类之间的距离定义
聚类方法
两类之间的距离定义
单联动
一个类中的点和另一个类中的点的最小距离
全联动
一个类中的点和另一个类中的点的最大距离
平均联动
一个类中的点与另一个类中的点的平均距离(也称作UPGMA,非加权对组平均)
质心
两类中质心(变量均值向量)之间的距离。对单个的观测值来说,质心就是变量的值
Ward法
两个类之间所有变量的方差分析的平方和
单联动聚类方法:倾向于发现细长的、雪茄型的类,它也通常展示一种链式的现象,即不相似的观测值分到一类中,因为它们和它们的中间值很相像
全联动聚类方法:倾向与发现大致相等的直径紧凑类,对异常值很敏感
平均联动:提供了以上两种方法的折中,相对来说,它不像链式,而且对异常值没有那么敏感,倾向与把方差小的类聚合
Ward法:倾向与把少量观测值的类聚合到一起,并且倾向与产生与观测值个数大致相等的类,它对异常值也是敏感的
质心法:一种很受欢迎的方法,因为其中类距离的定义比较简单,易于理解,相比其他方法,它对异常值不是很敏感,但是它可能不如平均联动法或Ward方法表现的很好
hclust()
层次聚类的方法可用 hclust()函数来实现,格式是
hclust(d ,method=)
d:是通过 dist()函数产生的矩阵
method:方法有“single”单联动,“complete”全联动,“average”平均联动,“centroid”质心,“ward ”Ward法
平均联动聚类
例
查看flexclust包中的营养数据集
> data(nutrient,package = “flexclust”) #导入数据
> row.names(nutrient)
> nutrient.scaled
> d
> fit.average
> plot(fit.average,hang=-1, cex=0.8 ,main = “Average Linkage Clustering”) #hang = -1 设置标签的位置:将观测值的标签移动到水平轴下面(让它们挂在0下面)
a、高度刻度代表了该高度类之间合并的判定值,对于平均联动来说,标准是一类中的点和其他类中的点的距离平均值
b、图提供了27种了食物之间的相似性/异质性的层次分析视图,如tuna canned 和chicken canned相似,但是都和 clams canned有很大的不同
如果最终目标是这些食品分配到类(希望有意义的)较少,那么需要额外的分析选择聚类的适当个数