[英]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")
在矩陣m
, BDE
之間存在一個簇(clique?)(即,這些節點之間的權重很高)。 但是,由於A
和F
之間存在重量,即使邊緣重量很低(僅為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")
在矩陣m
, BDE
之間存在聚類,但由於A
和B
之間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_paths
的to
參數提供所有其他頂點的all_shortest_paths
。 此外,在您的示例中,所有最短路徑的長度均為1,但如果我將B--E
的權重設置為1而不是100,我們會看到該方法有效,而從B
到E
,最短路徑將是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.