k-means 聚类算法

聚类算法

一、聚类算法简介:

1、什么是聚类?

将物理或抽象对象的集合分组成为有类似的对象组成的多个簇的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其它簇中的对象相异。在许多应用中,可以将一个簇中的数据对象作为一个整体来对待。

2.分类:

大体上,主要的聚类技术可以划分为如下几类:

A.划分方法

  给定一个个对象或元组的数据库,一个划分方法构建数据的k个划分,每个划分表示一个聚簇,并且k<=n。也就是说,它将数据划分为k个组,同时满足如下要求:

  (i)每个组至少包含一个对象;

  (ii)每个对象必须属于且只属于一个组。

  给定要构建的划分数目k,划分方法首先创建一个初始划分。然后采用一种迭代的重定位技术,尝试通过对象在划分间移动来改进划分。一个好的划分的一般准则是:在同一类中的对象之间尽可能“接近”或相关,而不同类中的对象之间尽可能“远离”或不同。还有许多其它划分质量评判准则。

  为了达到全局最优,基于划分的聚类会要求穷举三所有可能的划分。实际上,绝大多数应用采用了以下两个比较流行的启发式方法:

  (1)聚于质心的技术: k-平均方法

  k-平均算法以k为参数,把n个对象分为k个簇,以使簇内具有较高的相似度,而簇间的相似度较低。相似度的计算根据一个簇中对象的平均值(被看作簇的重心)来进行。

  k-平均算法的处理流程如下。首先,随机地选择k个对象,每个对象初始地代表一个簇的平均值或中心。对剩余的每个对象,根据其与各个簇中心的距离,将它赋给最近的簇。然后重新计算每个簇的平均值。这个过程不断重复,直到准则函数收敛。通常采用平方误差准则,其定义如下:

  (2-1)

  这里的E是数据库中所有对象的平方误差的总和,p是空间的点,表示给定的数据对象,mi是簇Ci的平均值(p 和mi都是多维的)。这个准则是使图生成的结果簇尽可能的紧凑和独立。

  例1 假设有一个分布在空间中的对象集合,如图2-1所示。给定k=3,即要求将这些对象聚类为三个簇。根据k-平均算法,我们任意选择三个对象作为初始簇的中心,簇中心在图中用“+”来标示。根据与簇中心的距离,每个对象分配给离其最近的一个簇。这样分布形成如图a中所绘的图形。

  这样的分组会改变聚类的中心,也就是说,每个聚类的平均值会根据类中的对象重新计算。依据这些新的聚类中心,对象被重新分配到各个类中。这样重新分配形成了图b中描绘的轮廓。

以上的过程重复产生了图c的情况。最后,当没有对象重新分配发生时,处理过程结束,聚类的结果被返回。

图2-1 基于K-means方法的一组对象的聚类

  这个算法尝试找出是平方误差函数值最小的K个划分,当结果簇是密集的,而簇与簇之间区别明显时,它的效果较好。对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂程度是 O(nkt)。其中,n是所有对象的数目,k是簇的数目,t是迭代的数目。通常的,k<

  但是,k-平均方法只有在簇的平均值被定义的情况下使用。这可能不适应某些应用。例如涉及有分类属性的数据。要求用户必须事先给出k(要生成的簇的数目)可能算是该方法的一个缺点。K-平均方法不适合于发现非凸面形状的簇,或者大小差别很大的簇,并且,它对于“噪声”和孤立点数据很敏感,少量的该类数据能够对平均值产生很大影响。

  (2)基于有代表性的对象的技术 k-中心点方法

  采用簇中位置最中心的对象,作为参照点即中心点,这样划分依然是基于最小化所有对象与参照点之间的相异度之和的原则来执行的。这是k-中心点的基础。它的基本策略是:首先为每个簇随意选择一个代表对象;剩余对象根据与代表对象的距离分配给最近的一个簇。然后反复用非代表对象代替代表对象,以改进聚类的质量。聚类结果的质量用一个代价函数来估算,该函数度量对象与参照对象之间的平均相异度。为了判定一个非代表对象是否是当前一个代表对象的好的替代,对于每一个非中心点对象p,下面的四种情况被考虑:

  ·第一种情况:p当前隶属于中心点Oj。如果Oj被Orandom所代替作为中心点,且p离一个Oi最近,i≠j,那么p被重新分配给Oi.

  ·第二种情况:p当前隶属于中心点Oj.如果Oj被Orandom代替作为中心点,且p离Orandom最近,那么p被重新分配给Orandom。

  ·第三种情况:p当前隶属于中心点Oi,i≠j。如果Oj 被Orandom代替作为一个中心点,而p依然离Oi最近,那么对象的隶属不发生变化。

  ·第四种情况: p当前隶属于中心点Oi,i≠j。如果Oj 被Orandom代替作为一个中心点,且p离Orandom最近,那么p被重新分配给Orandom。

  “那个方法更健壮:k-平均或者k-中心点?”当存在“噪声”和孤立点数据时,k-中心点比k-平均更健壮,这是因为中心点不像平均值那样容易受到极端数据影响。但是,k-中心点的执行代价比k-平均方法高.

  这些启发式方法对中小规模的数据库中发现球状簇很实用。为了对大规模的数据集进行聚类,以及处理复杂形状的聚类,基于划分的方法需要进一步的扩展。

B.层次的方法

  一个层次的聚类方法将数据对象组成一棵聚类的树。根据层次分解是自底向上的还是自顶向下形成的,层次的聚类方法可以进一步分为凝聚的(agglomerative)和分裂的(divisive)层次聚类。

  (1)凝聚的层次聚类:这种自底向上的策略首先将每个对象作为单独的一个簇,然后和并这些原子簇为越来越大的簇,直到所有的对像都在一个簇中,或者达到某个终止条件。

 

  (2)分裂的层次聚类:这种自顶向下的策略与凝聚的层次聚类相反,它首先将所有的对象置于一个簇中。然后逐渐细分为越来越小的簇,直到每个对象在单独的一个簇中,或者达到一个终止条件,例如打到了某个希望的簇数目后者两个簇之间的距离超过了某个阀值。

  例2 图2-3描述了一个凝聚的层次聚类方法AGNES(Agglomerative NESting)和一个分裂的层次聚类方法DIANA(Divisive Analysis)在一个包含五个对象的数据集合{a,b,c,d,e}上的处理过程。最初,AGNES将每个对象作为一个簇,然后这些簇根据某些准则一步步合并。例如,如果簇C1中的一个对象和簇 C2中的一个对象之间的距离使所有属于不同簇的对象间欧式距离最小的,C1和C2可能被合并。其每个簇可以被簇中所有对象代表,两个簇间的相似度由两个不同簇中距离最近的数据点对的相似度来确定。聚类的合并过程反复进行直到所有对象最终合并为一个簇。

  在DIANA方法处理过程中,所有的对象都放在一个簇中。根据一些原则(如簇中最邻近的对象的最大欧氏距离),将该簇分裂。簇的分裂过程反复进行,直到最终每个新的簇只包含一个对象。

  层次聚类方法尽管简单,但经常会遇到合并或分裂点选择的困难。这样的选择是非常关键的,因为一旦一组对象(合并或分裂)完成,它就不能被撤销,下一步的处理将在新完成的簇上进行。这个严格规定是有用的,由于不用担心组合数目的不同选择,计算代价会比较小。但是,已做的处理不能被撤消,聚类之间也不能交换对象。如果在某一步没有很好的选择合并或分裂的决定,可能会导致低质量的聚类结果。而且,这种聚类不具有很好的可伸缩性。因为合并或分裂的决定需要检查和估算大量的对象或结果。

  改进层次方法的聚类质量的一个有希望的方向是将层次聚类和其他聚类技术集成。有两种方法可以改进层次聚类的结果:

  (i) 在每层划分中,仔细分析对象间的“联接”,例如CURE和Chameleon中的做法。

(ii)综合层次凝聚和迭代的重定位方法。首先用自底向上的层次算法,然后用迭代的重定位来改进结果。例如BIRCH中的方法。

C.基于密度的方法

  绝大多数划分方法给予对象之间的距离进行聚类。这样的方法只能发现球状的簇,而在发现任意形状的簇上遇到了困难。随之提出了基于密度的聚类方法,它是将簇看作是数据空间中被低密度区域分割开的高密度区域。其主要思想是:只要邻近区域的密度(对象或数据点的数目)超出了某个阀值,就继续聚类。也就是说,对给定类中的每个数据点,在一个给定范围的区域中必须至少某个数目的点。这样的方法可以用来过滤“噪声”孤立点数据,发现任意形状的簇。

  DBSCAN是一个有代表性的基于密度的方法,它根据一个密度阀值来控制簇的增长。

  OPTICS是另一个基于密度的方法,它为自动的和交互的聚类分析计算一个聚类顺序。

D、基于网格的方法

  基于网格的方法把对象空间量化为有限数目的单元,形成一个网格结构。所有的聚类操作都在这个网格结构(即量化的空间)上进行。这种方法的主要优点是处理速度快,其处理时间独立与数据对象的数目,只与量化空间中的每一维的单元数目有关。

  基于网格方法的有代表性的例子:STING,它利用存储在网格单元中的统计信息;WaveCluster,它利用一种小波变换方法来聚类对象;CLIQUE,它是在高维数据空间中基于网格和密度的聚类方法。

E、基于模型的方法

  基于模型的方法为每一个簇假定一个模型,寻找数据对给定模型的最佳拟合。一个基于模型的算法可能通过构建反映数据点空间分布密度函数来定位聚类。它也基于标准的统计数字自动决定聚类的数目,考虑“噪声”数据或孤立点,从而产生健壮的聚类方法。这样的方法经常基于这样的假设:数据是根据潜在的概率分布生成的。

  基于模型的方法主要有两类:统计学方法和神经网络方法。

  一些聚类算法集成了多种聚类方法的思想,所以有时将某个给定的算法划分为属于某些聚类方法是困难的。此外,某些应用可能有特定的聚类标准,要求综合多个聚类技术。

3、对比:

算法

算法效率

适合的数据类型

发现的聚类类型

对脏数据或异常数据的敏感性

对数据输入顺序的敏感性

BIRCH

数值

凸形或球形 

不敏感

不太敏感

DBSCAN

一般

数值

任意形状

敏感

敏感

CURE

较高

数值

任意形状

不敏感 

不太敏感

K-poto

一般

数值和符号

凸形或球形

敏感 

一般

CLARANS

较低

数值

凸形或球形

不敏感

非常敏感

CUQUE

较低

数值

凸形或球形

一般

不敏感

  

二、k-means算法:

1、简介:

此算法以K为参数,把N个对象分为K个簇,以使簇内具有较高的相似度,而且簇间的相似度较低。相似度的计算根据一个簇中对象的平均值来进行。

此算法的工作过程为:首先从N个数据对象任意选择K个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。

一般都采用均方差作为标准测度函数.K个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。

K-MEANS算法的具体流程如下:
1)从N个数据对象任意选择K个对象作为初始聚类中心;
2
)根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;
3
)重新计算每个(有变化)聚类的均值(中心对象)
4
)重复2/3步直到满足既定的条件,算法结束。

 

k-means算法流程图

2、伪码算法:

 

    原文作者:聚类算法
    原文地址: https://blog.csdn.net/tuobadon/article/details/42042673
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞