在Python中使用iGraph的社区检测函数community_fastgreedy(),我得到了一个VertexDendrogram对象,我们称之为V。然后,使用V.as_clustering()从树状图中得到了一个VertexClustering对象。我知道社区是聚集在一起的,以便最大程度地实现模块化,但是我认为树状图对象一直在不断合并,因此很难在树状图中看到社区。
我的问题是:V.as_clustering()的输出如何与树状图中社区之间的距离相对应?
换句话说,每个社区都有一个代表数字(例如,社区[0],社区[2]),那么该数字与树状图上的位置如何对应?当树状图合并到最大程度地模块化时,社区0和社区1是否彼此相邻,并且社区12比社区0更远离社区0 3?
如果不是,那么as_clustering函数如何确定输出的顺序(每个社区的编号)?
提前致谢。
最佳答案
当igraph中的算法产生VertexDendrogram
时,它也可以选择产生“提示”,告诉我们在何处切割树状图(即合并多少次之后),以获得在某种意义上最佳的VertexClustering
。例如,由VertexDendrogram
产生的community_fastgreedy()
建议在最大程度地模块化的位置上切断树状图。在as_clustering()
上运行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的乘数。