2013-07-01 92 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

查看我答案中的更新。 –

相關問題