IGRAPHE中计算连接平均值的有效方法?

IGRAPHE中计算连接平均值的有效方法?,r,parallel-processing,plyr,igraph,R,Parallel Processing,Plyr,Igraph,我正在处理igraph R中一个相当大的图(约500万个顶点,4000万条边) 我想为每个顶点创建一个新属性,它是每个顶点连接的属性的平均值 例如: 人A的X值为10,他们分别与X值为20、50和65的人B、C和D相连。我想给a个人分配一个新的值45(平均值为20、50和65) 我目前正在使用以下方法(来自另一个stackoverflow答案)(我使用10个内核) 邻接列表函数get.vertex.attribute增加了一些速度。但对于图表的大小来说,这可能还不够。无论如何,这是我的稍微快一点

我正在处理igraph R中一个相当大的图(约500万个顶点,4000万条边)

我想为每个顶点创建一个新属性,它是每个顶点连接的属性的平均值

例如:

人A的X值为10,他们分别与X值为20、50和65的人B、C和D相连。我想给a个人分配一个新的值45(平均值为20、50和65)

我目前正在使用以下方法(来自另一个stackoverflow答案)(我使用10个内核)


邻接列表函数
get.vertex.attribute
增加了一些速度。但对于图表的大小来说,这可能还不够。无论如何,这是我的稍微快一点的版本(在我对小得多的图形进行的基准测试中,它大约比您的版本快2.5倍):


avg_nei函数
get.vertex.attribute
增加了一些速度。但对于图表的大小来说,这可能还不够。无论如何,这是我的稍微快一点的版本(在我对小得多的图形进行的基准测试中,它大约比您的版本快2.5倍):

avg_nei
  • 有没有更有效的方法
我想是的。不要总是调用
V(g)
,而是将属性放在向量中,并对其进行索引。如果您包括一些示例数据,那么我还将包括一些代码

  • 这是否属于使用x值而不是度的页面排名类型算法
不,PageRank是递归的,你的排名取决于整个网络,而不仅仅取决于你邻居的分数

  • 有可能以某种方式使用GPU吗
不是用igraph。如果没有GPU,你肯定可以使这个速度足够快,所以我不会那样做

  • 在igraph Python中这会更快吗
这要看你怎么写。imo说,如果在R中以正确的方式编写,那么在Python中也不会更快

编辑: 我忽略了进度条,因为实际上这是最慢的

最快的解决方案以上的数据帧 使用因素
system.time({
调整向量
  • 有没有更有效的方法
我想是的。不要总是调用
V(g)
,而是将属性放在一个向量中,并对其进行索引。如果您包含一些示例数据,那么我还将包含一些代码

  • 这是否属于使用x值而不是度的页面排名类型算法
不,PageRank是递归的,你的排名取决于整个网络,而不仅仅取决于你邻居的分数

  • 有可能以某种方式使用GPU吗
不使用igraph。如果没有GPU,你肯定可以使这个速度足够快,所以我不会那样做

  • 在igraph Python中这会更快吗
这取决于你是如何写的,如果你在R中用正确的方式写的,那么在Python中也不会更快

编辑: 我忽略了进度条,因为实际上这是最慢的

最快的解决方案以上的数据帧 使用因素
system.time({

adj_vec我已经添加了一些样本数据和一些测试。data.frame方法是你建议的吗?你能提供任何改进吗?@Ger:谢谢,今天稍后会看,现在需要运行。顺便说一句。请在示例代码中设置随机种子,以确保再现性。谢谢我已经添加了一些样本数据和一些测试。data.frame是否是ap探讨你的建议?你能提供任何改进吗?@Ger:谢谢,今天晚些时候会看,现在需要运行。顺便说一句。请在示例代码中设置随机种子,以确保再现性。谢谢Hanks shadow,当然更快…请参阅上面的速度测试谢谢shadow,当然更快…请参阅上面的速度测试
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 
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 
avg_nei <- ldply(V(g), function(vert){
  mean(get.vertex.attribute(g, "X", index=neighbors(g,vert)), na.rm=TRUE)
}, .parallel = TRUE)
V(g)$avg_contact_val <- avg_nei
system.time({
  sub_ages2 <- data.frame(row.names = V(g)$NAME, X = V(g)$X);
  avg_contact_ages <- ldply(adjcency_list, function(neis) {
    mean(sub_ages2[neis, "X"], na.rm = T)
  })
})
#    user  system elapsed 
#   0.368   0.020   0.386 
system.time({
  sub_ages2 <- data.frame(row.names = V(g)$NAME, X = V(g)$X);
  avg_contact_ages <- sapply(adjcency_list, function(neis) {
    mean(sub_ages2[neis, "X"], na.rm = TRUE)
  })
})
#    user  system elapsed 
#   0.340   0.017   0.356 
system.time({
  adj_vec <- unlist(adjcency_list)
  adj_fac <- factor(rep(seq_along(adjcency_list),
                 sapply(adjcency_list, length)),levels=seq_len(vcount(g)))
  avg_contact_ages <- tapply(V(g)$X[adj_vec], adj_fac, mean, na.rm=TRUE)
})
#    user  system elapsed 
#   0.131   0.008   0.138