[英]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.