Python 计算聚类系数

Python 计算聚类系数,python,network-programming,networkx,Python,Network Programming,Networkx,我想计算一个没有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,

我想计算一个没有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


我的逻辑有什么问题?

至少有一个问题来自以下方面:

 clusteringCoefficientOfNode =  (2 * float(len(nodesWithMutualFriends)))/((float(len(G.neighbors(node))) * (float(len(G.neighbors(node))) - 1)))
如果节点1有N个邻居,并且所有邻居都是彼此的邻居,那么每个邻居都会在
节点的“多个朋友”
中出现一次,因为您使用了
,尽管它们位于N-1个三角形中。然后乘以2,得到2N/(N*(N-1))=2/(N-1)。但是你应该有1个。所以实际上你没有计算三角形的数量。您正在计算三角形中的节点数。然后除以可能的三角形数


因此,您可以通过删除
set
调用和删除
2*

来修复它。您是否在关注网络的单个聚类系数?或者每个节点的集群?我在寻找网络中每个节点的系数@JoelI-see。。我是否应该因为这个实现而删除2*?还有其他一些错误,因为也有一些值是关闭的(尝试运行脚本并在第一行中的一行上使用nx值播放一点),请参阅我所做的编辑。您的问题是因为您使用了
set
。因此,您无法跟踪节点所在的三角形数。