绘制二部图的分区比整个图花费更多的时间

时间:2019-03-03 08:34:55

标签: r plot igraph graph-theory

在我的代码中,绘制整个二部图所花的时间比单独绘制其中一个投影要少得多(当然,投影比二部图要少,因为它只是二部图的一部分)。怎么会呢?

代码如下:

rm(list=ls())
library(igraph)
library(tictoc)
nodes <- read.csv("./ma_nodes.csv", header=T, as.is=T)
links <- read.csv("./ma_edges.csv", header=T, as.is=T)
nodes$type <- as.logical(nodes$IsInvestor)
net <- graph_from_data_frame(d=links, vertices=nodes, directed=T)
net.bp <- bipartite_projection(net, multiplicity=F)
net.prj1 = net.bp$proj1
net.prj2 = net.bp$proj2

tic("Plotting bibpartite net")
plot(net)
toc()

tic("Plotting prj2")
plot(net.prj2)
toc()

tic("Plotting prj1")
plot(net.prj1)
toc()

这是结果:

Plotting bibpartite net: 5.04 sec elapsed
Plotting prj2: 0.21 sec elapsed
Plotting prj1: 77.9 sec elapsed

还请注意,使用Sys.time()来测量时间(并采用差值结束时间-开始时间),不会捕获此效果。但这是不正确的:绘制最后一个图形比绘制其他两个图形花费更多的时间。这是sys.time()的一个问题,无法捕获它(但可能是另一个问题)

这是怎么回事?

1 个答案:

答案 0 :(得分:3)

我认为这样做会更好。但是我没有必要的声誉。因此,我将更详细地回答您的问题。

您没有提供样品。所以我只能做一个假设。与双向网络相比,您的投影最有可能具有更多的边缘。根据您的特定网络,这可能会大大增加创建图的时间。

从具有500个边的无向网络中进行二分投影将导致124750(或n *(n-1)/ 2)个边。

library(igraph)
library(tictoc)

g <- data.frame(c(1:500), "A")
g <- graph_from_data_frame(g)
V(g)$type <- bipartite_mapping(g)$type
bp <- bipartite_projection(g)

gsize(g)
500

gsize(bp$proj1)
124750

并且绘图时间将增加8.5秒(2015年起配备Intel i7和16 GB RAM的MacBook Pro):

tic("Plotting bibpartite net")
plot(g)
toc()
Plotting bibpartite net: 1.194 sec elapsed

tic("Plotting projected net")
plot(bp$proj1)
toc()
Plotting projected net: 9.621 sec elapsed

问题在于,投影网络中的联系数量呈指数增长,创建图的时间也呈指数增长。