各类聚类(clustering)算法初探

本文详细介绍了聚类算法的原理和应用场景,包括聚类的基本概念、K-means算法及其优化(K-means++)、基于链接的聚类(单链接、平均链接和最大链接)、DBSCAN以及Clustering by fast search and find of density peaks(CFSFDP)算法。文章讨论了聚类的公理化描述、数据挖掘对聚类的泛化要求,并对比了不同算法的优缺点。此外,还探讨了聚类在图像处理中的应用,以及聚类算法的局限性和选择合适的初始参数的重要性。
摘要由CSDN通过智能技术生成

1. 聚类简介

0x1:聚类是什么?

聚类是一种运用广泛的探索性数据分析技术,人们对数据产生的第一直觉往往是通过对数据进行有意义的分组。很自然,首先要弄清楚聚类是什么?

直观上讲,聚类是将对象进行分组的一项任务,使相似的对象归为一类,不相似的对象归为不同类

但是,要达到这个目的存在几个很困难的问题

1. 上述提及的两个目标在很多情况下是互相冲突的。从数学上讲,虽然聚类共享具有等价关系甚至传递关系,但是相似性(或距离)不具有传递关系。具体而言,假定有一对象序列,X1,....,Xm,所有相邻元素(Xi-1、Xi+1)两两都非常相似,但是X1和Xm非常不相似。这种情况常常发生在cluster超过一定尺寸的时候,元素之间的传递性假设在这些场景下不一定100%符合真实规律。
2. 另一个基本问题是聚类缺乏实际情况,这是无监督学习的共同问题。聚类是一种无监督学习,即我们不能预测label,因此对于聚类,我们没有明确的成功评估过程。
另一方面,对于一个给定的对象集合,可以有多种有意义的划分方式,这可能是因为对象间的距离(或相似性)有多种隐式的定义,例如将演讲者的录音根据演讲者的口音聚类或根据内容聚类。所以,给定一个数据集,有多种不同的聚类解决方案

0x2:聚类的公理化描述

对于各种各样的聚类算法,有没有一些基本性质是独立于具体算法或任务的呢?很多人尝试对聚类提出一个公理化的定义,让我们讨论Kleninberg(2003)提出的尝试方法:

考虑一个聚类函数F,将任意有限域X及不相似函数d作为输入,返回X的一个划分

1. 尺度不变性是一种非常自然的要求,如果聚类函数输出的结果依赖于测量点之间的距离测度单位,那将显得十分奇怪。
2. 丰富性要求主要想说明聚类函数的输出是由函数d全权决定,也是一种非常直观的特性。
3. 一致性要求是和聚类基本定义相关的要求,即我们希望相似的点聚到一类,不相似的点分属不同类,因此共享同类的点更相似,已经分离的点不相似,聚类函数应当对之前的聚类决策有很强的“支撑”作用

值得注意的是,Kleinberg在2003已经给出了下述“不可能”结论!

不存在一个函数F同时满足上述三种属性:尺度不变性,丰富性,一致性。

但是,Kleninberg的“不可能”结论可以通过改变属性的限制范围来规避。即不用100%满足上述三条件

例如,如果讨论含固定数量参数的聚类函数,很自然地将丰富性改为 k-丰富性(即,将域划分到k个子集,这个限制比丰富性RI原则更松散一些)。k-均值聚类满足k-丰富性、尺度不变性和一致性,因此能够达到一致。或者可以放松一致性属性

这反过来告诉我们。给定一项任务,聚类函数的选取必须考虑该任务的特定属性(是否可以放松要求,又是否有一些地方是需要强要求)。没有统一的聚类解决方案,就像没有一种分类算法能够对每一项可学习任务都能学习(no free lunch定理)。和其他分类预测一样,聚类必须考虑特定任务的先验知识

0x3:数据挖掘对聚类的典型泛化要求

不同的算法有着不同的应用背景,有的适合大数据集,可以发现任意形状的聚类;有的算法思想简单直观,适用于小数据集。总的来说,算法都试图从不同途径实现对数据集进行高效、可靠的聚类。数据挖掘对聚类的典型要求包括:

1. 可伸缩性:

当聚类对象由几百上升到几百万,我们希望最后的聚类结果的准确度能保持一致

2. 处理不同类型属性的能力:

有些聚类算法,其处理对象的属性的数据类型只能是数值类型,但是在实际应用场景中,我们往往会遇到其他类型的数据(例如二元数据),分类数据等等,虽然我们也可以在预处理数据时将这些其他类型的数据转换成数值型数据,但是在聚类效率上或者聚类准确度上往往会有折损

3. 发现任意形状的类簇:

因为许多聚类算法是基于距离(例如欧式距离或曼哈顿距离)来量化实例对象之间的相似度的,基于这种方式,我们往往只能发现相似尺寸和密度的球状类簇或者凸形类簇。但是在很多场景下,类簇的形状可能是任意的

4. 对聚类算法初始化参数的知识需求的最小化:

很多算法在分析过程中需要开发者提供一定的参数(例如期望的类簇K个数、类簇初始质心),这导致了聚类结果对这些参数是十分敏感的,这不仅加重了开发者的负担,也非常影响聚类结果的准确性

5. 处理噪声数据的能力:

所谓的噪声数据,可以理解为影响聚类结果的干扰数据,这些噪声数据的存在会造成聚类结果的“畸变”,最终导致低质量的聚类

6. 增量聚类和对输入次序的不敏感:

一些聚类算法不能将新加入的数据插入到已有的聚类结果,输入次序的敏感是指,对于给定的数据对象集合,以不同的次序提供输入对象时,最终产生的聚类结果的差异会比较大

7. 高维性:

有些算法只适合处理2维或者3维的数据,而对高维数据的处理能力很弱,因为在高维空间中数据的分布可能十分稀疏,而且高度倾斜。

8. 基于约束的聚类:

在实际应用中可能需要在各种条件下进行聚类,因为同一个聚类算法,在不同的应用场景中所带来的聚类结果也是各异的,因此找到满足“特定约束”的具有良好聚类特性的数据分组是十分有挑战的。这里最困难的问题就在于如何是识别我们要解决的问题中隐含的“特定约束”具体是什么,以及该使用什么算法来最好的“适配”这种约束

9. 可解释性和可用性:

我么希望得到的聚类结果都能用特定的语义、知识进行解释,和实际的应用场景相联系

0x4:聚类的大致分类

聚类是将数据对象的集合分成相似的对象类的过程。使得同一个簇(或类)中的对象之间具有较高的相似性,而不同簇中的对象具有较高的相异性。按照聚类的尺度,聚类方法可被分为以下三种

1. 基于距离的聚类算法: 基于距离的聚类算法是用各式各样的距离来衡量数据对象之间的相似度
2. 基于密度的聚类方法: 基于密度的聚类算法主要是依据合适的密度函数等
3. 基于互连性的聚类算法: 基于互连性的聚类算法通常基于图或超图模型,将高度连通的对象聚为一类

0x5:信息瓶颈 - 关于聚类的更一般化的原理讨论

信息瓶颈是由 Tishby,Pereira和 Bialek 提出的聚类技术,其概念来源于信息论。

用一个文本聚类的问题来解释这个概念,假设我们将每个文本表示为一个词袋,即,每个文档都是一个向量,其中 n 是字典的长度,当且仅当第 i 个词在文档中出现。给定一个有 m 个文档的集合,我们可以将 m 个文档的词袋表示理解为随机变量 x 的联合概率分布,指示文档的身份,以及一个随机变量 y,指示单词在词典中的身份。

根据这种解释,信息瓶颈是指:将聚类属性表示为另一个随机变量C(归纳到具体的类别 k 中)(其中 k 同样由方法确定)。一旦将 x,y,C 表述为随机变量,我们可以使用信息论中的方法来表示聚类目标。信息瓶颈的目标是:

其中是两个随机变量的互信息,在每个点分属聚类的所有可能概率分布中求取极小值。

直观上讲,我们希望达到两个矛盾的目标。

1)一方面,我们希望文档属性和聚类属性的互信息尽可能小,这反映了我们希望对原始数据进行强压缩。

2)另一方面,我们希望聚类变量和词属性的互信息尽可能大,这反映了保留文档信息(用词在文档中出现来表示)的目标。将参数统计中的最小充分统计量推广到了任意分布。

解信息瓶颈准则下的最优化问题通常是非常困难的,解决方案思路上类似EM准则

0x6:聚类的进阶观点

我们这个小节来讨论一些抽象的概念,例如聚类是什么?聚类算法和输入一个空间输出一个空间分布的任意函数的区别是什么?聚类有没有一些基本性质是独立于具体算法或任务的。

回答这些问题的一种方式是公理化方法,考虑一个聚类函数 F,将任意有限域 X 及不相似函数 d 作为输入,返回 X 的一个划分,考虑这类函数的三种特性:

1. 尺度不变性(SI)

对任意的域集 X,不相似函数 d,以及任意的 a > 0,下式成立:

尺度不变性是一种非常自然的要求,因为如果聚类函数输出的结果依赖于测量点之间的距离测度单元,那将显得十分奇怪和不合理。

2. 丰富性(Ri)

对任意的有限集 X 和划分 C = (C1,C2,....,Ck)(划分到非空子集),存在多种不相似函数 d 使得

丰富性要求主要想说明聚类函数的输出是由函数 d 全权决定,也是一种十分直观的特征。

3. 一致性(Co)

如果 d 和 d' 都是 X 上的不相似函数,对任一,根据 F(X,d):

如果 x,y 属于同一类,则

如果 x,y 属于不同类,则

那么

一致性要求是和聚类基本定义相关的要求,我们希望相似的点聚到一类,不相似的点分属不同类,因此共享同类的点更相似,已经分离的点不相似,聚类函数应当对之前的聚类决策有很强的“支撑”作用。

给定一项任务,聚类函数的选取必须考虑该任务的特定属性,没有同意的聚类解决方案,就像没有一种分类算法能够对每一项可学习任务都能学习(没有免费的午餐定理)。

和其他分类预测一样,聚类必须考虑特定任务的先验知识。

Relevant Link:

《深入理解机器学习 - 从原理到算法》
http://blog.csdn.net/itplus/article/details/10087581
http://www.sohu.com/a/193777221_473283

 

1. K-Means算法(K-means clustering K均值聚类算法) - 基于划分的聚类

0x1:K-means算法模型

一种流行的聚类算法是首先对可能的聚类定义一个代价函数,聚类算法的目标是寻找一种使代价最小的划分。

在这类范例中,聚类任务转化为一个优化问题,目标函数是一个从输入(X,d)和聚类方案 C = (C1,C2,....,Ck)映射到正实数(即损失值)的函数。

给定这样一个目标函数,我们将其表示为 G,对于给定的一个输入(X,d),聚类算法的目标被定义为寻找一种聚类 C 使 G((X,d),C)最小。

其中,Ci 中心点被定义为:

所以上式也可以写成如下形式:

为了达到上述目标,需要运行一些合适的搜索算法。

但是要注意的是,理论和实际的工程化是存在一定的差距的。k均值目标函数在实际的聚类应用中很常见。然而,事实证明寻找k均值(k-means)算法的最优解通常是计算不可行的(NP问题,甚至接近常数近似解的求解是NP问题)。所以通常会用下面这种简单的迭代算法作为替代算法

因此,多数情况下,k均值聚类值得是这种算法的结果而不是最小化 k 均值目标函数的结果

需要注意的是,k均值算法的目标函数优化过程是单调非增的(也就是每次的迭代至少不会让结果更糟),但是 k均值算法本身对达到收敛的迭代次数并没有给出理论保证。

此外,算法给出的 k均值目标函数输出值和目标函数的最小可能值之差,并没有平凡下界,实际上,k均值可能会收敛到局部最小值。为了提高 k均值的结果,通常使用不同的随机初始化中心点,将该程序运行多次,并选取最优的结果。

除此之外,有一些无监督的算法可以作为 k均值算法的前置算法,用来选取初始化中心。

0x2:K-means算法过程

kMeans聚类算法是数据挖掘十大算法之一,算法需要接受参数 k(k 个初始聚类中心)(也可由算法随机产生指定),即将数据集进行聚类的数目和k个簇的初始聚类“中心”,结果是同一类簇中的对象相似度最高,不同类簇中的数据相似度最低,其聚类过程可以用下图表示

如图所示,数据样本用圆点表示,每个簇的中心点用叉叉表示

1. 聚类中心个数K

聚类中心的个数K需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。这个过程会是一个漫长的调试过程,我们通过设置一个[k, k+n]范围的K类值,然后逐个观察聚类结果,最终决定该使用什么K值对当前数据集是最佳的

在实际情况中,往往是对特定的数据集有对应一个最佳的K值,而换一个数据集,可能原来的K值效果就会下降。但是同一个项目中的一类数据,总体上来说,通过一个抽样小数据集确定一个最佳K值后,对之后的所有K值都能获得较好的效果

2. 初始聚类中心(质心)的选择

刚开始时是原始数据,杂乱无章,没有label,看起来都一样,都是绿色的

Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。在实际使用中我们往往不知道我们的待聚类样本中哪些是我们关注的label,人工事先指定质心基本上是不现实的,在大多数情况下我们采取随机产生聚类质心这种策略

假设数据集可以分为两类,令K = 2,随机在坐标上选两个点,作为两个类的中心点(聚类质心)

3. 确定了本轮迭代的质心后,将余下的样本点根据距离度量标准进行归类

这一步也非常直观,计算样本点和所有质心的“距离”,选取“距离”最小(argmin)的那个质心作为该样本所属的类别。

这里要注意的是,特征空间中两个实例点的距离是两个实例点相似程度的反映,高维向量空间点的距离求解,可以泛化为Lp距离公式,它在不同的阶次数中分为不同的形式

p = 1:Manhattan Distance距离(曼哈顿距离):
p = 2:Euclidean Distance距离(欧拉距离):
p = λ( 3 <= λ <= 正无穷 ) - Lp距离
p = 正无穷:距离等于各个坐标点的最大值

为了帮助理解,下图展示了二维空间中p取不同值时,与原点的Lp距离为1(Lp = 1)的点的图形

4. 算法收敛(终止/停机)条件是什么?

我们前面说过,计算K-means问题的目标函数最优解是一个NP问题,我们大多数时候都是针对聚类结果施加一些约束,得到一个终止/停止条件,例如一种比较常用的停止条件:

这样不断进行"划分—更新—划分—更新",直到每个簇的中心不在移动为止

0x3:Kmeans算法步骤图示描述

1. 步骤一 - 选取质心

在输入数据集里面随机选择三个向量作为初始中心点(下图中的红绿蓝三个圆点),这里的K值为3, 也就是一开始从数据集里面选择了三个向量,这算作第一次迭代

2. 步骤二 - 距离聚类

将每个向量分配到离各自最近的中心点,从而将数据集分成了K个类

3. 步骤三 - 重选新质心

计算得到上步得到聚类中每一聚类观测值的均值作为新的质心。这里体现的思想是这样的:因为我们是无监督学习,对于待分类的样本集群我们没有任何的先验知识,完全不知道该怎么分类,那么我们就暴力地、勇敢地、随机地踏出第一步,然后不断地去修正我们的分类器,不得不说,这和人生的很多的做人做事的道理是类似的

4. 步骤四(人生就是一个勇敢踏出第一步,然后不断自我否定和修正成长的过程)

重复步骤三,直至结果收敛,这里的收敛是指所有点到各自中心点的距离的和收敛

用sklearn python 对2维数据点进行kMeans聚类 

# -*- coding: utf-8 -*-

from sklearn.cluster import KMeans
import numpy as np

if __name__ == '__main__':
    X = np.array([
        [1, 2], [1, 4], [1, 0],
        [4, 2], [4, 4], [4, 0]
    ])
    kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
    print kmeans.labels_

    kmeans.predict([[0, 0], [4, 4]])

    print kmeans.cluster_centers_

kMeans这种无监督聚类进行一次无监督聚类后,也可以得到一个分类器(classifier),它是对当前train set的一个特征空间划分,基于这个分类器可以用于之后对新样本点的分类预测,这种就是有监督聚类

0x4:不同K值、不同的初始化中心点方式对Kmeans分类效果的影响

我们知道,K-mean的3大核心要素是:K值、距离度量公式、初始质心的选择。我们这个小节用一小代码来讨论下这些值是如何影响算法的分类效果

# -*- coding:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值