聚类算法

1 聚类简述

        聚类就是按照某个特定标准(如距离准则,即数据点之间的距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。我们可以具体地理解为,聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。
       聚类技术正在蓬勃发展,对此有贡献的研究领域包括数据挖掘、统计学、机器学习、空间数据库技术、生物学以及市场营销等。各种聚类方法也被不断提出和改进,而不同的方法适合于不同类型的数据,因此对各种聚类方法、聚类效果的比较成为值得研究的课题。

聚类的衡量指标

3 聚类的分类

(1)划分聚类  k-means、k-medoids、k-modes、k-medians、kernel k-means

(2)层次聚类  Agglomerative 、divisive、BIRCH、ROCK、Chameleon

(3)密度聚类 DBSCAN、OPTICS、均值漂移

(4)网格聚类  STING

(5)模型聚类  GMM

(6)图聚类  Spectral Clustering(谱聚类)

3.1 k-means聚类算法


       k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。
       k-means算法目标是,以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。

       k-means算法的处理过程如下:首先,随机地选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。 这个过程不断重复,直到准则函数收敛。通常,采用平方误差准则,其定义如下:
 
      这里E是数据库中所有对象的平方误差的总和,p是空间中的点,mi是簇Ci的平均值。该目标函数使生成的簇尽可能紧凑独立,使用的距离度量是欧几里得距离,当然也可以用其他距离度量。k-means聚类算法的算法流程如下:
输入:包含n个对象的数据库和簇的数目k;
输出:k个簇,使平方误差准则最小。
步骤:
  (1) 任意选择k个对象作为初始的簇中心;
  (2) repeat;
  (3) 根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇;
  (4) 更新簇的平均值,即计算每个簇中对象的平均值;
  (5) until不再发生变化。

总结:

       优点:简单直接(体现在逻辑思路以及实现难度上),易于理解,在低维数据集上有不错的效果(简单的算法不见得就不能得到优秀的效果)。

       缺点:对于高维数据(如成百上千维,现实中还不止这么多),其计算速度十分慢,主要是慢在计算距离上(参考欧几里得距离,当然并行化处理是可以的,这是算法实现层面的问题),它的另外一个缺点就是它需要我们设定希望得到的聚类数k,若我们对于数据没有很好的理解,那么设置k值就成了一种估计性的工作。

算法改良:

K-Mediods聚类(K中值聚类):为了解决K-means对离群点敏感的问题,不是用均值来决定簇中心点,而是用中值来决定中心点。

K-Means++算法:

为了解决K-Means算法对初始簇心比较敏感的问题:

  • 从数据集中任选一个节点作为第一个聚类中心
  • 对数据集中的每个点x,计算x到所有已有聚类中心点的距离和D(X),距离较远的一个点成为新增的一个聚类中心点。
  • 重复步骤2直到找到k个聚类中心点

算法缺点:由于聚类中心点选择过程中的内在有序性,在扩展方面存在着性能方面的 问题(第k个聚类中心点的选择依赖前k-1个聚类中心点的值)

Canopy算法:

Canopy算法结合K-means:为了解决K-means需要设定K值,能够缓解K-Means算法对于初始聚类中心点敏感的问题

  • 先验值r1和r2,r1<D<r2
  • 从列表中选出一个点P,计算它到所有簇中心的距离(如果没有,他就是簇中心),取最小的距离D。 
  •        如果D>r2,则P是一个新的簇中心点。
  •        如果r1 << D<<r2,则P是属于这个簇。
  • D<<r1,表示该节点不仅仅属于该聚簇,还表示和当前聚簇中心点非常近,所 以将该聚簇的中心点设置为P,并将P从列表L中删除
  • 直到列表L中的元素数据不再有变化或者元素数量为0的时候,结束循环操作

聚类的结果作为初值再进行k-means聚类。

3.2 层次聚类算法

层次聚类算法分为两类:自上而下和自下而上。凝聚层级聚类(HAC)是自下而上的一种聚类算法。HAC首先将每个数据点视为一个单一的簇,然后计算所有簇之间的距离来合并簇,知道所有的簇聚合成为一个簇为止。
下图为凝聚层级聚类的一个实例:
这里写图片描述
具体步骤:
1. 首先我们将每个数据点视为一个单一的簇,然后选择一个测量两个簇之间距离的度量标准。例如我们使用average linkage作为标准,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。
2. 在每次迭代中,我们将两个具有最小average linkage的簇合并成为一个簇。
3. 重复步骤2知道所有的数据点合并成一个簇,然后选择我们需要多少个簇。
层次聚类优点:(1)不需要知道有多少个簇
(2)对于距离度量标准的选择并不敏感
缺点:效率低 

凝聚的层次聚类:AGNES算法

采用自底向上的策略。最 初将每个对象作为一个簇,然后这些簇根据某些准则被一步一步合并,两个簇间的距离可 以由这两个不同簇中距离最近的数据点的相似度来确定;聚类的合并过程反复进行直到所 有的对象满足簇数目。

  • 最小距离(SL聚类):
    两个聚簇中最近的两个样本之间的距离(single/word-linkage聚类法),缺点:最终得到模型容易形成链式结构
  • 最大距离(CL聚类):
    两个聚簇中最远的两个样本的距离(complete-linkage聚类法),缺点:如果存在异常值,那么构建可能不太稳定
  • 平均距离(AL聚类):
    两个聚簇中样本间两两距离的平均值(average-linkage聚类法) 两个聚簇中样本间两两距离的中值(median-linkage聚类法)

优化算法:
BIRCH算法(平衡迭代削减聚类法):聚类特征使用3元组进行一个簇的相关信息, 通过构建满足分枝因子和簇直径限制的聚类特征树来求聚类,聚类特征树其实是 一个具有两个参数分枝因子和类直径的高度平衡树;分枝因子规定了树的每个节 点的子女的最多个数,而类直径体现了对这一类点的距离范围;非叶子节点为它 子女的最大特征值;聚类特征树的构建可以是动态过程的,可以随时根据数据对 模型进行更新操作。
优缺点:
适合大规模数据集,线性效率; 但只适合分布呈凸形或者球形的数据集、需要给定聚类个数和簇之间的相关参数;

CURE算法(使用代表点的聚类法):该算法先把每个数据点看成一类,然后合并距 离最近的类直至类个数为所要求的个数为止。但是和AGNES算法的区别是:取 消了使用所有点或用中心点+距离来表示一个类,而是从每个类中抽取固定数量、 分布较好的点作为此类的代表点,并将这些代表点乘以一个适当的收缩因子,使 它们更加靠近类中心点。代表点的收缩特性可以调整模型可以匹配那些非球形的 场景,而且收缩因子的使用可以减少噪音对聚类的影响
优缺点:
能够处理非球形分布的应用场景 采用随机抽样和分区的方式可以提高算法的执行效率

分裂的层次聚类:DIANA算法(DIvisive ANALysis)

采用自顶向下的策略。首先将所 有对象置于一个簇中,然后按照某种既定的规则逐渐细分为越来越小的簇(比如最大的欧式 距离),直到达到某个终结条件(簇数目或者簇距离达到阈值)。

3.3 密度聚类算法

密度聚类方法的指导思想: 只要样本点的密度大于某个阈值,则将该样本添加到最近的簇中,这类算法可以克服基于距离的算法只能发现凸聚类的缺点,可以发现任意形状的聚类,而且对噪声数据不敏感。但计算复杂度高,计算量大。

DBSCAN

一个比较有代表性的基于密度的聚类算法,相比于基于划分的聚类方法和层次聚类方法,DBSCAN算法将簇定义为密度相连的点的最大集合,能够将足够高密度的区域划分为簇,并且在具有噪声的空间数据商能够发现任意形状的簇。DBSCAN算法的核心思想是:用一个点的邻域内的邻居点数衡量该点所在空间的密度,该算法可以找出形状不规则的簇,而且聚类的时候事先不需要给定簇的数量。
具体步骤:
1. 首先确定半径r和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点被标记为central point,反之则会被标记为noise point。
2. 重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,知道所有的点都被访问过。
优点:不需要知道簇的数量
缺点:需要确定距离r和minPoints 

MDCA(Maximum Density Clustering Application)

算法基于密度的思想引入划分聚类中,使用密度而不是初始点作为考察簇归属情况的依据,能够自动确定簇数量并发现任意形状的簇,另外MDCA一般不保留噪声,因此也避免了阈值选择不当情况下造成的对象丢弃情况。MDCA算法的基本思路是寻找最高密度的对象和它所在的稠密区域,MDCA算法在原理上来讲,和密度的定义没有关系,采用任意一种密度定义公式均可,一般情况下采用DBSCAN算法中的密度定义方式。

均值漂移聚类

均值漂移聚类是基于滑动窗口的算法,来找到数据点的密集区域。这是一个基于质心的算法,通过将中心点的候选点更新为滑动窗口内点的均值来完成,来定位每个组/类的中心点。然后对这些候选窗口进行相似窗口进行去除,最终形成中心点集及相应的分组。
具体步骤:
1. 确定滑动窗口半径r,以随机选取的中心点C半径为r的圆形滑动窗口开始滑动。均值漂移类似一种爬山算法,在每一次迭代中向密度更高的区域移动,直到收敛。
2. 每一次滑动到新的区域,计算滑动窗口内的均值来作为中心点,滑动窗口内的点的数量为窗口内的密度。在每一次移动中,窗口会想密度更高的区域移动。
3. 移动窗口,计算窗口内的中心点以及窗口内的密度,知道没有方向在窗口内可以容纳更多的点,即一直移动到圆内密度不再增加为止。
4. 步骤一到三会产生很多个滑动窗口,当多个滑动窗口重叠时,保留包含最多点的窗口,然后根据数据点所在的滑动窗口进行聚类。
下图演示了均值漂移聚类的计算步骤:
这里写图片描述
下面显示了所有滑动窗口从头到尾的整个过程。每个黑点代表滑动窗口的质心,每个灰点代表一个数据点。
这里写图片描述
优点:(1)不同于K-Means算法,均值漂移聚类算法不需要我们知道有多少类/组。
(2)基于密度的算法相比于K-Means受均值影响较小。
缺点:(1)窗口半径r的选择可能是不重要的。

3.4 模型聚类:用高斯混合模型(GMM)的最大期望(EM)聚类

K-Means的缺点在于对聚类中心均值的简单使用。下面的图中的两个圆如果使用K-Means则不能作出正确的类的判断。同样的,如果数据集中的点类似下图中曲线的情况也是不能正确分类的。
这里写图片描述
使用高斯混合模型(GMM)做聚类首先假设数据点是呈高斯分布的,相对应K-Means假设数据点是圆形的,高斯分布(椭圆形)给出了更多的可能性。我们有两个参数来描述簇的形状:均值和标准差。所以这些簇可以采取任何形状的椭圆形,因为在x,y方向上都有标准差。因此,每个高斯分布被分配给单个簇。
所以要做聚类首先应该找到数据集的均值和标准差,我们将采用一个叫做最大期望(EM)的优化算法。下图演示了使用GMMs进行最大期望的聚类过程。
这里写图片描述
具体步骤:
1. 选择簇的数量(与K-Means类似)并随机初始化每个簇的高斯分布参数(均值和方差)。也可以先观察数据给出一个相对精确的均值和方差。
2. 给定每个簇的高斯分布,计算每个数据点属于每个簇的概率。一个点越靠近高斯分布的中心就越可能属于该簇。
3. 基于这些概率我们计算高斯分布参数使得数据点的概率最大化,可以使用数据点概率的加权来计算这些新的参数,权重就是数据点属于该簇的概率。
4. 重复迭代2和3直到在迭代中的变化不大。
GMMs的优点:(1)GMMs使用均值和标准差,簇可以呈现出椭圆形而不是仅仅限制于圆形。K-Means是GMMs的一个特殊情况,是方差在所有维度上都接近于0时簇就会呈现出圆形。
(2)GMMs是使用概率,所有一个数据点可以属于多个簇。例如数据点X可以有百分之20的概率属于A簇,百分之80的概率属于B簇。也就是说GMMs可以支持混合资格。

3.5 谱聚类

谱聚类是一种基于图论的一种聚类方法,我希望通过一种比较直观的方式给大家解释清楚它到底在干什么。

首先引入几个概念,谱聚类肯定要讲什么是谱,还有就是相似度矩阵,度矩阵和拉普拉斯矩阵。

谱:方阵的特征值(不是方阵的话就是左乘其转置所得方阵的特征值)称之为谱,其中最大值称为谱半径。

相似度矩阵W:n个样本则建立一个n*n的矩阵,矩阵第i行第j列的值为第i个样本和第j个样本的某种相似度。

度矩阵D:一个n*n的对角阵,第i行第i列的值为相似度矩阵中第i行的所有值之和。

拉普拉斯矩阵L:度矩阵减去相似度矩阵即为拉普拉斯矩阵。

好了,基于以上这些概念,我们来考虑这样一种情况。对于这样m个样本,它们是属于同一类的,那么它们是不是可以建立一个m*m的相似度矩阵W,该矩阵还是个对称阵,紧接着可以求得它的度矩阵和拉普拉斯矩阵,巧就巧在这个矩阵是个半正定的,证明如下

 

所以拉普拉斯矩阵的特征值大于等于0。从度矩阵的定义我们知道,它的对角元素等于相似度矩阵每一行的和,因此拉普拉斯矩阵乘以一个全1的向量得到全为0的一个列向量,因此拉普拉斯矩阵存在一个0的特征值,对应特征向量为全1向量,也就是说

 

同样的假如有另外一个类的n个样本,同样的,对于它而言,有

 

假设这两个类的样本毫无相似度,那么它们两个样本混合在一起的相似度矩阵可以表示为

 

我们已经知道Lm和Ln对应于特征值0的特征向量了,那么可以求得L对于m的两个特征向量

 

那么我们可以明显的看到,对应于L最小特征值0的两个特征向量可以明显的把两个种类分开,所以推广开来我们就知道,通过拉普拉斯矩阵最小的K个特征值对应的特征向量进行聚类,我们就能确定对应的样本所属的类别。当然现实情况中不可能像我们推导的这么美丽,全1全0的情况很少出现,因为样本之间多多少少有些藕断丝连的关系,但据此对特征向量进行聚类就已经能确定样本所属的种类,这就是我们所说的谱聚类。

最后重复一下谱聚类的算法过程

1 计算相似度矩阵,度矩阵及拉普拉斯矩阵。

2 计算拉普拉斯矩阵前K小的特征值对应的特征向量。

3 将这K个特征向量组成一个新的矩阵,对其行向量进行聚类。

4 行向量的聚类结果代表了原始样本的聚类结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值