使用NetworkX的社区检测算法

时间:2019-04-18 11:34:28

标签: python algorithm networkx graph-theory

我有一个图网络,它是here中可用的Email-Eu网络。

此数据集具有实际的数据集,它是大约1005个节点的图,这些图的边缘形成了这个巨型图。它还具有节点及其对应社区(部门)的地面真相标签。这些节点中的每个节点都属于42个部门之一。

我想在图形上运行社区检测算法,以找到每个节点的相应部门。我的主要目标是在最大的社区中找到节点。

因此,首先我需要找到前42个部门(社区),然后在其中最大的一个节点中找到节点。

我从Girvan-Newman算法开始寻找社区。 Girvan-Newman的优点在于易于实现,因为每次我需要找到具有最高中间性的边并移除它,直到找到想要的42个部门(社区)。

我正在努力寻找其他的社区检测算法,这些算法使我可以选择指定将图分解成多少个社区/分区。

我可以使用任何社区检测功能/技术,这使我可以选择指定从图表中发现多少社区?任何想法都非常感谢。

我正在使用Python和NetworkX。

3 个答案:

答案 0 :(得分:1)

您的问题的(非常)部分答案(和解决方案)是将Networkx实现的Fluid Communities algorithm用作asyn_fluidc

请注意,它适用于连接的,无向的,未加权的图形,因此,如果图形具有n个连接的组件,则应运行n次。实际上,这可能是一个重要的问题,因为您应该对每个组件都有某种初步的知识,以便选择相应的k。

无论如何,值得一试。

答案 1 :(得分:1)

您可能想尝试pysbm。它基于networkx,并实现了随机块模型和推断方法的不同变体。

如果您考虑从networkx切换到其他基于python的图形包,则可以考虑使用graph-tool,在此处您可以为clustering task使用随机块模型。另一个值得注意的包是igraph,可能需要看看How to cluster a graph using python igraph

networkx中直接可用的方法已经过时了。如果您打算使用最新的聚类方法,则可以考虑使用光谱聚类或Infomap。选择取决于您对推断社区的期望用法。从网络推断地面真相的任务属于(近似)无自由午餐定理,即(几乎)没有算法存在,因此,如果我们对结果求平均值,它会比任何其他算法返回“更好”的社区。所有可能性。

答案 2 :(得分:0)

我不确定我的回答,但也许您可以尝试一下。您是否知道标签传播?主要思想是您在图中有一些标记为节点的节点,即它们属于社区,并且您想给图中的其他未标记节点提供标签。 LPA会将这些标签散布在整个图形上,并为您提供节点及其所属社区的列表。这些社区将与您标记的节点集所属的社区相同。

因此,我认为您可以通过控制开始时初始化的社区数量来控制要从图中提取的社区数量。但是我认为,LPA收敛后,由于图的结构以及算法的随机性,您初始化的某些社区也有可能从图中消失。但是LPA有许多变体,您可以在其中控制这种随机性。我相信sklearn的this page会谈论它。

您可以阅读有关LPA here以及here

的信息