利用GN算法进行社区发现(原理+Python3实现)

文章来源于:利用GN算法实现社区发现

一、简介

GN算法是一个经典的社区发现算法,它属于分裂的层次聚类算法,最初,由Michelle Girvan和Mark Newman提出。其基本思想是不断的删除网络中具有相对于所有源节点的最大的边介数的边,然后,再重新计算网络中剩余的边的相对于所有源节点的边介数,重复这个过程,直到网络中,所有边都被删除。
边介数(betweenness)定义为网络中所有最短路径中经过该边的路径的数目.
介数反映了相应的节点或者边在整个网络中的作用和影响力,是一个重要的全局几何量,具有很强的现实意义。

二、算法原理

这个算法是这样做的。根据边的重要性将边一条一条的删去,那么随着边的删除,那些节点也会慢慢变成独立的子连通图。如下图:
在这里插入图片描述
所以,怎么来确定边的重要性了?一种估量方式就是Edge betweenness,它被定义为节点对之间的最短路径经过该条边的节点对数。举个栗子,假设图1是原始网络,节点旁边是节点编号;图2中边旁边是每条边的Edge betweenness,如边(3,4)的Edge betweenness是12,即共有{{1,4},{1,5},{1,6},{1,7},{2,4},{2,5},{2,6},{2,7},{3,4},{3,5},{3,6},{3,7}}这12对节点对的最短路径经过边(3,4)。
那么就可以算每条边的Edge betweenness了,然后排序取最大值对应的那条边删除,即图2。接着继续计算Edge betweenness,再删… (图3,4)。完整的算法逻辑如下:

1、计算所有边的betweenness;
2、移去betweenness最高的那条边;
3、重新计算剩余边的betweenness;
4、重复步骤2和3,直到没有边可被移去

三、评价方法

按上面的方法确实可以划分不同的社区(团体),但是会出现很多种划分方式,那么哪一种才是最好的呢?如上图,画出了图3和图4两种划分的团体。因此需要一个评估方法来评价哪种划分方式更合理。
作者是这样做的:
在这里插入图片描述
修正:eii是每个社区边数量(双向图),从所有的划分方式中选择Q值最大的方式作为最终的社区划分结果。

四、实验结果

在这里插入图片描述

五、实验代码

1、可以关注原创作者公众号,后台回复"社区发现"
在这里插入图片描述
2、https://github.com/DHButterfly/CommunityDetection

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值