1

在 Python 中使用 iGraph 的社区检测函数 community_fastgreedy(),得到了一个 VertexDendrogram 对象,我们称之为 V。然后使用 V.as_clustering() 从树状图中得到一个 VertexClustering 对象。我知道社区是聚集在一起的,因此模块性最大化,但我认为树状图对象一直在合并,所以很难在树状图上看到社区。

我的问题是: V.as_clustering() 的输出如何对应于树状图中社区之间的距离?

换句话说,每个社区都有一个代表编号(例如 Community [0]、Community [2]),那么该编号如何对应于树状图上的位置?当树状图合并到最大化模块化的级别时,社区 0 和社区 1 是否彼此相邻,社区 12 与社区 0 的距离是否比社区 3 更远?

如果不是,那么 as_clustering 函数如何决定输出的顺序(每个社区的数量)?

提前致谢。

4

1 回答 1

3

当 igraph 中的算法产生 aVertexDendrogram时,它也可以选择性地产生一个“提示”,告诉​​我们在哪里切割树状图(即在多少次合并之后)以获得VertexClustering某种意义上最优的 a。例如,VertexDendrogram生成的community_fastgreedy()提议应该在模块化最大化的点处切割树状图。as_clustering()在 a 上运行VertexDendrogram仅使用聚类算法产生的提示将树状图展平为聚类,但您可以通过将所需的聚类数指定为as_clustering().

至于两个社区之间的“距离”:这是一件复杂的事情,因为大多数社区检测方法都没有给你那个信息。它们只是产生从单个顶点到封装每个人的巨型社区的一系列合并,并且树状图中没有编码“距离”信息;换句话说,树状图的分​​支没有“长度”。您可以做的最好的事情可能是回到您的图表并检查社区之间的边缘密度;这可能是亲密关系的一个很好的迹象。例如:

cl = g.community_fastgreedy().as_clustering()
comm1 = cl[0]
comm2 = cl[1]
edges_between = g.es.select(_between=(comm1, comm2))
print 2.0 * len(edges_between) / len(comm1) * len(comm2)

如果您的图表是有向的,请在最后一行使用 1.0 而不是 2.0 的乘数。

于 2013-07-02T18:30:28.397 回答