- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我第一次使用图表和R
igraph
包,我需要一些处理图形对象的帮助。
我想要实现的目标:
从给定的接触矩阵中提取节点之间的最短置信路径。我所说的“自信”是指边缘权重高于相邻边缘。
示例:
A
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
B-D-E
之间有一个簇(集团?) (即,这些节点之间的egde权重很高)。然而,由于 A
之间有重量。和F
即使边权重很低(只有 5),我也在那里得到了簇。
问题A:如何仅提取那些具有高边权重的簇?我可以使用 m[which(m <= 5)] <- 0
将这些联系人转换为 0 ,但我希望 igraph
中有更多“数学”解决方案包裹。
B
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
B-D-E
之间有簇,但由于 A
之间的权重较低和B
-A
也连接到该集群。
问题B:如果边权重较低,如何不将节点分配给集群?
这是我的第一个问题,如果您需要澄清或更好的示例,我会改进我的问题。
最佳答案
首先,很高兴知道在查找路径时,igraph 将权重理解为成本,即在权重较高的边上,行进成本较高,因此它会考虑较短的路径,且路径较低总重量。很容易把它变成相反的,只需取你的权重的倒数( 1 / E(ig)$weight
)。两个顶点之间可能只有一条最短路径,但有时会有更多条同样短的路径。您可以查找所有这些顶点 ( all_shortest_paths
),或者告诉 igraph 仅返回每对顶点的最短顶点之一 ( 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
对于其本身,您可以忽略它,或者向 to
提供所有其他顶点的向量。 all_shortest_paths
的参数。另外,在您的示例中,所有最短路径的长度均为 1,但如果我设置 B--E
的权重,例如到 1 而不是 100,我们看到该方法有效,并且从 B
至E
最短路径为B-D-E
.
关于你的第二个问题,这里还不完全清楚你想要实现什么,特别是你如何获得这些集群?如果你想找到社区,即连接更紧密的顶点组,同时考虑到边权重,有很多方法可以实现,所有这些方法都名为 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 将权重理解为强度,因此与较高权重边连接的顶点更有可能聚集在一起,这与它在计算路径时的工作方式有点相反。
关于R igraph : shortest path extraction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663247/
我有一个 N x 2 的整数表,称为 games[ , ]。节点/边表转换为图形: net edges g ecount(g) 7 > degree(g, 103, mode="out") 4
我开始评估 igraph 库及其功能。 我需要计算 igraph_de_bruijn() 函数生成的图的哈密顿路径。 igraph 库中是否有任何现成的功能?我不想从头开始实现它。 C中的一个例子将是
我正在尝试像这样深度复制我的 igraph 对象: copy.deepcopy(graph) 其中 graph 是 igraph 对象,一个只有几个顶点的完整图。但是我得到这个错误: Fi
我有一个需要过滤的大图。过滤(子图)后,我最终得到一个子图列表。我需要再次将所有这些子图组合成一个图。我不知道如何组合大列表(近百万个子图) > require(igraph) > graph V(
我有一个简单的问题,函数 community.to.membership 在 igraph 1.0 中是否被弃用了?我可以找到 membership 函数,但它不包括选项 merges、steps 等
我正在使用 R 中的 igraph。我知道我们可以用选定的顶点创建一个子图,但如果这些节点没有直接连接,那么新子图中将不会有边。如果有其他节点(不是顶点列表的一部分)间接连接这两个节点,有没有办法制作
我正在使用 R 中的 igraph。我知道我们可以用选定的顶点创建一个子图,但如果这些节点没有直接连接,那么新子图中将不会有边。如果有其他节点(不是顶点列表的一部分)间接连接这两个节点,有没有办法制作
是否有与此 igraph 等效的 R function在 Python igraph 中? graph_from_data_frame(d, directed = TRUE, vertices = N
a=g.vs(Name_eq="A") b=g.vs(Name_eq="B") 我想在 a 和 b 之间添加一条边,我该怎么做? 最佳答案 好的,我们这里好像有两个问题。一个在问题标题中:“如果我们有
我有一个大型无向加权图,其中包含约 375,000 个节点和约 3,400,000 个边,表示为邻接表(字典的字典)。 例如 A --> (B,2), (C,4) B --> (A,2) C -->
igraph here 中对可用的社区检测算法进行了很好的比较。 .但是,在可以应用于加权边的算法中使用权重存在一些歧义。 通常,边缘权重将被定向,以便更高的权重表明将节点保持在一起(例如友谊的强度)
我在 igraph 中使用了 fastgreedy 算法在加权无向图中进行社区检测。后来我想看看模块化性,不同的方法我得到了不同的值,我想知道为什么。我提供了一个简短的示例,它演示了我的问题: lib
我正在使用 igraph g <- graph_from_adjacency_matrix(adj2, mode = "directed") plot.igraph(g, vertex.size =
我想知道如果 igraph-R 包中没有实现基于模块化聚类的算法,由 Newman 于 2004 年发布:“Fast algorithm for detection community structu
我有一个类似的问题:Reading adjacency lists with isolated nodes using igraph 我想绘制一些没有关系的节点。但是由于某种原因,上面线程中提到的解决
我有一个交互网络,我使用以下代码制作邻接矩阵,随后计算网络节点之间的相异性,然后将它们聚类以形成模块: ADJ1=abs(adjacent-mat)^6 dissADJ1% as.dist %
我想使用 igraph 来探索一些网络数据。我的数据具有以下结构: a <- c(13, 32, NA, NA) b <- c(32, NA, NA, NA) c <- c(34, 13, 32, N
我使用 igraph graph_from_data_frame 函数从数据框构建了一个图。我的前两列代表边缘列表,我还有另一列名为“权重”。还有其他几个属性列。 然后我尝试使用 cluster_fa
我的问题如下: 考虑一个具有 10000 个节点和 4800 条边的无向图。 给定这个图和这个图的一个节点(例如,节点 1),我需要 igraph (R) 中的一个命令来获取这个节点 1 和图中最远节
我已指导 igraph 并想获取所有周期。 girth 函数有效,但只返回最小的周期。 R 中有没有办法在长度大于 3 的图中获取所有循环(没有顶点指向自身和循环) 最佳答案 它不是 igraph 中
我是一名优秀的程序员,十分优秀!