可伸缩聚类算法综述(可伸缩聚类算法开篇)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40793975/article/details/83536182

可伸缩聚类算法综述

第二十八次写博客,本人数学基础不是太好,如果有幸能得到读者指正,感激不尽,希望能借此机会向大家学习。这一篇文章作为可伸缩聚类(Scalable Clustering)算法的开篇,简要介绍了几种针对大规模数据常用的减少时间和空间复杂度的方法。

  许多聚类算法所需要的存储量(空间复杂度)都是非线性的,以层次聚类为例,其所需的存储量为,由于磁盘对随机访问速度的限制,这类算法并不适用于大规模的数据集,而且算法本身难以修改。另外,某些算法的计算量(时间复杂度)也是非线性的,因此在这里针对上述问题介绍几种常用的减少时间和空间复杂度的方法。

多维或空间存取方法

  许多聚类技术(K-Means、DBSCAN等)需要找出最近的质心、点的最近邻或指定距离内的所有点。可以使用称为多维或空间存取方法的专门技术来更加有效的执行这些任务,至少对于低维数据可以这样做。这些技术,如k-d树或R*树,一般产生数据空间的层次划分,可以用来减少发现点的最近邻所需要的时间。注意,基于网格的聚类法也划分数据空间(如DENCLUE中对核密度估计的改进)。

邻近度界

  另一种避免邻近度计算的方法是使用邻近度界。例如,使用欧几里得距离时,有可能使用三角不等式来避免许多距离的计算。例如,在传统K-Means的每一次循环迭代中,需要决定样本点应当留在当前的簇,还是应当移动到一个新的簇中。如果我们知道两个簇质心之间的距离和点到当前所属簇的(更新过的)质心的距离,则可以使用三角不等式来避免计算该样本点到其他簇质心的距离。

抽样

  另一种降低时间复杂度的方法是抽样。在这种方法中,提取一个样本点集作为原始数据集的子集,对样本点集中的所有点进行聚类,然后将原数据集中其余的样本点指派到这些簇中(通常是最近的簇)。如果抽取的点数是 m \sqrt{m} ,则 O ( m 2 ) O\left(m^2\right) 时间复杂度的算法复杂度降低到 O ( m ) O\left(m\right) 。不过,抽样的主要问题是小簇可能丢失。

划分数据对象

  另一种降低时间复杂度的常用方法是,使用某种有效的技术,将数据集划分为不相交的集合,然后分别对这些集合聚类。最终的簇的集合是这些分离的簇的集合的并,或者通过对分离的簇的集合合并和/或进一步求精得到,在原型聚类中的提到过的二分K-Means采用的就是类似的方法。
  如果使用K-Means来找出K个簇,则在每次循环迭代中都需要计算每个样本点到每个簇质心的距离。如果K很大,则这种计算可能开销很大。二分K-Means从整个数据集开始,·使用K-Means将当前的簇的进行二划分,知道我们得到K个簇。在每一次循环迭代中,需要计算点到两个簇质心的距离。除了循环的第一步,我们只需要计算原始数据集的一个子集中的点到两个被考虑的簇质心的距离。因此,二分K-Means比普通的K-Means要快。

汇总

  另一种聚类方法是:首先汇总数据(通常经过一次扫描),然后在汇总数据上聚类。比如,领导者算法或者将一个数据对象放进最近的簇(如果该簇足够近),或者创建一个包含当前对象的新簇。这种方法关于对象个数是线性的,可以用来汇总数据,以便使用其他聚类技术。BIRCH算法采用了类似的概念。

并行与分布式计算

  如果不能利用前面介绍的技术,或者如果采用这些技术并不能产生期望的精度或者降低计算时间,则需要其他方法。一种高效的方法是将计算分布到多个处理机上。


以下是各可伸缩聚类算法链接:
【1】CURE《CURE算法详解》
【2】BIRCH《BIRCH详解》

猜你喜欢

转载自blog.csdn.net/qq_40793975/article/details/83536182
今日推荐