我想检测小型网络/图表中的重叠社区。通过重叠,我的意思是节点可以包含在检测算法输出中的多个社区/集群中。
我查看了igraph
目前提供的各种社区检测算法,但我认为它们都没有处理重叠社区。 p>
理想情况下,我希望能够以编程方式在Python中利用这些算法的一些实现。但是,用其他语言实现也是可以的。
答案 0 :(得分:10)
我已经使用igraph的Python接口实现了Ahn等人的hierarchical link clustering算法;请参阅其源代码here。
另外,使用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"])
答案 1 :(得分:3)
如果你不介意使用其他编程语言,你有CFinder(Java),它基于clique percolation(它基本上寻找紧密连接的派系),OSLOM(C ++),这可以优化统计指标,当然还有其他措施。
否则,如果您想坚持使用python,您还可以通过Evans & Lambiotte '09应用该方法:1)将图形转换为折线图,2)对其应用常规社区检测方法,例如使用igraph,和3)获得重叠的社区。如果原始图形不是太大,将图形转换为折线图看起来并不太复杂,应该很快。在任何情况下,它都比执行社区检测本身更快。
注意有一些替代方法可以用于Evans& Lambiotte通过常规(互斥社区)方法获取重叠社区,例如Bennet et al. '12或Wang et al. '09。但是,实施它们似乎不太直接。
答案 2 :(得分:2)
根据此blog,networkx现在可以计算重叠社区。
以下代码适用于clique渗滤方法,可在Networkx 11.6中找到。 Github here
import networkx as nx
from itertools import combinations
def get_percolated_cliques(G, k):
perc_graph = nx.Graph()
cliques = list(frozenset(c) for c in nx.find_cliques(G) if len(c) >= k)
perc_graph.add_nodes_from(cliques)
# Add an edge in the clique graph for each pair of cliques that percolate
for c1, c2 in combinations(cliques, 2):
if len(c1.intersection(c2)) >= (k - 1):
perc_graph.add_edge(c1, c2)
for component in nx.connected_components(perc_graph):
yield(frozenset.union(*component))
答案 3 :(得分:1)
实施Clique Percolation Method (CPM)的CFinder。如果你使用python,Networkx已经实现了相同的(see this link)。
>>> G = nx.complete_graph(5)
>>> K5 = nx.convert_node_labels_to_integers(G,first_label=2)
>>> G.add_edges_from(K5.edges())
>>> c = list(nx.k_clique_communities(G, 4))
>>> list(c[0])
[0, 1, 2, 3, 4, 5, 6]
>>> list(nx.k_clique_communities(G, 6))
答案 4 :(得分:1)
Python networkx
库现在具有更广泛的社区检测算法。现在,卡拉给出的示例是:
>>> from networkx.algorithms.community import k_clique_communities
>>> G = nx.complete_graph(5)
>>> K5 = nx.convert_node_labels_to_integers(G,first_label=2)
>>> G.add_edges_from(K5.edges())
>>> c = list(k_clique_communities(G, 4))
>>> list(c[0])
[0, 1, 2, 3, 4, 5, 6]
>>> list(k_clique_communities(G, 6))
[]
社区文档在这里:https://networkx.github.io/documentation/latest/reference/algorithms/community.html