python networkx教程_科学网-Python+NetworkX 计算全局社区划分的模块度的三种方法,代码分享-刘井莲的博文...

#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,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

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

转载本文请联系原作者获取授权,同时请注明本文来自刘井莲科学网博客。

收藏

分享

分享到:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值