作者:钱烽
三、合并聚类算法
基于定义2所提出的相似度定义,我们在图2中给出最小化局部边际的合并聚类算法详细执行过程.首先,针对数据集中可能存在的噪声数据,我们对所有样本点进行孤立点检测.然后,作为ACMOM算法的主要过程,我们采用基于MkNN关系的相似度对检测结果为非孤立的样本点进行合并聚类.接着,为了构建完整的系统树图,我们将其余孤立样本点赋予距离它最近的类簇.最后,对于不存在任何MkNN连接的少数剩余类簇集合,我们使用ALINK算法进行合并操作并输出系统树图形式的聚类结果.
该算法的具体执行步骤如下:
(1) 初始化基本类簇(第1~6行): 算法首先初始化类簇集合GS和孤立点集合OS为空集,然后遍历数据集中的样本点.为了避免噪声数据的影响,ACMOM算法对于每一个样本点都使用了LOF技术[28]来检测其是否为孤立点.其中,由于LOF检测也涉及样本点的最近k邻居计算,我们使用了相同的最近邻参数k值.对于检测结果为孤立点的样本点,我暂时将其加入孤立点集合OS中.而对于其余样本点,我们初始化每个样本点自成一类,并将它们加入到类簇集合GS中,使之成为系统树图的叶子节点.
(2) 合并最相似类簇对(第7~11行): 接着,算法开始执行合并操作.在每次合并操作开始时,ACMOM算法首先根据定义2更新所有可能的类簇间相似度,并从中找出最大值.对于满足相似度最大值的类簇对和,我们将其合并为一个新的类簇,并在系统树图中将其赋为和的父亲节点.最后,我们在类簇集合中用新类簇替换原来的子类簇和.ACMOM算法将不断重复上述合并操作直至任意类簇间相似度都为0或所有样本点都合并至同一类簇为止。
(3) 合并孤立样本点(第12~15行): 对于剩余的每个孤立样本点,ACMOM算法首先找到距离其最近的非孤立点邻居,然后将其合并至该邻居所在的类簇中.
(4) 返回合并聚类结果(第16、17行): 上述算法流程执行完毕后,如果所有的样本点都已合并至类簇集合GS中的唯一类簇,我们直接将其作为系统树图的根节点返回给用户.否则,我们使用ALINK算法对集合GS中的剩余类簇做进一步合并操作并返回最终的系统树图结果.为了保证一致性,我们使用类簇间的样本间距均值来记录所返回系统树图中的节点高度。
四、复杂度分析
本节中,我们将更加具体地描述ACMOM算法的实现细节,从而详细分析其时间复杂度和空间复杂度.4时间复杂度分析
准备工作: 为了计算类簇间相似度以及使用LOF技术对样本点进行孤立点检测,我们需要事先为每个样本点计算其最近k邻居集合.ACMOM算法通过构建k-d树结构来实现这一操作.根据文献[29,30]的描述,构建k-d树的时间复杂度为O(nlogn),而为任意样本点查找k个最近邻居需要O(dn1-1/d+k)时间.其中,n表示数据集中样本点的个数,表示样本点的维度.因此,为数据集中的n个样本点构建k最近邻列表的总体时间复杂度为O(dn2-1/d+kn).
算法步骤(1): 根据文献[28]的描述,在已知k最近邻列表的前提下对n个样本点进行LOF检测的时间复杂度为O(n).而将数据集中的所有样本点加入基本类簇集合GS或孤立点集合OS的时间复杂度也是O(n).因此,算法步骤(1)的总体时间复杂度是O(n).
算法步骤(2): 算法从O(n)个基本类簇开始,每次选择两个现有类簇合并为一个新类簇,执行过程最多包含O(n)次合并操作.在此之前,ACMOM算法通过扫描样本点的k最近邻列表来构建数据集的MKNN连接集.这需要O(kn)的时间复杂度.基于所得的连接集,我们为每个基本类簇保存一个哈希表结构[31],其中存储了与其相邻的类簇序号.与序号一起保存的还有参与类簇之间MKNN连接的边界样本点集合(即定义2中的PK和PL).这些操作可以通过扫描一遍MKNN连接集完成,因而时间复杂度也是O(kn).在每次进行合并操作时,我们需要找到满足相似度最大的类簇对.为了加速算法执行,我们将与每个类簇最相似的类簇序号以及对应相似度存储在一个最大堆结构[32]中.构建最大堆结构的时间复杂度是O(nlogn),而每次从其中查找满足最大相似度的类簇对仅需要常数项时间.在进行合并操作时,除了使用常数项时间将原有类簇的样本点合并至新的类簇外,我们还需要将原有类簇的邻居列表进行合并,并且更新其最相似邻居.由于这一列表存储在哈希表结构中,而类簇的平均邻居数为O(k),因而所需的时间复杂度也是O(k).此外,我们还需要更新与被合并类簇相邻的其他类簇.假设这些相关类簇的平均数量为个,则对它们的邻居列表进行更新的时间复杂度为.最后,在最大堆结构中更新这些相关类簇以及新合并类簇的最近邻信息需要时间.综上所述,对数据集进行O(n)此合并操作的时间复杂度为,这也是算法步骤(2)的总体时间复杂度.
算法步骤(3): 为了对每个孤立样本点查找其最近非孤立点邻居,我们首先在它的最近k邻居列表中进行搜索,这需要最多O(kn)时间.而对于剩余的孤立样本点,我们通过进一步查询k-d树进行判断.设这些剩余样本点的个数为,查询的最坏时间复杂度为.之后,将所有孤立样本点合并至最近类簇的时间复杂度为O(n).因而算法步骤