常见的聚类算法

 

涵盖 K-means 、 Mean-Shift 、 DBSCAN、基于高斯混合模型(GMM)的期望最大化(EM)聚类、凝聚层次聚类

 

 

K-means 算法

        K-means的假设是:将某一些数据分为不同的类别,在相同的类别中数据之间的距离应该都很近,也就是说离得越近的数据应该越相似,再进一步说明,数据之间的相似度与它们之间的欧式距离成反比。

过程:

K-mean中有两个关键的参数:一个是每个数据所属的类别;一个是每个聚类的中心{。这两个未知的参数是相互依存的:如果知道每个数据的所属类别,那么类别的所有数据的平均值就是这个类别的中心;如果知道每个类别的中心,那么就是计算数据与中心的距离,再根据距离的大小可以推断出数据属于哪一个类别。 


根据这个思路,使用EM算法来估计模型的参数。具体操作如下: 
1. 首先随机生成k个聚类中心点 
2. 根据聚类中心点,将数据分为k类。分类的原则是数据离哪个中心点近就将它分为哪一类别。 
3. 再根据分好的类别的数据,重新计算聚类的类别中心点。 
4. 不断的重复2和3步,直到中心点不再变化。如下图所示: 

 

优点:

       速度非常快,因为我们真正要做的就是计算点和组中心之间的距离;计算量少

缺点:

      1、首先,您必须先确定聚类的簇数量。理想情况下,对于一个聚类算法,我们希望它能帮我们解决这些问题,因为它的目的是从数据中获得一些洞察力。k-均值也从随机选择聚类中心开始,因此它可能在算法的不同运行中产生不同的聚类结果。因此,结果可能不可重复,缺乏一致性。

      2、K中位数是与K均值相关的另一种聚类算法,除了不使用平均值重新计算组中心点之外,我们使用组的中位数向量。这种方法对异常偏离值不太敏感(因为使用了中值),但对于较大的数据集来说要慢得多,因为在计算中值向量时,每次迭代都需要排序。

 

Mean-Shift 聚类

         Mean-shift 聚类是一个基于滑窗的算法,尝试找到数据点密集的区域。它是一个基于质心的算法,也就是说他的目标是通过更新中心点候选者定位每个组或类的中心点,将中心点候选者更新为滑窗内点的均值。这些候选滑窗之后会在后处理阶段被过滤,来减少临近的重复点,最后形成了中心点的集合和他们对应的组。

单滑窗的 Mean-Shift 聚类

1、为了解释 mean-shift,我们将考虑一个二维空间中的点集,像上图所示那样。我们以一个圆心在C点(随机选择)的圆形滑窗开始,以半径 r 作为核。Mean shift 是一个爬山算法,它每一步都迭代地把核移动到更高密度的区域,直到收敛位置。

2、在每次迭代时,通过移动中心点到滑窗中点的均值处,将滑窗移动到密度更高的区域(这也是这种算法名字的由来)。滑窗内的密度与在其内部点的数量成正比。很自然地,通过将中心移动到窗内点的均值处,可以逐步的移向有个高的密度的区域。

3、我们继续根据均值来移动滑窗,直到有没有哪个方向可以使核中容纳更多的点。查看上面的图,我们一直移动圆圈直到密度不再增长。(即窗内点的数量不再增长)。

4、用很多滑窗重复1-3这个过程,直到所有的点都包含在了窗内。当多个滑动窗口重叠时,包含最多点的窗口将被保留。然后,根据数据点所在的滑动窗口对数据点进行聚类。

与 K-means 聚类不同的是,Mean-Shift 不需要选择聚类的数量,因为mean-shift 自动发现它。这是一个很大的优点。事实上聚类中心向着有最大密度的点收敛也是我们非常想要的,因为这很容易理解并且很适合于自然的数据驱动的场景。缺点是滑窗尺寸/半径“r“的选择需要仔细考虑。

 

基于密度的带噪声的空间聚类的应用(DBSCAN)

DBSCAN 是一个基于密度的聚类算法,与 mean-shift 相似,但是有几个值得注意的优点。

1、DBSCAN 从一个任意的还没有被访问过的启动数据点开始。用一个距离 ε 将这个点的邻域提取出来(所有在距离 ε 内的点都视为邻居点)。

2、如果在邻域内有足够数量的点(根据 minPoints) ,那么聚类过程开始,并且当前数据点变成新集群中的第一个点。否则,该点将被标记为噪声(之后这个噪声点可能会变成集群中的一部分)。在这两种情况中的点都被标记为”已访问“。

3、对于这个新集群中的第一个点,在它 ε 距离邻域内的点已将变成相同集群中的一部分。这个让所有在 ε 邻域内的点都属于相同集群的过程在之后会一直被重复做,直到所有新点都被加进集群分组中。

4、第 2,3 步的过程会一直重复直到集群内所有点都被确定,即所有在 ε 邻域内的点都被访问且被打上标签。

5、一旦我们在当前集群做完这些,一个新的未被访问的点会被提取并处理,从而会接着发现下一个集群或噪声。这个过程反复进行直到所有的点都被编辑为已访问。既然在最后所有的点都被访问,那么每个点都被标记为属于一个集群或者是噪声。

相较于其他聚类算法,DBSCAN 提出了一些很棒的优点。首先,它根本不需要预置集群的数量。它还将离群值认定为噪声,不像 mean-shift 中仅仅是将它们扔到一个集群里,甚至即使该数据点的差异性很大也这么做。另外,这个算法还可以很好的找到任意尺寸核任意形状的集群。

SBSCAN 最大的缺点是当集群的密度变化时,它表现的不像其他算法那样好。这是因为当密度变化时,距离的阈值 ε 和用于确定邻居点的 minPoints 也将会随之改变。这个缺点也会发生在很高维的数据中,因为距离阈值 ε 变得很难被估计。

基于高斯混合模型(GMM)的期望最大化(EM)聚类

       k-means的一个主要缺点是它简单地使用了集群中心的平均值。通过下面的图片,我们可以看到为什么这不是最好的方式。在左手边,人眼可以很明显地看到,有两个半径不同的圆形星团以相同的平均值为中心。k-means不能处理这个问题,因为不同簇的平均值非常接近。当簇不是圆形时,k均值也会失效,这也是将均值用作簇中心的后果。

K-means不适用的case

      高斯混合模型(gmms)具有更好的灵活性比K-means。使用GMMs,我们需要假设数据点是高斯分布,相对于环形的数据而言,这个假设的严格程度与均值相比弱很多。这样的话,我们有两个参数来描述簇的形状:均值和标准差。以二维为例,意味簇可以是任何一种椭圆形(因为我们有两个标准差在x和y方向)。因此,每个高斯分布会被分配到单一的聚类簇。

为了在每个聚类簇中找到这两个高斯参数(e.g均值和标准差),我们将使用的优化算法称为expectation–maximization(EM)。请看下面的图片,以说明将高斯拟合聚类簇。然后,我们可以处理EM聚类过程使用gmms。

                           

使用GMMs的EM聚类

1、我们首先设定聚类簇的数量(如k-means),然后随机初始化每个集群的高斯分布参数。我们也可以通过快速查看数据来为初始参数提供一个很好的猜测。正如上图所示,这不是100%必要的,因为高斯操作开始时候是非常差的,但很快优化。

2、给定每个簇的高斯分布,计算每个数据点属于特定簇的概率。一个点越靠近高斯中心,它就越可能属于该簇。这应该是直观的,因为对于高斯分布,我们假设大多数数据都靠近集群的中心。

3、基于这些概率,我们为高斯分布计算了一组新的参数,这样我们就可以最大化群集中数据点的概率。我们使用数据点位置的加权和计算这些新参数,其中权重是属于特定集群的数据点的概率。为了以可视化的方式解释这一点,我们可以查看上面的图形,特别是以黄色集群为例。在第一次迭代中,分布是随机开始的,但是我们可以看到大多数黄点都在分布的右边。当我们计算一个由概率加权的和时,即使在中心附近有一些点,但大多数都在右边。因此,分布的平均值很自然地移近这些点集。我们还可以看到,大多数点是“从右上到左下”。因此,标准偏差会发生变化,以创建一个更适合这些点的椭圆,以便最大化概率加权的和。

4、第2步和第3步重复进行,直到收敛,也就是在收敛过程中,迭代变化不大。

 使用GMMS有两个关键优势。首先,GMMS在簇协方差方面比K均值灵活得多;由于标准偏差参数的存在,簇可以呈现任何椭圆形状,而不局限于圆形。k均值实际上是GMM的一个特例,其中每个簇的所有维协方差都接近于0。其次,由于GMM使用概率,因此每个数据点可以有多个集群。因此,如果一个数据点位于两个重叠集群的中间,我们可以简单地定义它的类,方法是说它属于类1的X%,属于类2的Y%。即GMMS支持混合成员。

 

凝聚层次聚类

       凝聚层次聚类算法实际上分为 2 类:自上而下或自下而上。自下而上算法在一开始将每个数据点当作一个单个集群对待,然后逐步的合并(或凝聚)成对的集群,直到所有的集群被合并到一个集群中,这个集群包含所有的点。自下而上层次聚类因此被叫做层次凝聚的聚类或者 HAC。这个聚类的层次被表示为一棵树(或者树状图)。树根是唯一的集群,他聚集了所有的样本,叶子是只有一个样本的集群。在接着看算法步骤之前,请查看下面的图示说明。

 

凝聚层次聚类

1、我们通过将每个点视作一个单个集群作为开始,即如果我们的数据集中有 X 个数据点,那么我们就有 X 个集群。我们然后选择一个距离度量标准来测量两个集群之间的距离。作为一个例子,我们将用到平均连接,它将两个集群之间的距离定义为第一个集群中的数据点与第二个集群中数据点的平均距离。

2、在每次迭代时,我们将两个集群组合成一个。两个将被组合的集群是在那些有最小平均连接的集群中选出来的,即根据我们选择的距离度量标准,这些两两集群之间有最小的距离,且因此是最相似的也最应该被组合。

3、一直重复第二步,直到我们到达树的根部,即我们只有一个包含所有数据点的集群。通过这种方法,我们仅仅通过选择停止组合的集群的时机,即选择何时停止树的构建,就可以挑选出最终我们想要的集群数。

层次聚类不要求我们指定集群的数目,并且我们甚至可以选择看上去最好的集群的数目,因为我们正在构建一棵树。另外,算法对于距离度量的选择也是不敏感的;所有的这些都和其他聚类算法的效果一样好,而对于其他算法,距离度量的选择是很关键的。层次聚类方法的一个典型的使用案例是当底层数据具有层次结构并且要恢复层次结构时; 其他聚类算法做不到这个。这些层次聚类的优点的代价是效率很低,因为它的时间复杂度是O(n),不像有线性复杂度的 K-Means 和 GMM 那样。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值