首页 > 解决方案 > 社区层次与重叠的相关性

问题描述

dendo = community.generate_dendrogram(G_fb)
for level in range(len(dendo) - 1) :
    print("partition at level", level,
       "is", partition_at_level(dendo, level))

所以我在自己的数据上运行上面的代码,发现我的数据级别只有 1。似乎级别是社区的规模,在我的情况下,它们很小。

但是接下来我应该怎么做才能找出重叠的社区,这意味着一个节点可以包含在检测算法的输出中的多个社区中,例如我用于社区检测的 best_partition。

换句话说,水平和重叠之间是否有任何相关性?您可以在下面找到社区图。在此处输入图像描述

标签: pythonnetworkx

解决方案


我不太确定你在问什么,但如果你想找到网络中不同社区之间重叠的节点,那么有几种算法可以解决这个问题。这是一篇可以帮助您入门的文章:https ://arxiv.org/pdf/1110.5813.pdf 。特别是 CFinder 算法受到了很多关注。在此处列出,您将找到可能有用的算法实现。以下是Tamas为 CFinder 提供的代码:

# CFINDER IMPLEMENTATION
#!/usr/bin/env python
from itertools import combinations
import igraph
import optparse

parser = optparse.OptionParser(usage="%prog [options] infile")
parser.add_option("-k", metavar="K", default=3, type=int, help="use a clique size of K")
options, args = parser.parse_args()
if not args:
    parser.error("Required input file as first argument")

k = options.k
g = igraph.load(args[0], format="ncol", directed=False)
cls = map(set, g.maximal_cliques(min=k))

edgelist = []
for i, j in combinations(range(len(cls)), 2):
    if len(cls[i].intersection(cls[j])) >= k-1:
        edgelist.append((i, j))

cg = igraph.Graph(edgelist, directed=False)
clusters = cg.clusters()
for cluster in clusters:
   members = set()
   for i in cluster:
      members.update(cls[i])
print "\t".join(g.vs[members]["name"])

或者,我相信 NetworkX 有类似的解释,可以在这里找到。


推荐阅读