2013-07-01 51 views
1

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

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

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

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

在此先感谢。

回答

3

当igraph中的算法产生VertexDendrogram时,它也可以选择产生一个“提示”,它告诉我们在哪里切割树形图(即在多少次合并之后)以获得某种意义上最优的VertexClustering。例如,由community_fastgreedy()生成的VertexDendrogram提出树状图应该在模块化最大化的地方切割。在VertexDendrogram上运行as_clustering()只需使用聚类算法生成的提示将树形图平化为聚类,但您可以通过将所需数量的聚类指定为参数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。

+0

好吧,我现在明白这一点,所以只要可以肯定的是,当使用该提示对树形图进行as_clustering()剪切时,输出社区编号代表它们在使用提示进行树形图剪切时的位置。那么社区[0]和社区[1]在树状图的一端是否彼此最接近,而假设12和13彼此接近,但远离0和1? – Joe

+0

不,社区数字并不代表什么 - 它们唯一的含义就是两个顶点在同一个社区,当且仅当他们的社区指数是相同的。 –

+0

查看我答案中的更新。 –

相关问题