聚类算法

1.K-Means算法(K均值聚类算法)划分聚类法

核心思想:由用户指定k个初始质心,以作聚类的类别,直至算法收敛
特点:局部最优,但容易受到初始质心的影响
算法:
repeat:
对每个样本点,计算得到距其最近的质心,将其类别标为该质心所对应的cluster
重新计算k个cluster对应的质心
until 质心不再发生变化
S S E = ∑ i = 1 k ∑ x ∈ G i d i s t ( x i , G i ) SSE=\sum_{i=1}^{k}\sum_{x\in G_i}dist(x_i,G_i) SSE=i=1kxGidist(xi,Gi)
Alt

2.(bisecting)K-Means(上述算法的优化)

核心思想:在初始时将所有数据当成一个聚簇,然后递归地将最不紧凑的聚簇用2-means拆分为2个聚簇,直至满意
特点:速度更快,可以克服K-Means算法收敛于局部最小值的问题
算法:
初始只有一个cluster包含所有样本点
repeat:
从带分裂的clusters中选择一个进行二元分裂,所选的cluster应使SSE最小
until 有k个cluster

3.K-Means++

核心思想:初始的聚类中心之间的相互距离要尽可能的远。
特点:速度更快
算法:
1.从输入的数据点集合中随机选择一个点作为第一个聚类中心
2.对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
3.选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
4.重复2和3直到k个聚类中心被选出来
5.利用这k个初始的聚类中心来运行标准的k-means算法

从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:

1.先从我们的数据库随机挑个随机点当“种子点”
2.对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
3.然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
4.重复2和3直到k个聚类中心被选出来
5.利用这k个初始的聚类中心来运行标准的k-means算法

4.均值漂移聚类(基于密度)

核心思想:均值漂移聚类是基于滑动窗口的算法,来找到数据点的密集区域。这是一个基于质心的算法,通过将中心点的候选点更新为滑动窗口内点的均值来完成,来定位每个组/类的中心点。然后对这些候选窗口进行相似窗口进行去除,最终形成中心点集及相应的分组。
特点:
优点:(1)不同于K-Means算法,均值漂移聚类算法不需要我们知道 有多少类/组。(2)基于密度的算法相比于K-Means受均值影响较小。
缺点:(1)窗口半径r的选择可能是不重要的。
算法:

  1. 确定滑动窗口半径r,以随机选取的中心点C半径为r的圆形滑动窗口开始滑动。均值漂移类似一种爬山算法,在每一次迭代中向密度更高的区域移动,直到收敛。
  2. 每一次滑动到新的区域,计算滑动窗口内的均值来作为中心点,滑动窗口内的点的数量为窗口内的密度。在每一次移动中,窗口会想密度更高的区域移动。
  3. 移动窗口,计算窗口内的中心点以及窗口内的密度,知道没有方向在窗口内可以容纳更多的点,即一直移动到圆内密度不再增加为止。
  4. 步骤一到三会产生很多个滑动窗口,当多个滑动窗口重叠时,保留包含最多点的窗口,然后根据数据点所在的滑动窗口进行聚类。

下图演示了均值漂移聚类的计算步骤:
Alt
下面显示了所有滑动窗口从头到尾的整个过程。每个黑点代表滑动窗口的质心,每个灰点代表一个数据点。
Alt

5.DBSCAN(基于密度的聚类方法)

核心思想:与4类似
特点:
优点:不需要知道簇的数量
缺点:需要确定距离r和minPoints
算法:

  1. 首先确定半径r和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点被标记为central point,反之则会被标记为noise point。
  2. 重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,知道所有的点都被访问过。

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

核心思想:使用高斯混合模型(GMM)做聚类首先假设数据点是呈高斯分布的,相对应K-Means假设数据点是圆形的,高斯分布(椭圆形)给出了更多的可能性。我们有两个参数来描述簇的形状:均值和标准差。所以这些簇可以采取任何形状的椭圆形,因为在x,y方向上都有标准差。因此,每个高斯分布被分配给单个簇。 所以要做聚类首先应该找到数据集的均值和标准差,我们将采用一个叫做最大期望(EM)的优化算法。

下图演示了使用GMMs进行最大期望的聚类过程。
Alt
特点:
(1)GMMs使用均值和标准差,簇可以呈现出椭圆形而不是仅仅限制于圆形。K-Means是GMMs的一个特殊情况,是方差在所有维度上都接近于0时簇就会呈现出圆形。
(2)GMMs是使用概率,所有一个数据点可以属于多个簇。例如数据点X可以有百分之20的概率属于A簇,百分之80的概率属于B簇。也就是说GMMs可以支持混合资格。

算法:

  1. 选择簇的数量(与K-Means类似)并随机初始化每个簇的高斯分布参数(均值和方差)。也可以先观察数据给出一个相对精确的均值和方差。
  2. 给定每个簇的高斯分布,计算每个数据点属于每个簇的概率。一个点越靠近高斯分布的中心就越可能属于该簇。
  3. 基于这些概率我们计算高斯分布参数使得数据点的概率最大化,可以使用数据点概率的加权来计算这些新的参数,权重就是数据点属于该簇的概率。
  4. 重复迭代2和3直到在迭代中的变化不大。

7.HAC 凝聚层次聚类

核心思想:凝聚层级聚类(HAC)是自下而上的一种聚类算法。HAC首先将每个数据点视为一个单一的簇,然后计算所有簇之间的距离来合并簇,知道所有的簇聚合成为一个簇为止。
下图为凝聚层级聚类的一个实例:
Alt
特点:
(1)不需要知道有多少个簇
(2)对于距离度量标准的选择并不敏感
缺点:效率低
算法:

  1. 首先我们将每个数据点视为一个单一的簇,然后选择一个测量两个簇之间距离的度量标准。例如我们使用average linkage作为标准,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。
  2. 在每次迭代中,我们将两个具有最小average linkage的簇合并成为一个簇。
  3. 重复步骤2知道所有的数据点合并成一个簇,然后选择我们需要多少个簇。

8.GCD 图团体检测(Graph Community Detection)

当我们的数据可以被表示为网络或图是,可以使用图团体检测方法完成聚类。在这个算法中图团体(graph community)通常被定义为一种顶点(vertice)的子集,其中的顶点相对于网络的其他部分要连接的更加紧密。

下图展示了一个简单的图,展示了最近浏览过的8个网站,根据他们的维基百科页面中的链接进行了连接。
Alt
模块性可以使用以下公式进行计算:
M = 1 2 L ∑ i , j = 1 N ( A i , j − k i k j 2 L δ C i C j ) M=\frac{1}{ 2L}\sum_{i,j=1}^{N}(A_{i,j}-\frac{k_{i}k_{j}}{2L}\delta_{C_{i}C_{j}} ) M=2L1i,j=1N(Ai,j2LkikjδCiCj)
其中L代表网络中边的数量, A i j A_{ij} Aij代表真实的顶点i和j之间的边数, k i , k j k_{i},k_{j} ki,kj代表每个顶点的degree,可以通过将每一行每一列的项相加起来而得到。两者相乘再除以2L表示该网络是随机分配的时候顶点i和j之间的预期边数。所以Aij−kikj2LAij−kikj2L代表了该网络的真实结构和随机组合时的预期结构之间的差。当AijAij为1时,且kikj2Lkikj2L很小的时候,其返回值最高。也就是说,当在定点i和j之间存在一个非预期边是得到的值更高。
δ C i C j \delta _{C_{i}C_{j}} δCiCj是克罗内克 δ \delta δ函数(Kronecker-delta function).
下面是其Python解释:

def Kronecker_Delta(ci,cj):
    if ci==cj:
        return 1
    else:
        return 0

通过上述公式可以计算图的模块性,且模块性越高,该网络聚类成不同团体的程度越好,因此通过最优化方法寻找最大模块性就能发现聚类该网络的最佳方法。
组合学告诉我们对于一个仅有8个顶点的网络,就存在4140种不同的聚类方式,16个顶点的网络的聚类方式将超过100亿种。32个顶点的网络的可能聚类方式更是将超过10^21种。因此,我们必须寻找一种启发式的方法使其不需要尝试每一种可能性。这种方法叫做Fast-Greedy Modularity-Maximization(快速贪婪模块性最大化)的算法,这种算法在一定程度上类似于上面描述的集聚层次聚类算法。只是这种算法不根据距离来融合团体,而是根据模块性的改变来对团体进行融合。

算法:

  1. 首先初始分配每个顶点到其自己的团体,然后计算整个网络的模块性 M。
  2. 第 1 步要求每个团体对(community pair)至少被一条单边链接,如果有两个团体融合到了一起,该算法就计算由此造成的模块性改变 ΔM。
  3. 第 2 步是取 ΔM 出现了最大增长的团体对,然后融合。然后为这个聚类计算新的模块性 M,并记录下来。
  4. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。
  5. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。

PS:本文经过转载和改动
转载原文:https://blog.csdn.net/Katherine_hsr/article/details/79382249

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值