基于集群分配的邻居组速度慢
Neighbor groups based on cluster assignment is slow
我正在使用 R 中的 iGraph 进行一些分析,我目前正在进行一项非常昂贵的计算。我需要在图表中的所有节点上执行此操作,因此如果有人知道更有效的方法,我将不胜感激。
我从图表开始,g
。我先在图上做一些社区检测
library(igraph)
adj_matrix <- matrix(rbinom(10 * 5, 1, 0.5), ncol = 8000, nrow = 8000)
g <- graph_from_adjacency_matrix(adj_matrix, mode = 'undirected', diag = FALSE)
c <- cluster_louvain(g)
然后,我基本上将每个集群分配给 2 个组中的 1 个
nc <- length(c)
assignments <- rbinom(nc, 1, .5)
现在,对于每个节点,我想找出它的邻居在给定组中的百分比(由集群分配定义)。我目前以当前方式执行此操作:
pct_neighbors_1 <- function(g, vertex, c, assignments) {
sum(
ifelse(
assignments[membership(c)[neighbors(g, vertex)]] == 1, 1, 0)
)/length(neighbors(g, vertex))
}
然后,假设我有一个数据框,其中每一行对应于图中的一个顶点,我对所有顶点执行此操作
data$pct_neighbors_1 <- sapply(1:nrow(data),
pct_neighbors_1,
graph = g, community = c,
assignments = assignments)
这里有什么地方可以提高效率吗?谢谢!
这应该会更快:
library(igraph)
# for reproducibility's sake
set.seed(1234)
# create a random 1000 vertices graph
nverts <- 1000
g <- igraph::random.graph.game(nverts,0.1,type='gnp',directed=FALSE)
# clustering
c <- cluster_louvain(g)
# assignments
nc <- length(c)
assignments <- rbinom(nc, 1, .5)
# precalculate if a vertex belongs to the assigned communities
vertsInAssignments <- membership(c) %in% which(assignments==1)
# compute probabilities
probs <- sapply(1:vcount(g),FUN=function(i){
neigh <- neighbors(g,i)
sum(vertsInAssignments[neigh]) / length(neigh)
})
我正在使用 R 中的 iGraph 进行一些分析,我目前正在进行一项非常昂贵的计算。我需要在图表中的所有节点上执行此操作,因此如果有人知道更有效的方法,我将不胜感激。
我从图表开始,g
。我先在图上做一些社区检测
library(igraph)
adj_matrix <- matrix(rbinom(10 * 5, 1, 0.5), ncol = 8000, nrow = 8000)
g <- graph_from_adjacency_matrix(adj_matrix, mode = 'undirected', diag = FALSE)
c <- cluster_louvain(g)
然后,我基本上将每个集群分配给 2 个组中的 1 个
nc <- length(c)
assignments <- rbinom(nc, 1, .5)
现在,对于每个节点,我想找出它的邻居在给定组中的百分比(由集群分配定义)。我目前以当前方式执行此操作:
pct_neighbors_1 <- function(g, vertex, c, assignments) {
sum(
ifelse(
assignments[membership(c)[neighbors(g, vertex)]] == 1, 1, 0)
)/length(neighbors(g, vertex))
}
然后,假设我有一个数据框,其中每一行对应于图中的一个顶点,我对所有顶点执行此操作
data$pct_neighbors_1 <- sapply(1:nrow(data),
pct_neighbors_1,
graph = g, community = c,
assignments = assignments)
这里有什么地方可以提高效率吗?谢谢!
这应该会更快:
library(igraph)
# for reproducibility's sake
set.seed(1234)
# create a random 1000 vertices graph
nverts <- 1000
g <- igraph::random.graph.game(nverts,0.1,type='gnp',directed=FALSE)
# clustering
c <- cluster_louvain(g)
# assignments
nc <- length(c)
assignments <- rbinom(nc, 1, .5)
# precalculate if a vertex belongs to the assigned communities
vertsInAssignments <- membership(c) %in% which(assignments==1)
# compute probabilities
probs <- sapply(1:vcount(g),FUN=function(i){
neigh <- neighbors(g,i)
sum(vertsInAssignments[neigh]) / length(neigh)
})