与igraph或其他库重叠进行社区检测
问题内容:
我想在小型网络/图中发现重叠的社区。通过重叠,我的意思是一个节点可以包含在检测算法的输出中的多个社区/集群中。
我看过了由精心提供的各种社区检测算法igraph
,但我认为它们都不能处理重叠的社区。
理想情况下,我希望能够以编程方式利用Python中此类算法的某些实现。但是,其他语言的实现也可以。
问题答案:
不久前,我使用igraph的Python接口实现了Ahn等人的分层链接聚类算法;在这里查看其源代码。
另外,使用igraph在Python中实现CFinder相当容易。这是我想出的:
#!/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"])