Python:找到图形的平均四面体聚类系数的有效方法?

时间:2018-01-21 20:13:40

标签: python pandas numpy networkx

我知道标准聚类系数(基于通过节点的实际三角形的数量可能的三角形数)。我正在寻找一种适当的方法来实现四面体(4节点完整子图/ 4-clique子图)。从本质上讲,这也意味着通过某个给定点找到所有四面体除以通过该点的可能四面体数量并对所有点求平均值。

我查看thisthis,看看我是否可以复制自己的案例,但发现很难理解发生了什么(因为我对python /相对较新) networkx)。

为数千个节点执行此操作的有效方法是什么?

1 个答案:

答案 0 :(得分:2)

对于单个节点,您可以执行以下操作:

nb = G.subgraph(G.neighbors(N))
cc = 0 if len(nb) < 3 else 2 * sum(networkx.triangles(nb).values()) / (len(nb) * (len(nb)-1) * (len(nb)-2))

对于平均值,您可以使用clique枚举。我无法找到如何仅从networkx获取四面体,因此我们使用itertools.groupby来过滤它们。然后我们只计算每个节点出现在这个列表中的频率,规范化,取平均值以及它。

import collections
import networkx
import itertools

def ff3(x):
    return x*(x-1)*(x-2)

def avg_tetr_cc(g):
    tetrahedra = itertools.islice(itertools.groupby(
        networkx.enumerate_all_cliques(g), len), 3, 4)
    try:
        tetrahedra = next(tetrahedra)[1]
    except StopIteration:
        return 0
    cnts = collections.Counter(itertools.chain(*tetrahedra))
    return 6 * sum(cnt / ff3(g.degree[v]) for v, cnt in cnts.items()) / len(g)


# demo
f = networkx.complete_graph(10)
g = networkx.erdos_renyi_graph(2000, 0.1)

print(avg_tetr_cc(f))
print(avg_tetr_cc(g))

示例输出:

1.0
0.000998169690313529