基于连通图的分裂聚类算法

参考文献:基于连通图动态分裂的聚类算法.作者:邓健爽 郑启伦 彭宏 邓维维(华南理工大学计算机科学与工程学院,广东广州510640)

我的算法库:https://github.com/linyiqun/lyq-algorithms-lib 

算法介绍

从文章的标题可以看出,今天我所介绍的算法又是一个聚类算法,不过他比较特殊,用到了图方面的知识,而且是一种动态的算法,与BIRCH算法一样,他也是一种层次聚类的算法,BIRCH算法是属于那种,一步步慢慢合并从而形成最终的聚类结果,而本文所描述的算法则恰巧相反,通过不断分裂直到最后不能在分裂下去为止,事实上,通过分裂实现的聚类的算法并不常见,平时说的比较多的这种算法就是chameleon算法,基于连通图的分裂聚类算法与此很类似,但又有少许的不同。首先声明这个算法的提出是出自于某篇学术论文,人家提出了这个思想,我去做了一下学习和实现,所以在这里分享一下。

算法的原理

算法的大的方向的阶段为2个阶段,第一个是根据坐标点的位置距离关系形成连通图。第二个阶段是将形成的多个连通图,进行逐一的分裂。图形化的表示过程如下,方便大家理解。



这么看来,和chameleon算法还是非常类似的。第一个步骤可以采用我的上一篇文章中用到的dbscan算法的思路,去深度优先搜索尽可能大的范围的点集,然后再用边将他们连接起来。这个如果不清楚的话,可以点击我的上一篇文章进行查阅。在这里会给定一个距离阈值l,这样就会生出基于距离l的连通图集。在上图中,就生成了2个连通图集,上面的一个和下面的一个。下面主要讲一下分裂的机理和过程,这也是整个算法的创新点和难点所在。

分裂的原理

分裂的原理采用了类似于扁担挑重物的形式,每一条边类似于一个扁担,坐标点在这里就是一个个的重物,如果扁担的2端的重物都非常重,那么扁担就容易断,于是就会分裂。举个例子如下:


但是我们要怎么去衡量一条边能不能够被分裂的标准呢,在这里定义了2个概念,承受系数t和分裂阈值landa。承受因为t就是要分裂的2部分中的较轻的一端的重量/连接2部分的边数,意思就是平均每条边所要承受的点的个数。公式如下:

t=min{W1,W2}/n,W1,W2为分割后的2部分的点的个数,n为2连接2部分的边的数量。

理解了这个,就很好分裂阈值了,分裂阈值就是当前针对全部的连通图,每条边的承受状况指数,你可以理解为就是总坐标点数/总边数。但是我们在这里采用更科学的方式进行计算,大意还是如上面描述的那样:


注意这里的x和y的关系,与上面的已经不一样了,至于这个公式为什么就不比刚刚的那个要好,就不是本文所论述的范畴了。截止到这里,我们就能得出一个比较条件了,就是当根据某条边进行分割的时候,如果此时计算出来的承受系数大于等于分裂阈值的时候,就表明此边是可以被分割掉的,也就是说,此时的连通图可以继续被拆分掉。算法的伪代码如下:

main()

{

Result r;

for-each每个连通图G

{

Graph[] graphs;

graphs = splitGraph(G)

r.add(graphs)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值