Создание графа смежности треугольника узел-ребро в Python/R

Как я могу написать программу R/Python, которая создает node-edge adjacency matrix, в которой строки обозначают узлы, а столбцы обозначают ребра, а запись является единицей в этой матрице смежности, если ребро является частью треугольника, а узел является частью того же треугольника. На самом деле мне больше интересно использовать igraph или linkcomm для этой цели, но я был бы не против увидеть другой пакет/программу для этой цели.

Я знаю, что могу использовать 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 не является матрицей. Любая идея о том, что я должен сделать, чтобы использовать разреженную матрицу m в функции cocluster?

>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.

person Mona Jalal    schedule 10.02.2014    source источник
comment
Это интересный вопрос, но я бы посоветовал вам предоставить пример графика вместе с желаемым результатом, чтобы людям было легче вам помочь. Вот график, который вы могли бы использовать для этого: library(igraph); set.seed(4); g <- erdos.renyi.game(5,.3); plot(g). Если вы используете его, покажите точную форму выходной матрицы, которую вы хотите.   -  person Josh O'Brien    schedule 11.02.2014
comment
@JoshO'Brien ДжошО'Брайен, я обновил свой вопрос. Не могли бы вы взглянуть?   -  person Mona Jalal    schedule 11.02.2014
comment
@JoshO'Brien Не могли бы вы взглянуть на конец обновленного вопроса? Я правда ценю это.   -  person Mona Jalal    schedule 17.02.2014
comment
Просто предположение, но пробовали ли вы заменить m, который, вероятно, имеет класс Matrix или что-то подобное, на as.matrix(m) в вашем вызове cocluster()? (as.matrix(m) принудит m к классу matrix, что, как говорит вам ошибка, должно быть m....)   -  person Josh O'Brien    schedule 17.02.2014
comment
Спасибо, это сработало. out<-cocluster(as.matrix(m),datatype="binary",nbcocluster=c(2,3)) ожидать, когда я рисую plot(out) я получаю эту ошибку, поэтому я не уверен, правильно ли я вызываю cocluster или нет? Error in plot.new() : figure margins too large   -  person Mona Jalal    schedule 17.02.2014


Ответы (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
person Vincent Zoonekynd    schedule 10.02.2014
comment
Я обновил вопрос. Находит ли он только треугольники или k-клики, в которых k›=3 ? Также у вас есть идеи, как ускорить этот алгоритм? - person Mona Jalal; 17.02.2014
comment
Код сначала вычисляет клики, а затем извлекает из них треугольники. Для больших графов может быть быстрее напрямую вычислить треугольники. - person Vincent Zoonekynd; 20.02.2014