我想在没有NetworkX内置方法的情况下计算网络的聚类系数。在
我现在写的方法似乎正是
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline
#create graph
G=nx.Graph()
G.add_edges_from([(0,1),(0,2),(0,4),(0,3),(0,5),(1,7),(1,10),(1,11),(1,12),(2,4),(2,5),(2,3),(3,4),(5,8),(5,6),(6,8),(6,9),(6,7),(7,9),(7,10),(10,11),(10,12),(11,13),(12,13)])
# print 1 test value
print nx.clustering(G,1)
def clustering_coefficient(G):
# this will store the mapping of node/coefficient
clusteringDict = {}
for node in G:
neighboursOfNode = []
nodesWithMutualFriends = []
# store all neighbors of the node in an array so we can compare
for neighbour in G.neighbors(node):
neighboursOfNode.append(neighbour)
for neighbour in G.neighbors(node):
for second_layer_neighbour in G.neighbors(neighbour):
# compare if any second degree neighbour is also a first degree neighbour (this makes a triangle)
# if so, append it to the mutual friends list
if second_layer_neighbour in neighboursOfNode:
nodesWithMutualFriends.append(second_layer_neighbour)
# filter duplicates from the mutual friend array
nodesWithMutualFriends = list(set(nodesWithMutualFriends))
clusteringCoefficientOfNode = 0
# apply coefficient formula to calculate
if len(nodesWithMutualFriends):
clusteringCoefficientOfNode = (2 * float(len(nodesWithMutualFriends)))/((float(len(G.neighbors(node))) * (float(len(G.neighbors(node))) - 1)))
clusteringDict[node] = clusteringCoefficientOfNode
clustering_coefficient(G)
但是,运行此脚本时,NetworkX值在大多数情况下都会给出与我自己的脚本不同的值。无论如何,这个脚本也可以运行到2.0而不是1.0。在
我的逻辑怎么了?在
至少有一个问题来自以下方面:
如果节点1有N个邻居,所有这些邻居都是彼此的邻居,那么每个邻居只会出现在
nodeWithMutualFriends
中一次,因为您使用了set
,尽管它们位于N-1个三角形中。然后乘以2,得到2N/(N*(N-1))=2/(N-1)。但你应该有一个。所以你真的没有计算三角形的数量。你在计算三角形中的节点数。然后除以可能的三角形数。在所以您可以通过删除}来修复它。在
set
调用和删除{相关问题 更多 >
编程相关推荐