将igraph转换为networkx以进行聚类

6

我有一段使用igraph库的Python代码。

import igraph
edge =  [(0, 6), (0, 8), (0, 115), (0, 124), (0, 289), (0, 359), (0, 363), (6, 60), (6, 115), (6, 128), (6, 129), (6, 130), (6, 131), (6, 359), (6, 529), (8, 9), (8, 17), (8, 115)]
G = igraph.Graph(edges=edge, directed=False)
G.vs['label'] = nodes
G.es["weight"] = weights
dendrogram = G.community_edge_betweenness()
clusters = dendrogram.as_clustering()
membership = clusters.membership
out = pd.Series(membership, index=nodes)

我需要将它转换为networkx库。

import networkx as nx
G = nx.Graph(edges)
dendrogram = nx.edge_betweenness_centrality(G)
clusters = nx.clustering(dendrogram)
membership = clusters.membership
out = pd.Series(membership, index=nodes)

然而,在networkx库中无法对dendrogram进行聚类。有人可以帮忙将igraph代码复制到networkx聚类中吗?


我不太熟悉igraph,能请您解释一下as_clustering()是干嘛的吗?从文档上看,它似乎和nx.clustering命令(返回每个节点的聚类系数)完全不同。 - Joel
igraph并未停止开发,这只是一个错误的说法。 - Szabolcs
1个回答

3
问题在于,在网络科学中,“聚类”指的是两个不同的东西。它可能是指聚类系数(自我图中三角形的分数;nx.clustering),也可能是指节点组(又称数据聚类、网络社区、节点划分等)。
在这种情况下,您正在使用igraph community_edge_betweenness() 对节点进行分层聚类,然后通过dendrogram.as_clustering()剪切树状图来创建节点划分。
在networkx中的等效方法是使用girvan_newman
from networkx.algorithms.community.centrality import girvan_newman

nx_dendrogram = girvan_newman(G)
move_down_dendrogram = itertools.takewhile(lambda c: len(c) <= 4, nx_dendrogram)
for c in move_down_dendrogram:
    clustering_list = c
print(clustering_list)

membership = [0] * G.number_of_nodes()
for ic, cset in enumerate(clustering_list):
    for n in cset:
        membership[n] = ic
out = pd.Series(membership, index=nodes)

以上代码有效!不过,有没有一种方法来确定选择最优社区数量的k值呢?我的数据集包含大约1600个关键词,需要根据关键词内的文本匹配进行识别。 - Dgstah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接