我有一个网络,我想使用 iGraph 中的 edge_betweenness 社区检测算法进行分析。我熟悉 NetworkX,但我正在尝试学习 iGraph,因为它是 NetworkX 上的其他社区检测方法。

我的最终目标是运行 edge_betweenness 社区检测并找到最佳社区数量,并为图中的每个节点编写一个带有社区成员资格的 CSV。

以下是我目前的代码。非常感谢任何帮助确定社区成员身份。

输入数据('network.txt'):

1 2
2 3
2 7
3 1
4 2
4 6
5 4
5 6
7 4
7 8
8 9
9 7
10 7
10 8
10 9

iGraph 代码
import igraph

# load data into a graph
g = igraph.Graph.Read_Ncol('network.txt')

# plot graph
igraph.plot(g)

python - 在python中使用iGraph进行社区检测并将每个节点的社区编号写入CSV-LMLPHP
# identify communities
communities = igraph.community_edge_betweenness()

# not really sure what to do next
num_communities = communities.optimal_count
communities.as_clustering(num_communities)

我需要怎么做才能找到最佳社区数量并写出图中每个节点属于哪个社区?

最佳答案

你走在正确的轨道上;可以通过 communities.optimal_count 检索社区的最佳数量(其中“最佳”定义为“使模块化分数最大化的社区数量”),并且可以使用 communities.as_clustering(num_communities) 将社区结构转换为平面不相交的聚类。实际上,社区的数量如果它恰好等于 communities.optimal_count 可以省略。一旦你这样做了,你会得到一个 VertexClustering 对象,它有一个 membership 属性,它为你提供了图中每个顶点的簇索引。

为清楚起见,我将您的 communities 变量重命名为 dendrogram,因为边缘中介社区检测算法实际上会生成一个树状图:

# calculate dendrogram
dendrogram = graph.community_edge_betweenness()
# convert it into a flat clustering
clusters = dendrogram.as_clustering()
# get the membership vector
membership = clusters.membership

现在我们可以开始将成员向量与节点名称一起写入 CSV 文件:
import csv
from itertools import izip

writer = csv.writer(open("output.csv", "wb"))
for name, membership in izip(graph.vs["name"], membership):
    writer.writerow([name, membership])

如果您使用的是 Python 3,请使用 zip 而不是 izip 并且不需要导入 itertools

关于python - 在python中使用iGraph进行社区检测并将每个节点的社区编号写入CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25254151/

10-12 18:11