社区发现FN算法Python实现

算法原理

评价指标

结果对比

源码

​2004年,Newman在GN(Girvan and Newman, 2002)算法的基础上,提出了另外一种快速检测社区的算法,称为FN算法。该算法能得到和GN算法相似的结构,但是时间复杂度更低,GN算法的时间复杂度为O ( m 2 n ) O(m^2n)O(m2n),FN算法的时间复杂度为O ( ( m + n ) n ) O((m+n)n)O((m+n)n),其中,m mm是边的数量,n nn是节点的数量。此处给出FN算法的Python实现,并给出对比实验以及社区发现的三种评价指标。

Newman, M. E. J. ,2004. Fast algorithm for detecting community structure in networks. phys rev e stat nonlin soft matter phys, 69, 066133.

去看原文

算法原理

FN算法是一种层次聚类算法。起初每个节点都是一个类。每次合并让Q值增加(即Δ Q \Delta{Q}ΔQ)最大的一对节点,重复这个过程,直到所有节点都在一个社区为止。在这个合并的过程中,选择Q值(社区发现评估指标)最大的作为最终划分结果。

Δ Q = 2 ( e i j − a i a j ) \Delta{Q}=2(e_{ij}-a_ia_j)ΔQ=2(eij​−ai​aj​)

其中,e i j e_{ij}eij​表示连接社区i ii和社区j jj的边的比例;a i a_iai​表示连接到社区i ii的所有末端节点比例,a i = ∑ j e i j a_i=\sum_j{e_{ij}}ai​=∑j​eij​。以下是一个合并的结构图,从下往上进行合并。

评价指标

社区发现的评估指标主要有三个:互信息和标准化互信息(Normalized Mutual Information,NMI指数)、调整兰德指数(Adjusted Rand Index,ARI指数)、模块度Q(modularity Q)。

当无法获取真实社区划分结果时,可以采用模块度Q来评价。Modularity用于评判社区划分结果的优劣。模块度越大则表明社区划分效果越好,其范围在[ − 0.5 , 1 ) [-0.5,1)[−0.5,1),论文(Newman, 2003)表示当Q值在0.3~0.7之间时,说明聚类的效果很好。

Q = ∑ i = 1 n ( e i i − a i 2 ) Q=\sum_{i=1}^{n}(e_{ii}-a_i^2)Q=i=1∑n​(eii​−ai2​)

其中e i j = ∑ v w A v w 2 m e_{ij}=\sum_{vw}\frac{A_{vw}}{2m}eij​=∑vw​2mAvw​​,a i = k i 2 m = ∑ j e i j a_i=\frac{k_i}{2m}=\sum_je_{ij}ai​=2mki​​=∑j​eij​。

m mm表示边的数量,e i j e_{ij}eij​表示一个节点在社区i ii内,另一个节点在社区j jj内的边的比例。e i i e_{ii}eii​表示在社区i ii内所有的边与整个网络所有的边的一个比值(一个社区内部的度比上整个网络的度),而a i a_{i}ai​则表示i社区内的节点的度(包含了一点在社区i ii内一点在社区i ii外的边的度)占整个网络的度比值。

可将模块度用矩阵形式表示,即

Q = 1 2 m T r ( S T B S ) Q=\frac{1}{2m}Tr(S^TBS)Q=2m1​Tr(STBS)

其中,B i j = A i j − k i k j 2 m B_{ij}=A_{ij}-\frac{k_ik_j}{2m}Bij​=Aij​−2mki​kj​​,k i k_iki​代表的是节点i ii的度,A i j A_{ij}Aij​为邻接矩阵; S SS为每个节点所属社区的one-hot表示,S i r = 1 S_{ir}=1Sir​=1表示第i ii个节点属于第r rr社区。

当已知真实社区划分结果时,可采用NMI指数和ARI指数进行评价。

1.NMI指数

如果结果越相似NMI值应接近1;结果很差则NMI值接近0。

N M I ( X , Y ) = 2 M I ( X , Y ) H ( X ) + H ( Y ) NMI(X,Y)=\frac{2MI(X,Y)}{H(X)+H(Y)}NMI(X,Y)=H(X)+H(Y)2MI(X,Y)​

其中,M I ( X , Y ) = ∑ i = 1 ∣ X ∣ ∑ j = 1 ∣ Y ∣ P ( i , j ) l o g ( P ( i , j ) P ( i ) P ′ ( j ) ) MI(X,Y)=\sum_{i=1}^{|X|}\sum_{j=1}^{|Y|}P(i,j)log(\frac{P(i,j)}{P(i)P'(j)})MI(X,Y)=∑i=1∣X∣​∑j=1∣Y∣​P(i,j)log(P(i)P′(j)P(i,j)​);H ( X ) = − ∑ i = 1 ∣ X ∣ P ( i ) l o g ( P ( i ) ) H(X)=-\sum_{i=1}^{|X|}P(i)log(P(i))H(X)=−∑i=1∣X∣​P(i)log(P(i));H ( Y ) = − ∑ j = 1 ∣ Y ∣ P ′ ( j ) l o g ( P ′ ( j ) ) H(Y)=-\sum_{j=1}^{|Y|}P'(j)log(P'(j))H(Y)=−∑j=1∣Y∣​P′(j)log(P′(j)),X , Y X,YX,Y是划分类别唯一标签和真实类别唯一标签。

以下将用一个例子来介绍如何计算。

输出的划分结果:A=[1 2 1 1 1 1 1 2 2 2 2 3 1 1 3 3 3]

真实的划分结果:B=[1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3]

那么X = u n i q u e ( A ) = [ 1 , 2 , 3 ] , Y = u n i q u e ( B ) = [ 1 , 2 , 3 ] X=unique(A)=[1,2,3],Y=unique(B)=[1,2,3]X=unique(A)=[1,2,3],Y=unique(B)=[1,2,3],

P ( i , j ) P(i,j)P(i,j)表示同时属于社区i ii和社区j jj的节点的联合概率,P ( i , j ) = ∣ X i ⋂ Y j ∣ N P(i,j)=\frac{|X_i\bigcap{Y_j}|}{N}P(i,j)=N∣Xi​⋂Yj​∣​,N NN为节点数,i ∈ X , j ∈ Y i\in{X},j\in{Y}i∈X,j∈Y;

P ( i ) , P ( j ) P(i),P(j)P(i),P(j)分别为类别i , j i,ji,j的概率分布,P ( i ) = ∣ X i ∣ N , P ′ ( j ) = ∣ Y j ∣ N P(i)=\frac{|X_i|}{N},P'(j)=\frac{|Y_j|}{N}P(i)=N∣Xi​∣​,P′(j)=N∣Yj​∣​;

H ( X ) , H ( Y ) H(X),H(Y)H(X),H(Y)分别为X , Y X,YX,Y的信息熵。

所以P ( X ) = [ 8 / 17 , 5 / 17 , 4 / 17 ] P(X)=[8/17,5/17,4/17]P(X)=[8/17,5/17,4/17],P ( Y ) = [ 6 / 17 , 6 / 17 , 5 / 17 ] P(Y)=[6/17,6/17,5/17]P(Y)=[6/17,6/17,5/17]

P ( X , Y ) = [ 5 / 17 1 / 17 2 / 17 1 / 17 4 / 17 0 0 1 / 17 3 / 17 ] P(X,Y)=\begin{bmatrix} 5/17 & 1/17 & 2/17 \\ 1/17 & 4/17 & 0 \\ 0 & 1/17 & 3/17 \\ \end{bmatrix}P(X,Y)=⎣⎡​5/171/170​1/174/171/17​2/1703/17​⎦⎤​

因此,M I ( X , Y ) = s u m ( P ( X , Y ) ∗ l o g ( P ( X , Y ) / ( P ( X ) T P ( Y ) ) ) ) MI(X,Y)=sum(P(X,Y) * log(P(X,Y)/(P(X)^TP(Y))))MI(X,Y)=sum(P(X,Y)∗log(P(X,Y)/(P(X)TP(Y)))),H ( X ) = − P ( X ) l o g ( P ( X ) T ) H(X)=-P(X)log(P(X)^T)H(X)=−P(X)log(P(X)T),H ( Y ) = − P ( Y ) l o g ( P ( Y ) T ) H(Y)=-P(Y)log(P(Y)^T)H(Y)=−P(Y)log(P(Y)T),则N M I ( X , Y ) = 0.3646 NMI(X,Y)=0.3646NMI(X,Y)=0.3646

[1] Detecting the overlapping and hierarchical community structure in complex networks

2.ARI指数

兰德指数(RI指数)是两种划分X , Y X,YX,Y中顶点对正确分类的数量(顶点对在同一个社团中或者在不同的社团中)与总的顶点对的数量的比值,可以使用下式表示:

R I ( X , Y ) = a 00 + a 11 a 00 + a 01 + a 10 + a 11 = a 00 + a 11 C 2 n RI(X,Y)=\frac{a_{00}+a_{11}}{a_{00}+a_{01}+a_{10}+a_{11}}=\frac{a_{00}+a_{11}}{C_2^n}RI(X,Y)=a00​+a01​+a10​+a11​a00​+a11​​=C2n​a00​+a11​​

其中,a 00 a_{00}a00​表示在真实社团划分与实验得到的社团划分里都不属于同一社团的点对数目;a 11 a_{11}a11​表示在真实社团划分与实验得到的社团划分里都属于同一社团的点对数目;C 2 n C_2^nC2n​指可以组成的总顶点对对数。R I RIRI取值范围为[ 0 , 1 ] [0,1][0,1],值越大意味着两种划分结果越吻合。然而R I RIRI会存在区分度不高的情况。因此为了提高区分度,提出了ARI指数:

A R I = R I − E ( R I ) m a x ( R I ) − E ( R I ) ARI=\frac{RI-E(RI)}{max(RI)-E(RI)}ARI=max(RI)−E(RI)RI−E(RI)​

A R I ARIARI取值范围为[ − 1 , 1 ] [−1,1][−1,1],值越大意味着两种划分结果越吻合。从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度。

结果对比

为了验证FN算法的结果质量和计算效率,采用了3个不同的测试案例来和GN算法进行对比实验。

自定义网络

dolphins

football

节点数量

22

62

115

边数量

37

159

613

以下是实验结果(football网络有真实划分结果,分割线|前的为GN算法,后为FN算法,即GN | FN):

Q

NMI

ARI

计算时间(s)

自定义网络

0.528|0.528

/

/

0.024|0.02

dolphins

0.519|0.495

/

/

0.67|0.46

football

0.60|0.55

0.88|0.70

0.78|0.47

10.1|8.8

可以看出,FN算法的结果质量稍逊于GN算法,但是计算效率更高。

以下是dolphins网络中两个算法结果的可视化:

FN算法结果(4个社区):

GN算法结果(5个社区):

源码

原文有源码,去看原文

更多内容,请关注地学分析与算法。

社区发现算法python视频_社区发现FN算法Python实现相关推荐

  1. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)

    小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...

  2. 中谷教育python视频_中谷教育:Python系列视频教程(35集)_IT教程网

    资源名称:中谷教育:Python系列视频教程(35集) 资源目录: [IT教程网]python在线教学-01-走进pytho [IT教程网]python在线教学-02-开始编程吧 [IT教程网]pyt ...

  3. 跟李宁老师学Python视频课程(14):Python数据存储-李宁-专题视频课程

    跟李宁老师学Python视频课程(14):Python数据存储-109人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Python是当今炙手 ...

  4. 跟李宁老师学Python视频课程(12):Python常用模块-李宁-专题视频课程

    跟李宁老师学Python视频课程(12):Python常用模块-143人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Python是当今炙手 ...

  5. 跟李宁老师学Python视频课程(19):Python GUI库:PyQt5-李宁-专题视频课程

    跟李宁老师学Python视频课程(19):Python GUI库:PyQt5-639人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Pyth ...

  6. 跟李宁老师学Python视频课程(13):Python文件和流-李宁-专题视频课程

    跟李宁老师学Python视频课程(13):Python文件和流-99人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Python是当今炙手可 ...

  7. 跟李宁老师学Python视频课程(15):Python TCP与UDP编程-李宁-专题视频课程

    跟李宁老师学Python视频课程(15):Python TCP与UDP编程-122人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Pytho ...

  8. 跟李宁老师学Python视频课程(20):Python 测试-李宁-专题视频课程

    跟李宁老师学Python视频课程(20):Python 测试-219人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Python是当今炙手可 ...

  9. python算法工程师书籍_我是如何成为算法工程师的,超详细的学习路线

    一.前言 各位十一过得如何? 假期,我回了趟老家,文章停更了几天. 写文章以来,被问到最多的问题就是「算法的学习路线」. 今天,它来了. 我会带着大家看看,我们需要学些啥,利用这个假期,我甚至还收集整 ...

最新文章

  1. 最新自然语言处理领域顶会论文大合集!
  2. java 并行 执行进度_关于java:Java8流的顺序执行和并行执行产生不同的结果?
  3. python 字符串翻转
  4. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理
  5. python中int和eval的区别_python中eval与int的区别浅析
  6. 灰色预测法 —— matlab
  7. 小C的数学问题 线段树+分治
  8. netsh命令使用详解
  9. java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
  10. ethtool查看网卡以及修改网卡配置
  11. dell无线网卡驱动安装
  12. 三星530换固态硬盘_小米笔记本Air13.3加装固态硬盘(三星860EVO)
  13. 2018校招笔试真题汇总
  14. python发送qq文件_怎么用qq邮箱发文件-十分钟教你使用Python发送邮件(复制可用)...
  15. 如何在SQL中给一个日期加上一天
  16. VLOOKUP函数使用方法大全总结
  17. Android之主题皮肤实现
  18. 干货:从零设计高并发架构
  19. MT4平台上mql4实现的基于macd指标的智能交易EA
  20. Unity预制体和预设

热门文章

  1. Android状态栏微技巧,带你真正理解沉浸式模式
  2. matlab 使用心得,matlab 使用的一点儿体会(2)(转自饮水思源不错)
  3. 饮水思源:Ubuntu用户应关注Debian
  4. MFC 入门级基础知识
  5. 【调剂】天津科技大学教育部创新团队招收化工相关对计算机感兴趣学硕
  6. pdf如何转换成ppt?
  7. VDD,DVDD,AVDD,VCC,AFVDD,DOVDD,IOVDD
  8. 静觅小白爬虫及进阶系列学习笔记
  9. python做一个简单的对战游戏
  10. Discuz!论坛教程之修改admin.php防止直接恶意访问