(本地/节点和全局)使用igraph shortest.paths功能的效率

时间:2015-01-05 18:37:03

标签: r graph-theory igraph shortest-path

我正在尝试使用igraph包的shortest.paths来计算图的局部效率。

根据定义,顶点v的局部效率是在v的所有直接邻居中计算的“全局效率”(Latora& Machiori,2001)。 我想出了下面的代码,以获得全球和本地效率。但是,后者在计算中包括目标顶点。在上面的论文中,他们说必须取出目标顶点。

#Global Efficiency (average inverse shortest paths between all u--v vertices)
eff<-1/(shortest.paths(my.graph))
eff[!is.finite(eff)]<-0
gl.eff<-mean(eff,na.rm=TRUE)    

#Mean local efficiency (global efficiency for each node)
gn<-graph.neighborhood(my.graph,1) #list with subgraphs of directly connected graphs
names(gn)<-colnames(my.corr.matrix)
local.eff<-numeric(length(gn))
for (i in 1:length(gn)){
  gn[[i]]<-gn[[i]] - vertex(V(gn[[i]])[grep(names(gn[i]),V(gn[[i]]))]) #doesn't match
  eff.gn<-1/(shortest.paths(gn[[i]]))
  eff.gn[!is.finite(gleff.gn)]<-0
  eff.gn<-mean(eff.gn,na.rm=TRUE)
  local.eff[i]<-gleff.gn
  mean.local.eff<-mean(local.eff, na.rm=TRUE)
}

我试图将列表名称(列表的每个元素是子图)与该子图内的顶点名称进行匹配。我正在尝试使用'grep()',但未能正确使用它。有人能帮我一把吗?

提前致谢,

3 个答案:

答案 0 :(得分:1)

我已经编写了一个功能,比你写的快很多倍。看看以下是否符合您的需求。对于较小的图形(或者如果您使用的是Windows),您可能希望将simplify2array(mclapply(nodes,替换为sapply(nodes,,然后当然会删除参数mc.cores=detectCores()。然而,这确实有助于大型图表的性能。

您可以在以下链接中看到代码:

Local efficiency code

编辑:包含一些基准信息(函数f是你的,而g是我上面粘贴的)。这是在具有4核@ 2.10 GHz(Intel i3-2310m)的笔记本电脑上完成的。

g.rand <- sample_gnp(100, .1)
V(g.rand)$degree <- degree(g.rand)
compare <- microbenchmark(f(g.rand), g(g.rand), times=1e2)
compare
Unit: milliseconds
      expr      min        lq     mean   median       uq      max neval cld
 f(g.rand) 476.9853 4097.2202 4544.720 4539.911 4895.020 9346.873   100   b
 g(g.rand) 299.2696  329.6629 1319.377 1114.054 2314.304 3003.966   100  a

答案 1 :(得分:1)

如果有人需要 python 中的本地效率,这是我的代码:

Python版本

import numpy as np
from igraph import *
np.seterr(divide='ignore')


def nodal_eff(g):
    """
    This function calculates the nodal efficiency of a weighted graph object.
    Created by: Loukas Serafeim (seralouk), Nov 2017

    Args:
     g: A igraph Graph() object.
    Returns:
     The nodal efficiency of each node of the graph
    """

    sp = g.shortest_paths_dijkstra(weights = g.es["weight"])
    sp = np.asarray(sp)
    temp = 1.0 / sp
    np.fill_diagonal(temp, 0)
    N = temp.shape[0]
    ne = ( 1.0 / (N - 1)) * np.apply_along_axis(sum, 0, temp)

    return ne

答案 2 :(得分:0)

我知道我的标题并不能完全解释我的问题。所以我自己回答了这个问题,因为我刚刚开始工作。

#Mean local efficiency (global efficiency for each node)
gn<-graph.neighborhood(my.graph,1) #list with subgraphs of directly connected graphs
names(gn)<-V(my.graph)$name
local.eff<-numeric(length(gn))
for (i in 1:length(gn)){
  gn[[i]]<-gn[[i]] - vertex(V(gn[[i]])[match(names(gn[i]),V(gn[[i]])$name)]) #MATCHES
  eff.gn<-1/(shortest.paths(gn[[i]]))
  eff.gn[!is.finite(eff.gn)]<-0
  eff.gn<-mean(eff.gn,na.rm=TRUE)
  local.eff[i]<-eff.gn
}
local.eff[local.eff %in% NaN]<-NA
mean.local.eff<-mean(local.eff, na.rm=TRUE)