【问题标题】:Converting igraph to networkx for clustering将 igraph 转换为 networkx 进行聚类
【发布时间】:2019-10-05 22:16:14
【问题描述】:

我有一个使用 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)

但是,dendrogram 不能聚集在 networkx 库中。有人可以帮忙将igraph 代码复制到networkx 集群吗?

【问题讨论】:

  • 我对@9​​87654329@不是很熟悉,请问as_clustering()是做什么的?看文档,一点也不像nx.clustering命令(返回每个节点的聚类系数)
  • igraph 没有停产,这根本不是真的。

标签: python cluster-analysis networkx igraph dendrogram


【解决方案1】:

问题在于“聚类”在网络科学中指的是两个不同的东西。它要么是指聚类系数(自我图中三角形的分数;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 个要根据关键字内的文本匹配来识别的关键字。
猜你喜欢
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2022-07-04
  • 2018-11-03
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多