层次聚类(hierarchical clustering)
/ hy-uh-RAR-kik-ul KLUS-ter-ing /
层次聚类把数据归类的方式,不是分成一组平铺的箱子,而是分成一棵层层嵌套的「家族树」,就像生物学家把生命组织成「种」嵌在「属」里、「属」又嵌在「科」里那样。最常见的一种叫凝聚式,是从最底层起步:每一个数据点自成一个极小的簇。然后它反复地把最近的两个簇并成一个,再并、再并——小团并成大团——直到顶端,万物汇入唯一的一个大簇。这整部合并的历史,就是结果。
这段历史被画成一棵叫作树状图(dendrogram)的树,模样像一张侧倒过来的比赛对阵表:早早就合到一起的点,待在又短又低的枝上,因为它们极其相似;而直到接近顶端才合并的组,则由高高的长枝相连,因为它们相当不同。妙处在于,你不必像k均值逼你做的那样,预先认定一个簇数。你只需在你喜欢的任意高度,横着在树上划一条线,它穿过几根枝,你就得到几个簇。划得低,得到许多细分的小组;划得高,得到寥寥几个宽泛的大类。
它直观,一次就把那整幅多层次的图景给你,也无需事先去猜k——这正是它在生物学与遗传学里、用来为生物或基因构建family tree(家族树)的常用之处。它的软肋是开销:每一步都要把每个簇与其余每个簇比一遍,又慢又耗内存,所以它扩展不到极大的数据集。你还得选定如何衡量两个簇之间的距离(最近的一对?最远的一对?还是平均?),而这个选择,会悄悄地把整棵树重新塑形。
按特征给五种动物聚类。猫和狮子最先合并(都是猫科)。狗接着加入,形成一个「食肉动物」分支。麻雀和鹰则另成一对、归为鸟类。树状图把这一切都画了出来;把树切得低,你得到四个组;切得高,你只得到两个:哺乳动物和鸟类。
树状图让你事后再来选簇数——只看你在哪儿下刀。
与k均值不同,你不必事先定死簇数——而是通过选择在哪里下刀,从树上把它读出来。代价是速度:两两合并开销很大,所以它最适合中小型的数据集。