【问题标题】:Creating the node-edge triangle adjacency graph in Python/R在 Python/R 中创建节点边三角形邻接图
【发布时间】:2014-02-10 23:02:16
【问题描述】:

如何编写一个R/Python 程序来创建一个node-edge adjacency matrix,其中行表示节点,列表示边,如果边是三角形的一部分并且节点是三角形的一部分,则该邻接矩阵中的条目是一个属于同一个三角形。实际上,我更感兴趣的是为此目的使用igraphlinkcomm,但我不介意为此目的看到不同的包/程序。

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

> 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

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

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 不是矩阵。关于在 cocluster 函数中使用 m 稀疏矩阵应该怎么做有什么想法吗?

>library("blockcluster")
> out<-cocluster(m,datatype="binary",nbcocluster=c(2,3))
Error in cocluster(m, datatype = "binary", nbcocluster = c(2, 3)) : 
  Data should be matrix.

【问题讨论】:

  • 这是一个有趣的问题,但我建议您提供一个示例图以及所需的输出,以便人们更容易地帮助您。这是您可能会使用的图表:library(igraph); set.seed(4); g &lt;- erdos.renyi.game(5,.3); plot(g)。如果您使用它,请务必显示您想要的输出矩阵的确切形式。
  • @JoshO'Brien 我更新了我的问题。你能看一下吗?
  • @JoshO'Brien 你能看一下更新问题的结尾吗?我真的很感激。
  • 只是一个猜测,但您是否尝试过在您对cocluster() 的调用中将m(可能具有Matrix 或类似的类)替换为as.matrix(m)? (as.matrix(m) 将强制将m 转换为matrix 类,这就是错误告诉您m 应该是......)
  • 谢谢你成功了。 out&lt;-cocluster(as.matrix(m),datatype="binary",nbcocluster=c(2,3)) 预计当我在绘图时 plot(out) 我收到此错误,所以我不确定我是否正确调用了 cocluster? Error in plot.new() : figure margins too large

标签: python r graph igraph adjacency-matrix


【解决方案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

【讨论】:

  • 我更新了问题。它是否只找到 k>=3 中的三角形或 k 团?你也知道如何加速这个算法吗?
  • 代码首先计算团,然后从团中提取三角形。对于大图,直接计算三角形可能会更快。
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 2018-01-09
  • 2018-11-05
  • 2012-02-14
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多