python机器学习案例系列教程——聚类算法总结

全栈工程师开发手册 (作者:栾鹏)

python教程全解

一、什么是聚类?

聚类(Clustering):聚类是一个人们日常生活的常见行为,即所谓“物以类聚,人以群分”,核心的思想也就是聚类。人们总是不断地改进下意识中的聚类模式来学习如何区分各个事物和人。同时,聚类分析已经广泛的应用在许多应用中,包括模式识别,数据分析,图像处理以及市场研究。通过聚类,人们能意识到密集和稀疏的区域,发现全局的分布模式,以及数据属性之间的有趣的相互关系。简单来说就是将给定的数据集合划分为多个类或簇,目标是同一簇中的对象具有较高的相似,不同簇中的对象具有较高的相异性。同时聚类算法属于无监督的学习算法。

二、聚类的应用

聚类方法具有广泛的应用。典型的如文档的聚类以及一些特定领域的成功应用。但是由于聚类是无监督的学习方法,其所研究的数据没有类别标签,我们很难判断得到的聚类划分是否反映了事物的本质。

聚类分析也能用于分类Web文档来获得信息。作为数据挖掘的功能,聚类分析可以作为一个获得数据分布情况、观察每个类的特征和对特定类进一步分析的独立工具。通过聚类,能够识别密集和稀疏的区域,发现全局的分布模式,以及数据属性之间的相互关系等。

三、聚类的评估

一个能产生高质量聚类的算法必须满足下面两个条件:

(1) 类内(intra-class)数据或对象的相似性最强;

(2) 类间(inter-class)数据或对象的相似性最弱。

聚类质量的高低通常取决于聚类算法所使用的相似性测量的方法和实现方式,同时也取决于该算法能否发现部分或全部隐藏的模式。

python机器学习案例系列教程——聚类算法总结_第1张图片

簇的凝聚度可以定义为连接簇内心的邻近度图中边的加权和。
两个簇的分离度可以用从一个簇的点到另一个簇的点的边的加权和来度量。

根据凝聚度和分离度可以求出聚类的轮廓系数,使用轮廓系数来评估聚类结果。

簇的有效性的监督度量

1、面向分类的,如熵,纯度和F度量。

  • a. 熵:每个簇由单个类的对象组成的程度。涉及计算簇 i i 的成员属于类 j j 的概率 Pij P i j = mij m i j / mi m i
  • b. 纯度:簇 i i 的纯度是 Pi=maxPij P i = m a x P i j ,总纯度是加权和。
  • c. 精度:簇中一个特定类的对象所占的比例。簇 i i 关于类 j j 的精度 precision(I,j)=Pij p r e c i s i o n ( I , j ) = P i j
  • d. 召回率:簇包含一个特定类的所有对象的程度。簇 i i 关于类 j j 的召回率是 recall(I,j)=mij/mj r e c a l l ( I , j ) = m i j / m j ,其中 mj m j 是类 j j 的对象个数。
  • e. F度量:精度和召回率的组合,度量在多大程度上,簇只包含一个特定类的对象和包含该类的所有对象。簇 i i 关于类 j j 的F度量 F(i,j)=2precision(i,j)recall(i,j)precision(i,j)+recall(i,j) F ( i , j ) = 2 ∗ p r e c i s i o n ( i , j ) ∗ r e c a l l ( i , j ) p r e c i s i o n ( i , j ) + r e c a l l ( i , j )

2、 面向相似性的,如Jaccard度量。

  • F00=具有不同的类和不同的簇的对象对的个数
  • F01=具有不同的类和相同的簇的对象对的个数
  • F10=具有相同的类和不同的簇的对象对的个数
  • F11=具有相同的类和相同的簇的对象对的个数
  • Rand统计量 = (F00+ F11)/( F00+ F11 +F01+ F10) 对称
  • Jaccard系数 = F11/(F11 +F01+ F10) 非对称

层次聚类的簇的有效性:关键思想是,评估层次聚类是否对于每个类,至少有一个簇相对较纯,并且包含了该类的大部分对象。
可以对每个类,计算簇层次结构中每个簇的F度量,权值基于类的大小。

评估簇的有效性度量的显著性

  1. 常用方法,是统计学知识判断是否是随机的。动机是我们只对反应数据中非随机结构的簇感兴趣。
  2. 簇评估绝对不仅仅是为了得到簇有效性的数值度量,除非有自然的解释,否则需要以某种方法解释它。
    关于显著性:差别是否是统计显著的(可重复的);差别的量级对于应用是否有意义。(许多人不认为1%的差别是显著的,尽管它是相容可再生的)

四、常见的聚类算法

聚类方法主要分为划分聚类、层次聚类、基于密度的聚类、基于网格的聚类和基于模型的聚类。

1 划分方法(partitioning method)

划分方法首先根据给定要构建划分的数目k创建一个初始划分,然后采用一种迭代的重定位技术,尝试通过对象在划分间移动来改进划分。一个好的划分的一般准则是:在同一类中的对象之间尽可能“接近”或相关,而不同类中的对象之间尽可能“远离”或不同。为了达到全局最优,基于划分的聚类会要求穷举所有可能的划分。实际上,绝大多数应用采用了以下两个比较流行的启发式方法:(a)K-平均(K-MEANS)算法,在该算法中,每个簇用该簇中对象的平均值来表示。(b)K-中心点(K-MEDOIDS)算法,在该算法中,每个簇用接近聚类中心的一个对象来表示。

K-means算法

K-means算法首先随机选择k个对象,每个对象代表一个聚类的质心。对于其余的每一个对象,根据该对象与各聚类质心之间的距离,把它分配到与之最相似的聚类中。然后,计算每个聚类的新质心。重复上述过程,直到准则函数会聚。通常采用的准则函数是平方误差准则函数。

K-means聚类算法的具体步骤如下:

1) 从数据集中选择k个质心 C1C2Ck C 1 , C 2 , … , C k 作为初始的聚类中心;

2) 把每个对象分配到与之最相似的聚合。每个聚合用其中所有对象的均值来代表,“最相似”就是指距离最小。对于每个点 Vi V i ,找出一个质心 Cj C j ,使它们之间的距离 d(VjCj) d ( V j , C j ) 最小,并把 Vi V i 分配到第j组;

3) 把所有的点都分配到相应的组之后,重新计算每个组的质心 Cj C j

4) 循环执行第2)步和第3)步,直到数据的划分不再发生变化。

该算法具有很好的可伸缩性,其计算复杂度为 O(nkt) O ( n k t ) ,其中,t是循环的次数。K-means聚类算法的不足之处在于它要多次扫描数据库,此外,它只能找出球形的类,而不能发现任意形状的类。还有,初始质心的选择对聚类结果有较大的影响,该算法对噪声很敏感。

K-medoids算法

K-medoids算法的过程和上述k-means的算法过程相似,唯一不同之处是:k-medoids算法用类中最靠近中心的一个对象来代表该聚类,而k-means算法用质心来代表聚类。在k-means算法中,对噪声非常敏感,因为一个极大的值会对质心的计算带来很大的影响。而k-medoid算法中,通过用中心来代替质心,可以有效地消除该影响。

K-medoids算法首先随机选择k个对象,每个对象代表一个聚类,把其余的对象分别分配给最相似的聚类。然后,尝试把每个中心分别用其他非中心来代替,检查聚类的质量是否有所提高。若是,则保留该替换。重复上述过程,直到不再发生变化。

常见的k-medoids算法有PAM(Partitioning Around Medoids)算法、CLARA(Clustering LARge Application)算法、CLARANS(Clustering LARge Application based upon Randomized Search)算法。当存在“噪声”和孤立点数据时,k-medoids算法比可k-means更健壮,这是因为中心点不像平均值那么容易被极端数据影响。但是,k-medoids算法的执行代价比k-means高。

总之,划分方法具有线性复杂度,聚类的效率高的优点。然而,由于它要求输入数字k确定结果簇的个数,并且不适合于发现非凸面形状的簇,或者大小差别很大的簇,所以这些启发式聚类方法对在中小规模的数据库中发现球状簇很适用。为了对大规模的数据集进行聚类,以及处理复杂形状的聚类,基于划分的方法需要进一步的扩展。

2 层次方法(hierarchical method)

层次方法对给定数据对象集合进行层次的分解。根据层次的分解如何形成,层次的方法可以分为凝聚的和分裂的[30]。凝聚的方法,也称为自底向上的方法,一开始将每个对象作为单独的一个组,然后相继地合并相近的对象或组,直到所有的组合并为一个(层次的最上层),或者达到一个终止条件。分裂的方法,也称为自顶向下的方法,一开始将所有的对象置于一个簇中,在迭代的每一步中,一个簇被分裂为更小的簇,直到最终每个对象在单独的一个簇中,或者达到一个终止条件。

主要的凝聚聚类算法有CURE,CHAMELEON,BIRCH,ROCK等。

BIRCH算法

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)算法使用了一种叫做CF-树(聚类特征树,即Clustering Feature Tree)的分层数据结构,来对数据点进行动态、增量式聚类。CF-树是存储了层次聚类过程中的聚类特征信息的一个加权平衡树,树中每个节点代表一个子聚类,并保持有一个聚类特征向量CF。每个聚类特征向量是一个三元组,存储了一个聚类的统计信息。聚类特征向量中包含了一个聚类的三个统计信息:数据点的数目N,这N个数据点的线性和,以及这N个数据点的平方和SS。一个聚类特征树是用于存储聚类特征CF的平衡树,它有两个参数:每个节点的最大子节点数和每个子聚类的最大直径。当新数据插入时,就动态地构建该树。与空间索引相似,它也用于把新数据加入到正确的聚类当中。

BIRCH算法的主要目标是使I/0时间尽可能小,原因在于大型数据集通常不能完全装入内存中。BIRCH算法通过把聚类分为两个阶段来达到此目的。首先通过构建CF-树对原数据集进行预聚类,然后在前面预聚类的基础上进行聚类。

CURE算法

CURE(Clustering Using Representative)算法选择基于质心和基于代表对象方法之间的中间策略。它不用单个质心或对象来代表一个簇,而是选择数据空间中固定数目的具有代表性的点。针对大型数据库,CURE采用随机取样和划分两种方法的组合:一个随机样本首先被划分,每个划分再被部分聚类。

ROCK算法

CURE算法不能处理枚举型数据,而ROCK算法是在CURE基础之上适用于枚举数据的聚结分层聚类算法。通过把两个聚类的聚集相互连接度(aggregate interconnectivity)与用户定义的静态相互连接模型相比较,从而度量两个聚类之间的相似度。其中,两个聚类的相互连接度是指两个聚类之间的交叉连接数目,而连接link(pi,pj)是指这两点之间的共同邻居数。换句话说,聚类相似度是用不同聚类中又共同邻居的点的数目来确定的。

ROCK算法首先用相似度阀值和共同邻居的概念,从给定的数据相似度矩阵中构建一个稀疏图,然后对该稀疏图使用分层聚类算法进行聚类。

Chameleon算法

Chameleon(变色龙)是一个利用动态模型的层次聚类算法。算法思想是:首先通过一个图划分算法将数据对象聚类为大量相对较小的子聚类,然后用一个凝聚的层次聚类算法通过反复地合并子类来找到真正的结果簇。它既考虑了互连性,又考虑了簇间的近似度,特别是簇内部的特征,来确定最相似的子簇。

Chameleon跟CURE和DBSCAN相比,在发现高质量的任意形状的聚类方面有更强的能力。但是,在最坏的情况下,高维数据的处理代价可能对n个对象需要 O(n2) O ( n 2 ) 的时间。

总的来说,层次的方法的缺陷在于,一旦一个步骤(合并或分裂)完成,它就不能被撤消,该技术的一个主要问题是它不能更正错误的决定。有两种方法可以改进层次聚类的结果:(a)在每层划分中,仔细分析对象间的“联接”,例如CURE中的做法。(b)综合层次凝聚和迭代的重定位方法。首先用自底向上的层次算法,然后用迭代的重定位来改进结果。

3 基于密度的方法(density-based method)

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

DBSCAN算法

DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一个基于高密度连接区域的密度聚类方法。DBSCAN通过检查数据库中每个点的ε-邻域来寻找聚类。如果一个点p的ε-邻域包含多于MinPts个点,则创建一个以p作为核心对象的新簇。然后,DBSCAN反复地寻找从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并。当没有新的点可以被添加到任何簇时,该过程结束。

OPTICS算法

OPTICS(Ordering Points To Identify the Clustering Structure)通过对象排序识别聚类结构。OPTICS没有显式地产生一个数据集合簇,它为自动和交互的聚类分析计算一个簇次序(cluster ordering)。这个次序代表了数据的基于密度的聚类结构。它包含的信息,等同于从一个宽广的参数设置范围所获得的基于密度的聚类。也就是说,对于一个恒定的参数MinPts值,可以同时处理一组距离参数值。

OPTICS在选择参数方面具有比DBSCAN较高的灵活性,在采用空间索引时,复杂度为O(nlogn),和DBSCAN时间复杂度相同。但是,它需要额外的空间存储每个对象的核心距离和一个适当的可达距离。

DENCLUE算法

DENCLUE(DENsity based CLUstEring)是一个基于一组密度分布函数的聚类算法。它是对k-means聚类算法的一个推广:k-means算法得到的是对数据集的一个局部最优划分,而DENCLUE得到的是全局最优划分。

DENCLUE算法有一个坚实的数学基础,概括了其他的聚类方法,包括基于划分的、层次的、及基于位置的方法;同时,对于有大量“噪声”的数据集合,它有良好的聚类特征;对于高维数据集合的任意形状的聚类,它给出了一个基于树的存储结构来管理这些单元,因此比一些有影响的算法(如DBSCAN)速度要快。但是,这个方法要求对密度参数σ和噪声阈值ξ进行仔细的选择,如果选择不当则可能显著地影响聚类结果的质量。

4 基于网格的方法(grid-based method)

基于网格的方法把对象空间量化为有限数目的单元,形成了一个网格结构。所有的聚类操作都在这个网格结构(即量化的空间)上进行。基于网格的聚类算法主要有STING, WaveCluster, CLIQUE等。

STING算法

STING(Statistical Information Grid-based method)是一种基于网格的多分辨率聚类技术,它将空间区域划分为矩形单元。针对不同级别的分辨率,通常存在多个级别的矩形单元,这些单元形成了一个层次结构:高层的每个单元被划分为多个低一层的单元。关于每个网格单元属性的统计信息(例如平均值、最大值和最小值)被预先计算和存储。这些统计信息用于回答查询。

STING有几个优点:(i)由于存储在每个单元中的统计信息提供了单元中的数据不依赖于查询的汇总信息,所以基于网格的计算是独立于查询的;(ii)网格结构有利于并行处理和增量更新;(iii)该方法的主要优点是效率很高:STING扫描数据库一次来计算单元的统计信息,因此产生聚类的时间复杂度是O(n),其中n是对象的数目。在层次结构建立后,查询处理时间是O(g),这里g是最低层网格单元的数目,通常远远小于n。该算法的缺点:由于STING采用了一个多分辨率的方法进行聚类分析,STING聚类的质量取决于网格结构的最低层的粒度。如果粒度比较细,处理的代价会显著增加;但是,如果网格结构最低层的力度太粗,将会降低聚类分析的质量;而且,STING在构建一个父亲单元时没有考虑孩子单元和其相邻单元之间的关系,因此,结果簇的形状是isothetic,即所有的聚类边界或者是水平的,或者是竖直的,没有对角的边界。尽管该技术有快速的处理速度,但可能降低簇的质量和精确性。

WaveCluster算法

WaveCluster(Clustering with Wavelets)采用小波变换聚类,它是一种多分辨率的聚类算法,它首先通过在数据空间上加一个多维网格结构来汇总数据,然后采用一种小波变换来变换原特征空间,在变换后的空间中找到密集区域。

WaveCluster的计算复杂度是O(n),能有效地处理大数据集合;发现任意形状的簇;成功地处理孤立点;对于输入的顺序不敏感;不要求指定诸如结果簇的数目或邻域的半径等输入参数;在实验分析中,WaveCluster在效率和聚类质量上优于BIRCH,CLARANS和DBSCAN;实验分析也发现WaveCluster能够处理多达20维的数据。但是,对数学建模的知识要求较高[33]。

CLIQUE算法

CLIQUE(Clustering In QUEst)算法综合了基于密度和基于网格的聚类方法,它的中心思想是:首先,给定一个多维数据点的集合,数据点在数据空间中通常不是均衡分布的。CLIQUE区分空间中稀疏的和“拥挤的”区域(或单元),以发现数据集合的全局分布模式。接着,如果一个单元中的包含数据点超过了某个输入模型参数,则该单元是密集的。在CLIQUE中,簇定义为相连的密集单元的最大集合。

CLIQUE算法能自动发现最高维中所存在的密集聚类;它对输入数据元组顺序不敏感;也不需要假设(数据集中存在)任何特定的数据分布;它与输入数据大小呈线性关系;并当数据维数增加时具有较好的可扩展性。但是,在追求方法简单化的同时往往就会降低聚类的准确性。

5 基于模型的方法(model-based method)

基于模型的方法为每个簇假定了一个模型,寻找数据对给定模型的最佳拟合。一个基于模型的算法可能通过构建反映数据点空间分布的密度函数来定位聚类。它也基于标准的统计数字自动决定聚类的数目,考虑“噪声”数据或孤立点,从而产生健壮的聚类方法。基于模型聚类方法主要有两种:统计学方法和神经网络方法。

统计学方法

机器学习中的概念聚类就是一种形式的聚类分析。给定一组无标记数据对象,它根据这些对象产生一个分类模式。与传统聚类不同,后者主要识别相似的对象;而概念聚类则更进一步,它发现每组的特征描述;其中每一组均代表一个概念或类,因此概念聚类过程主要有两个步骤:首先完成聚类;然后进行特征描述。因此它的聚类质量不再仅仅是一个对象的函数;而且还包涵了其它因素,如所获特征描述的普遍性和简单性。

大多概念聚类都采用了统计方法,也就是利用概率参数来帮助确定概念或聚类。每个所获得的聚类通常都是由概率描述来加以表示[34]。

COBWEB是一种流行的简单增量概念聚类算法。它的输入对象用分类属性-值对来描述。它以一个分类树的形式创建层次聚类。分类树的每个节点对应一个概念,包含该概念的一个概率描述,概述被分在该节点下的对象。在分类树某个层次上的兄弟节点形成了一个划分。为了用分类树对一个对象进行分类,采用了一个部分匹配函数沿着“最佳”匹配节点的路径在树中向下移动。寻找可以分类该对象的最好节点。这个判定基于将对象临时置于每个节点,并计算结果划分的分类效用。产生最高分类效用的位置应当是对象节点一个好的选择。但如果对象不属于树中现有的任何概念,则为该对象创建一个新类。

CORWEB的优点在于:他不需要用户输入参数来确定分类的个数,它可以自动修正划分中类的数目。缺点是:首先,它基于这样一个假设:在每个属性上的概率分布是彼此独立的。由于属性间经常是相关的,这个假设并不总是成立。此外,聚类的概率分布表示使得更新和存储类相当昂贵。因为时间和空间复杂度不只依赖于属性的数目,而且取决于每个属性的值的数目,所以当属性有大量的取值时情况尤其严重。而且,分类树对于偏斜的输入数据不是高度平衡的,它可能导致时间和空间复杂性的剧烈变化。

神经网络方法

神经网络聚类方法是将每个簇描述成一个标本。标本作为聚类的一个“原型”;它不一定对应一个特定的数据实例或对象。可以根据新对象与哪个标本最相似(基于某种距离计算方法)而将它分派到相应的聚类中。可以通过聚类的标本来预测分派到该聚类的一个对象的属性。上一章对此已经作了详细描述,这里不再详述。

算法总结

基于划分聚类算法(partitionclustering)

算法 描述
k-means: 是一种典型的划分聚类算法,它用一个聚类的中心来代表一个簇,即在迭代过程中选择的
k-modes: K-Means算法的扩展,采用简单匹配方法来度量分类型数据的相似度
k-prototypes: 结合了K-Means和K-Modes两种算法,能够处理混合型数据
k-medoids: 在迭代过程中选择簇中的某点作为聚点,PAM是典型的k-medoids算法
CLARA: CLARA算法在PAM的基础上采用了抽样技术,能够处理大规模数据
CLARANS: CLARANS算法融合了PAM和CLARA两者的优点,是第一个用于空间数据库的聚类算法
Focused CLARAN: 采用了空间索引技术提高了CLARANS算法的效率
PCM: 模糊集合理论引入聚类分析中并提出了PCM模糊聚类算法

基于层次聚类算法:

算法 描述
CURE: 采用抽样技术先对数据集D随机抽取样本,再采用分区技术对样本进行分区,然后对每个分区局部聚类,最后对局部聚类进行全局聚类
ROCK: 也采用了随机抽样技术,该算法在计算两个对象的相似度时,同时考虑了周围对象的影响
CHEMALOEN(变色龙算法): 首先由数据集构造成一个K-最近邻图Gk ,再通过一个图的划分算法将图Gk划分成大量的子图,每个子图代表一个初始子簇,最后用一个凝聚的层次聚类算法反复合并子簇,找到真正的结果簇
SBAC: SBAC算法则在计算对象间相似度时,考虑了属性特征对于体现对象本质的重要程度,对于更能体现对象本质的属性赋予较高的权值
BIRCH: BIRCH算法利用树结构对数据集进行处理,叶结点存储一个聚类,用中心和半径表示,顺序处理每一个对象,并把它划分到距离最近的结点,该算法也可以作为其他聚类算法的预处理过程
BUBBLE: BUBBLE算法则把BIRCH算法的中心和半径概念推广到普通的距离空间
BUBBLE-FM: BUBBLE-FM算法通过减少距离的计算次数,提高了BUBBLE算法的效率

基于密度聚类算法:

算法 描述
DBSCAN: DBSCAN算法是一种典型的基于密度的聚类算法,该算法采用空间索引技术来搜索对象的邻域,引入了“核心对象”和“密度可达”等概念,从核心对象出发,把所有密度可达的对象组成一个簇
GDBSCAN: 算法通过泛化DBSCAN算法中邻域的概念,以适应空间对象的特点
DBLASD:
OPTICS: OPTICS算法结合了聚类的自动性和交互性,先生成聚类的次序,可以对不同的聚类设置不同的参数,来得到用户满意的结果
FDC: FDC算法通过构造k-d tree把整个数据空间划分成若干个矩形空间,当空间维数较少时可以大大提高DBSCAN的效率

基于网格的聚类算法:

算法 描述
STING: 利用网格单元保存数据统计信息,从而实现多分辨率的聚类
WaveCluster: 在聚类分析中引入了小波变换的原理,主要应用于信号处理领域。(备注:小波算法在信号处理,图形图像,加密解密等领域有重要应用,是一种比较高深和牛逼的东西)
CLIQUE: 是一种结合了网格和密度的聚类算法
OPTIGRID:

基于神经网络的聚类算法:

算法 描述
自组织神经网络SOM: 该方法的基本思想是–由外界输入不同的样本到人工的自组织映射网络中,一开始时,输入样本引起输出兴奋细胞的位置各不相同,但自组织后会形成一些细胞群,它们分别代表了输入样本,反映了输入样本的特征

基于统计学的聚类算法:

算法 描述
COBWeb: COBWeb是一个通用的概念聚类方法,它用分类树的形式表现层次聚类
CLASSIT:
AutoClass: 是以概率混合模型为基础,利用属性的概率分布来描述聚类,该方法能够处理混合型的数据,但要求各属性相互独立

几种常用的聚类算法从可伸缩性、适合的数据类型、高维性(处理高维数据的能力)、异常数据的抗干扰度、聚类形状和算法效率6个方面进行了综合性能评价,评价结果如表1所示:

算法名称 可伸缩性 适合的数据类型 高维性 异常数据的抗干扰性 聚类形状 算法效率
WaveCluster 很高 数值型 很高 较高 任意形状 很高
ROCK 很高 混合型 很高 很高 任意形状 一般
BIRCH 较高 数值型 较低 较低 球形 很高
CURE 较高 数值型 一般 很高 任意形状 较高
K-Prototypes 一般 混合型 较低 较低 任意形状 一般
DENCLUE 较低 数值型 较高 一般 任意形状 较高
OptiGrid 一般 数值型 较高 一般 任意形状 一般
CLIQUE 较高 数值型 较高 较高 任意形状 较低
DBSCAN 一般 数值型 较低 较高 任意形状 一般
CLARANS 较低 数值型 较低 较高 球形 较低

三、怎么选择聚类算法

对于一个聚类问题,要挑选最适合最高效的算法必须对要解决的聚类问题本身进行剖析,下面我们就从几个侧面分析一下聚类问题的需求。

聚类结果是排他的还是可重叠的

为了很好理解这个问题,我们以一个例子进行分析,假设你的聚类问题需要得到二个簇:“喜欢詹姆斯卡梅隆电影的用户”和“不喜欢詹姆斯卡梅隆的用户”,这其实是一个排他的聚类问题,对于一个用户,他要么属于“喜欢”的簇,要么属于不喜欢的簇。但如果你的聚类问题是“喜欢詹姆斯卡梅隆电影的用户”和“喜欢里奥纳多电影的用户”,那么这个聚类问题就是一个可重叠的问题,一个用户他可以既喜欢詹姆斯卡梅隆又喜欢里奥纳多。
所以这个问题的核心是,对于一个元素,他是否可以属于聚类结果中的多个簇中,如果是,则是一个可重叠的聚类问题,如果否,那么是一个排他的聚类问题。

基于层次还是基于划分

其实大部分人想到的聚类问题都是“划分”问题,就是拿到一组对象,按照一定的原则将它们分成不同的组,这是典型的划分聚类问题。但除了基于划分的聚类,还有一种在日常生活中也很常见的类型,就是基于层次的聚类问题,它的聚类结果是将这些对象分等级,在顶层将对象进行大致的分组,随后每一组再被进一步的细分,也许所有路径最终都要到达一个单独实例,这是一种“自顶向下”的层次聚类解决方法,对应的,也有“自底向上”的。其实可以简单的理解,“自顶向下”就是一步步的细化分组,而“自底向上”就是一步步的归并分组。

簇数目固定的还是无限制的聚类

这个属性很好理解,就是你的聚类问题是在执行聚类算法前已经确定聚类的结果应该得到多少簇,还是根据数据本身的特征,由聚类算法选择合适的簇的数目。

基于距离还是基于概率分布模型

基于距离的聚类问题应该很好理解,就是将距离近的相似的对象聚在一起。相比起来,基于概率分布模型的,可能不太好理解,那么下面给个简单的例子。
一个概率分布模型可以理解是在 N 维空间的一组点的分布,而它们的分布往往符合一定的特征,比如组成一个特定的形状。基于概率分布模型的聚类问题,就是在一组对象中,找到能符合特定分布模型的点的集合,他们不一定是距离最近的或者最相似的,而是能完美的呈现出概率分布模型所描述的模型。
下面图 1 给出了一个例子,对同样一组点集,应用不同的聚类策略,得到完全不同的聚类结果。左侧给出的结果是基于距离的,核心的原则就是将距离近的点聚在一起,右侧给出的基于概率分布模型的聚类结果,这里采用的概率分布模型是一定弧度的椭圆。图中专门标出了两个红色的点,这两点的距离很近,在基于距离的聚类中,将他们聚在一个类中,但基于概率分布模型的聚类则将它们分在不同的类中,只是为了满足特定的概率分布模型(当然这里我特意举了一个比较极端的例子)。所以我们可以看出,在基于概率分布模型的聚类方法里,核心是模型的定义,不同的模型可能导致完全不同的聚类结果。

python机器学习案例系列教程——聚类算法总结_第2张图片
图 1 基于距离和基于概率分布模型的聚类问题

你可能感兴趣的:(python大数据,机器学习,python大数据)