如何编写创建R/Python
的{{1}}程序,其中行表示节点,列表示边,如果边是三角形的一部分,则条目在此邻接矩阵中为1节点是同一个三角形的一部分。我实际上更感兴趣的是为了这个目的使用node-edge adjacency matrix
或igraph
,但是不介意为此目的看到不同的包/程序。
我知道我可以使用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
答案 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