【发布时间】:2021-06-28 23:39:09
【问题描述】:
在篮球运动员之间的传球网络中,我想:
- 检测网络中的开放三角形
- 计算处于中间位置的唯一玩家数量(A 传给 B 和 C;B 和 C 不互相传球;A 正在中间)
- 计算这些玩家促成开放三角形的次数
根据这个问题Extracting Open Triangles in R Igraph (Network Analysis),我们可以执行以下操作:
library(igraph)
set.seed(1234)
G <- sample_gnm(10, 15)
G
IGRAPH 72f8e6a U--- 10 15 -- Erdos renyi (gnm) graph
+ attr: name (g/c), type (g/c), loops (g/l), m (g/n)
+ edges from 72f8e6a:
[1] 1-- 3 1-- 4 3-- 4 1-- 5 3-- 5 6-- 7 3-- 8 4-- 8 6-- 8 7-- 8 2-- 9 6-- 9 7-- 9 4--10 9--10
plot(G)
找到空心三角形:
openTriList <- unique(do.call(c, lapply(as_ids(V(G)), function(v) {
do.call(c, lapply(as_ids(neighbors(G, v)), function(v1) {
v2 <- as_ids(neighbors(G, v1))
v2 <- v2[shortest.paths(G, v, v2) == 2]
if(length(v2) != 0) {
lapply(v2, function(vv2) { c(v, v1, vv2)[order(c(v, v1, vv2))] })
} else { list() }
}))
})))
结果正确:
do.call(rbind, openTriList)
[,1] [,2] [,3]
[1,] 1 3 8
[2,] 1 4 8
[3,] 1 4 10
[4,] 2 6 9
[5,] 2 7 9
[6,] 2 9 10
[7,] 3 4 10
[8,] 3 6 8
[9,] 3 7 8
[10,] 1 4 5
[11,] 3 4 5
[12,] 4 6 8
[13,] 4 7 8
[14,] 4 9 10
[15,] 3 5 8
[16,] 6 9 10
[17,] 7 9 10
[18,] 4 8 10
[19,] 6 8 9
[20,] 7 8 9
我们如何找到作为经纪人的玩家?
- 玩家 2 在此列表中,因为它是一个开放三角形的一部分,但不是经纪人。我们忽略了这个玩家。
我们如何有效地计算这些玩家促成开放三角形的次数?
- 玩家 9 正在代理 5 个空心三角形。
[真实数据包含数百万次传球和数千名球员。所以性能是一个很重要的方面。使用combn 会导致计算时间非常长。有更快的方法吗?也许让邻接图构建一个稀疏矩阵并将其转换为data.table 对象以供邻居加入?看到这个link。 ]
【问题讨论】:
标签: r performance networking igraph