聚类与分类是人工智能领域中的两个经典问题。简单地说,分类算法是通过训练集进行学习,从而具备把未知数据划分到已知类别中的能力,这种通过训练数据进行学习的方法被称为监督学习(supervised learning)。作为一种监督学习方法,分类算法要求必须事先明确类别信息,并且所有待分类的数据都有一个已知类别与之对应。
聚类算法不需要通过具有类别标记的训练数据进行学习,是一种无监督学习(unsupervised learning)的方法,它借助算法把数据对象划分成几个不同的子集,每个子集称为一个簇(cluster)。划分的原则是使得同一簇中的对象彼此相似,而与其他簇中对象的差异尽量大。
虽然分类与聚类最终都是把待处理的对象分成几类,但是它们适用的问题、处理的方法以及对处理结果的解读都是不同的。首先分类问题的类别是事先确定的,而聚类事先并不知道处理对象的类别,而是根据它们内在的特性进行划分。例如,关注的对象是某个人群,一个典型的分类算法是根据人群的身高、体重等生物测量数据把他们划分成青少年、中年、老年三个类别。而聚类是根据这些生物测量数据按照某种相似度把人群分成几类。最终也许划分成了青少年、中年、老年三个类别,也有可能根据性别划分成男性、女性两个类别,还有可能根据其他标准划分成另外的几个类别。这在聚类完成前是未知的,并且需要对聚类结果进行解读。所以分类算法适用于类别或分类体系已经确定的问题,而聚类算法适用于不存在特定的分类体系的问题,聚类是一种探索式的学习方法。
聚类方法在很多领域都有应用,如商务智能、图像识别、网页搜索、生物学等。可供选择的聚类方法有很多种,应根据具体任务和算法的特点进行选择,并没有哪一种方法是适用于所有问题的。因为方法众多、特点不同,很难对聚类方法给出非常明确的分类,所以下面对常见的聚类方法给出一个不是非常严格的划分。
1.基于划分的聚类方法
对包含n个元素的集合,依据某种原则把集合划分为k个分区,每个分区代表一个簇,其中k≤n。这类方法多数是使用某种距离进行划分的,使得同一簇中的元素尽量“接近”,而不同簇中的元素尽量“远离”。为了达到划分的全局最优,可能需要穷举所有可能的划分。这样的计算量在大数据量时常常是无法被接受的,所以实际上多数基于划分的聚类方法都是启发式的,通过迭代逐渐提高聚类的质量。在第三节将会介绍的k-平均算法就是这类方法的代表。
2.基于层次的聚类方法
根据层次聚类的方向,这类方法可以分为自下而上和自上而下两种形式。自下而上的层次聚类开始时把每个元素作为单独的簇,然后逐渐合并相近的簇,直至满足算法约定的条件后停止。而自上而下的层次聚类开始时将所有元素放在一个簇中,每次迭代将一个簇分解成更小的簇,直至满足算法约定的条件后停止。层次聚类通常是使用距离或者使用密度和连通性进行聚类的,它的缺陷在于一旦合并或者分裂的步骤完成,将不能撤销,它的好处是计算量较小。这类方法的代表有AGNES、DIANA等。
3.基于密度的聚类方法
当聚类方法是使用距离判断元素之间的相似性时,对聚类对象的形状是敏感的。当簇的形状是球形(凸的)时,这样的方法更有效;而对于任意形状的簇,基于距离的聚类方法很可能效果较差甚至失效。对于这样的任务,可以使用基于密度的聚类方法。它使用的基本原理是,当把集合中的某些元素放在一起时,如果每个元素附近元素的“密度”都大于某个阈值,则把这些元素看成是一个簇。这类方法的代表是DBSCAN聚类方法。
4.其他的聚类方法
除了上述聚类方法,还有基于网格的聚类、利用神经网络的聚类、基于概率的聚类等。
当使用聚类方法时,有以下问题是需要评估和注意的。
评估聚类趋势。只有在具有非随机结构的集合上才考虑使用聚类方法,否则很可能返回无意义的结果。非随机结构表明集合存在某种内在的可划分的结构,所以才值得使用聚类方法去探索这种结构,否则划分的结果就是无意义的。例如,下面图5-1左侧图中的点几乎是均匀分布的,尽管聚类算法可以按要求返回几个簇,但这些簇其实并没有实际含义;而图5-1右侧图中的点明显分成两个部分,就可以尝试使用聚类方法去找到划分这两个集合的方式。如何评价所考查的集合的聚类趋势,如何判断其中是否有非随机结构?可以通过一种简单有效的统计量——霍普金斯(Hopkins)统计量来实现。具体细节不在这里赘述。
图5-1
评估聚类质量。评估聚类质量是个复杂的问题,需要明确的一点是,聚类是根据数据的内在特征给出的某种意义下的划分,并没有唯一正确的答案。笼统地说,当有专家意见或者经验可供参考时,可据此评估聚类结果的好坏,这称为外在方法。如果没有类似的基准可以参考,则根据聚类产生的类别的分离情况进行评价,这称为内在方法。外在方法很多情况下是不实用的,例如,用来聚类的数据量很大时,通过人工对聚类质量进行评估就成为非常耗时甚至不可能完成的任务了。当可以使用距离的概念时(注意这并不总是可行的,它依赖于数据的类型),使用内在方法评估聚类质量的一个简单方法是计算每个簇距离中心的误差平方和,误差平方和越小说明这个簇内的元素差异越小,聚类质量也越好。更复杂一些,可以使用轮廓系数(Sihouette Coefficient)、兰德指数(Rand Index)、互信息(Mutual Information)等进行评价,在提供聚类工具的Python库中,一般可以直接调用这些评价方法,这里不再详细说明。