繁体   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