datamining1的个人博客分享 http://blog.sciencenet.cn/u/datamining1

博文

Python+NetworkX 计算全局社区划分的模块度的三种方法,代码分享

已有 18562 次阅读 2016-1-13 20:55 |个人分类:复杂网络|系统分类:科研笔记| Python, NetworkX, modularity

#Python代码

#coding=gbk

import numpy as  np

import networkx as nx

'''

输入参数格式说明

comm=[[1,2,3],[4,5,6],...]

G=nx.Graph()


Q1、Q2、Q3是采用三种不同方法来计算模块度,其结果相同


G中边(a,b)都是a<b,

如果查询(b,a) 是不是图的边,返回的结果为false(得到的返回结果是错的,这是个坑,要注意)

'''


def Q1(comm,G):

   #边的个数

   edges=G.edges()

   m=len(edges)

   #print 'm',m


   #每个节点的度

   du=G.degree()

   #print 'du',du


   #通过节点对(同一个社区内的节点对)计算

   ret=0.0

   for c in comm:

       for x in c:

           for y in c:

               #边都是前小后大的

               #不能交换x,y,因为都是循环变量

               if x<=y:

                   if (x,y) in edges:

                       aij=1.0

                   else:

                       aij=0.0

               else:

                   if (y,x) in edges:

                       aij=1.0

                   else:

                       aij=0

               #print x,' ',y,' ',aij

               tmp=aij-du[x]*du[y]*1.0/(2*m)

               #print du[x],' ',du[y]

               #print tmp

               ret=ret+tmp

               #print ret

               #print ' '

               

   ret=ret*1.0/(2*m)

   #print 'ret ',ret

   return ret

   


def Q2(comm,G):

   #边的个数

   edges=G.edges()

   m=len(edges)

   #print 'm',m


   #每个节点的度

   du=G.degree()

   #print 'du',du


   #通过节点对计算

   ret2=0.0

   for c in comm:

       #首先计算出社区c中的边的个数

       #这样计算出来的边数是实际边数的2倍

       bian=0

       for x in c:

           for y in c:

               #边都是前小后大的

               #不能交换x,y,因为都是循环变量

               if x<=y:

                   if (x,y) in edges:

                       bian=bian+1

               else:

                   if (y,x) in edges:

                       bian=bian+1

       #社区c内的节点度的和

       duHe=0

       for x in c:

           duHe=duHe+du[x]

       tmp=bian*1.0/(2*m)-(duHe*1.0/(2*m))*(duHe*1.0/(2*m))

       #print 'bian',bian,'tmp',tmp

       ret2=ret2+tmp

   return ret2

   

   

def Q3(comm,G):

   #社区个数

   k=len(comm)

   #边数

   m=G.number_of_edges()

   print 'm',m

   #边列表

   edges=G.edges()

   

   #k*k的矩阵e

   e=np.zeros((k,k),np.float)

   for i in range(k):

       for j in range(k):

           #计算comm[i]和comm[j]之间的边数

           #由于是对称矩阵,只需要计算上三角即可

           bian=0

           for x in comm[i]:

               for y in comm[j]:

                   if x<y:

                       if (x,y) in edges:

                           bian=bian+1

                   else:

                       if (y,x) in edges:

                           bian=bian+1

           #如果i==j,边重复了一遍,需要除以2

           if i==j:

               bian=bian/2

           #如果i==j,e[i,i]是边数/m

           if i==j:

               e[i,j]=bian*1.0/m

           else:#如果i!=j,e[i,j]是边数/m的一半

               e[i,j]=bian*0.5/m

           #e[i,j]=bian

       #endforj

   #endfori

   print e

   #1*k的行向量a

   a=np.zeros(k,np.float)

   for i in range(k):

       he=0

       for j in range(k):

           he=he+e[i,j]

       a[i]=he

   #

   print a

   QValue=0

   for i in range(k):

       QValue=QValue+e[i,i]-a[i]*a[i]

   #

   return QValue





https://wap.sciencenet.cn/blog-2358872-950201.html

上一篇:NetworkX及Python开发环境的安装
下一篇:网络科学+社会网络+大数据+Python
收藏 IP: 1.57.27.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-20 05:10

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部