簡體   English   中英

R igraph:最短路徑提取

[英]R igraph: shortest path extraction

這是我第一次使用圖形和R igraph包,我需要一些處理圖形對象的幫助。

我想要實現的目標:
從給定的接觸矩陣中提取節點之間的最短自信路徑。 通過自信,我的意思是邊緣權重高於相鄰邊緣。

例子:

一個

m <- read.table(row.names = 1, header = TRUE, text = 
    "  A   B   C   D   E   F
     A 0   1   1   1   1   5
     B 1   0   1   1e2 1e2 1
     C 1   1   0   1   1   1
     D 1   1e2 1   0   1e2 1
     E 1   1e2 1   1e2 0   1
     F 5   1   1   1   1   0")
m <- as.matrix(m)
ig <- graph.adjacency(m, mode = "undirected", weighted = TRUE, diag = FALSE)
sp <- shortest.paths(ig, algorithm = "dijkstra")

在矩陣mBDE之間存在一個簇(clique?)(即,這些節點之間的權重很高)。 但是,由於AF之間存在重量,即使邊緣重量很低(僅為5),我也會在那里得到簇。
問題A:如何僅提取邊緣權重較高的群集? 我可以用m[which(m <= 5)] <- 0將這些接觸轉換為0,但我希望在igraph包中有更多的“mathy”解決方案。

m <- read.table(row.names = 1, header = TRUE, text = 
    "  A   B   C   D   E   F
     A 0   1   1   5   1   1
     B 1   0   1   1e2 1e2 1
     C 1   1   0   1   1   1
     D 5   1e2 1   0   1e2 1
     E 1   1e2 1   1e2 0   1
     F 1   1   1   1   1   0")
m <- as.matrix(m)
ig <- graph.adjacency(m, mode = "undirected", weighted = TRUE, diag = FALSE)
sp <- shortest.paths(ig, algorithm = "dijkstra")

在矩陣mBDE之間存在聚類,但由於AB之間A權重較低 - A也連接到該聚類。
問題B:如果邊緣權重較低,如何不將節點分配給群集?

這是我的第一個問題,如果你需要澄清或更好的例子,我會改進我的問題。

首先,很高興知道在查找路徑時,igraph會將權重理解為成本,即在權重較高的邊緣上,行程成本會更高,因此它會考慮使用較低總和權重的路徑縮短。 很容易把它變成相反的,只需取你的重量的倒數( 1 / E(ig)$weight )。 在2個頂點之間可能只有一條最短路徑,但有時會有更多同樣短的路徑。 你可以看一下所有的人( all_shortest_paths ),或告訴的igraph只返回shortests之一頂點(每對shortest_paths )。 這些方法的每次調用都返回一個選定頂點的路徑,在所有對之間有路徑,你需要為每個頂點調用一次(好的,在無向圖中,足以調用一半頂點)。 在此之前制定我所解釋的內容:

spaths <- lapply(V(ig),
                 function(v){
                     all_shortest_paths(ig, v,
                                        weight = 1 / E(ig)$weight
                     )
                 }
           )

這里spaths將是一個列表列表,訪問從C到所有頂點的路徑,如下所示:

spaths$C$res

[[1]]
+ 2/6 vertices, named:
[1] C A
[[2]]
+ 2/6 vertices, named:
[1] C B
[[3]]
+ 1/6 vertex, named:
[1] C
[[4]]
+ 2/6 vertices, named:
[1] C D
[[5]]
+ 2/6 vertices, named:
[1] C E
[[6]]
+ 2/6 vertices, named:
[1] C F

spaths$C$res[[2]] # this is the path from `C` to `B`,
                  # a vector of 2 vertices

注意,第三個元素實際上是從C到它自己,你可以忽略它,或者為all_shortest_pathsto參數提供所有其他頂點的all_shortest_paths 此外,在您的示例中,所有最短路徑的長度均為1,但如果我將B--E的權重設置為1而不是100,我們會看到該方法有效,而從BE ,最短路徑將是BDE

關於你的第二個問題,這里還不完全清楚你想要實現什么,特別是你如何獲得這些集群? 如果你想找到社區,即更緊密連接的頂點組,同時還要考慮邊權重,那么有很多方法,所有那些名為cluster_[...]community.[...]在igraph中。 例如,如果我們在圖表上運行fastgreedy方法,它將檢測您提到的集群:

fg <- fastgreedy.community(ig, weights = E(ig)$weight)

IGRAPH clustering fast greedy, groups: 2, mod: 0.059
+ groups:
$`1`
[1] "A" "C" "F"
$`2`
[1] "B" "D" "E"

所以這里我們有B, D, E簇,與更高權重邊緣相關的東西。 如果我們運行沒有權重的相同方法,則所有頂點都屬於一個組( fastgreedy.community(ig, weights = NULL) )。 注意,在社區檢測中,igraph將權重理解為強度,因此與較高權重邊緣相關聯的頂點更可能聚集在一起,這與計算路徑時的工作方式相反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM