【发布时间】:2014-04-03 10:31:40
【问题描述】:
我正在使用 igraph R 中的一个相当大的图。(约 500 万个顶点,4000 万条边)。
我想为每个顶点创建一个新属性,它是它们每个连接的属性的平均值。
例如:
人 A 的 X 值为 10,他们与人 B、C 和 D 相关联,他们的 x 值分别为 20、50 和 65。我想为人 A 分配一个新值 45(平均值为 20、50 和 65)。
我目前正在使用以下方法(来自另一个 stackoverflow 答案)(我使用的是 10 个核心)
adjcency_list <- get.adjlist(g)
avg_contact_val <- ldply(adjcency_list, function(neis){ mean(V(g)[neis]$X, na.rm = T)},
.parallel = TRUE
)
V(g)$avg_contact_val <- avg_contact_val
这完全符合我的需要,但它不能很好地扩展,并且需要(非常!)很长时间才能在完整的图表上完成。
- 有没有更有效的方法来做到这一点?
- 这是否属于使用 x 值而不是度数的页面排名类型算法
- 能否以某种方式使用 GPU?
- 这在 igraph Python 中会更快吗?
编辑:
以下是一些示例数据和对建议方法的尝试:
set.seed(12345)
g <- erdos.renyi.game(10000, .0005)
V(g)$NAME <- c(1:10000)
V(g)$X <- round(runif(10000,0,30))
adjcency_list <- get.adjlist(g)
sub_ages <- data.frame(NAME = V(g)$NAME, X = V(g)$X)
dta.table <- data.table(sub_ages, key = "NAME")
数据表方法
system.time(
avg_contact_ages <- ldply(adjcency_list,
function(neis){
mean(dta.table[neis,mean(X)], na.rm = T)
}, .progress = "tk"
)
)
user system elapsed
38.87 1.50 40.37
数据框架方法
sub_ages2 <- data.frame(row.names = V(g)$NAME, X = V(g)$X)
system.time(
avg_contact_ages <- ldply(adjcency_list,
function(neis){
mean(sub_ages2[neis, "X"], na.rm = T)
}, .progress = "tk"
)
)
user system elapsed
8.69 1.28 9.99
原始方法
system.time(
avg_contact_ages <- ldply(adjcency_list,
function(neis){
mean(V(g)[neis]$X, na.rm = T)
} , .progress = "tk"
)
)
user system elapsed
16.74 2.35 19.14
影子的方法
system.time(
avg_nei <- ldply(V(g), function(vert){
mean(get.vertex.attribute(g, "X", index=neighbors(g,vert)), na.rm=TRUE)
}, .progress = "tk")
)
user system elapsed
8.80 1.42 10.23
【问题讨论】:
标签: r parallel-processing plyr igraph