在Python / R中创建节点边三角形邻接图

时间:2014-02-10 23:02:17

标签: python r graph igraph adjacency-matrix

如何编写创建R/Python的{​​{1}}程序,其中行表示节点,列表示边,如果边是三角形的一部分,则条目在此邻接矩阵中为1节点是同一个三角形的一部分。我实际上更感兴趣的是为了这个目的使用node-edge adjacency matrixigraph,但是不介意为此目的看到不同的包/程序。

我知道我可以使用maximal.clique(g)来定位三角形,但我不知道如何利用这些数据来创建节点边三角形邻接矩阵。

linkcomm

根据文森特的答案,当我使用以下内容时,我怀疑它是否找到了正好大小为3的集团,或者它是否发现了大小为3或更大的派系? (我只需要三角形)。一个问题是这段代码非常慢。有关如何加快这个的想法吗?

> g <- erdos.renyi.game(15, 45, type="gnm", dir=TRUE)
> triad.census(g)
 [1] 113 168 38 16 13 49 23 17 7 2
[11] 2 1 2 2 2 0
> str(g)
IGRAPH D--- 15 45 -- Erdos renyi (gnm) graph
+ attr: name (g/c), type (g/c), loops
 (g/x), m (g/n)
+ edges:
 1 -> 3 4 6 12 13 2 -> 1 3 7 
 3 -> 2 5 10 15 4 -> 5 12 14 
 5 -> 6 7 9 6 -> 4 8 12 
 7 -> 5 9 12 8 -> 2 7 15 
 9 -> 1 4 11 13 10 -> 4 5 8 
11 -> 1 2 9 12 -> 1 4 14 15 
13 -> 15 14 -> 11 12 
15 -> 3 
> maximal.cliques(g)
[[1]]
[1] 13 15


[[2]]
[1] 13 1 9


[[3]]
[1] 2 8 7


[[4]]
[1] 2 1 3


[[5]]
[1] 2 1 11


[[6]]
[1] 3 5 10


[[7]]
[1] 3 15


[[8]]
[1] 4 14 12


[[9]]
[1] 4 10 5


[[10]]
[1] 4 5 6


[[11]]
[1] 4 5 9


[[12]]
[1] 4 1 9


[[13]]
[1] 4 1 12 6


[[14]]
[1] 5 7 9


[[15]]
[1] 6 8


[[16]]
[1] 7 12


[[17]]
[1] 8 15


[[18]]
[1] 8 10


[[19]]
[1] 9 1 11


[[20]]
[1] 11 14


[[21]]
[1] 12 15


Warning message:
In maximal.cliques(g) :
 At maximal_cliques_template.h:203 :Edge directions are ignored for maximal clique calculation

由于某些原因,函数library(igraph) set.seed(1) g <- erdos.renyi.game(100, .6) #print(g) plot(g) ij <- get.edgelist(g) print(ij) library(Matrix) m <- sparseMatrix( i = rep(seq(nrow(ij)), each=2), j = as.vector(t(ij)), x = 1 ) print(m) # Maximal cliques of size at least 3 cl <- maximal.cliques(g) print(cl) cl <- cl[ sapply(cl, length) > 2 ] print(cl) # Function to test if an edge is part of a triangle triangle <- function(e) { any( sapply( cl, function(u) all( e %in% u ) ) ) } print(triangle) # Only keep those edges kl <- ij[ apply(ij, 1, triangle), ] print(kl) # Same code as before m <- sparseMatrix( i = rep(seq(nrow(kl)), each=2), j = as.vector(t(kl)), x = 1 ) print(m) 告诉我输出cocluster不是矩阵。关于在m函数中使用m稀疏矩阵我该怎么做的任何想法?

cocluster

1 个答案:

答案 0 :(得分:1)

以下为您提供边/顶点邻接矩阵, 但是对于所有边缘,不仅仅包括在三角形中。

library(igraph)
set.seed(1)
g <- erdos.renyi.game(6, .6)
plot(g)

ij <- get.edgelist(g)
library(Matrix)
m <- sparseMatrix(
  i = rep(seq(nrow(ij)), each=2),
  j = as.vector(t(ij)),
  x = 1
)

根据您的建议,您可以使用maximal.cliques 识别三角形的边缘 (等效地,这是最大的一部分 大小至少3)。

# Maximal cliques of size at least 3
cl <- maximal.cliques(g)
cl <- cl[ sapply(cl, length) > 2 ]

# Function to test if an edge is part of a triangle
triangle <- function(e) {
  any( sapply( cl, function(u) all( e %in% u ) ) )
}

# Only keep those edges
kl <- ij[ apply(ij, 1, triangle), ]

# Same code as before
m <- sparseMatrix(
  i = rep(seq(nrow(kl)), each=2),
  j = as.vector(t(kl)),
  x = 1
)
m
# 5 x 5 sparse Matrix of class "dgCMatrix"
# [1,] 1 1 . . .
# [2,] . 1 1 . .
# [3,] 1 . . . 1
# [4,] . 1 . . 1
# [5,] . . 1 . 1