Каков наиболее эффективный метод построения больших матриц смежности (не графиков)?

Я ищу эффективный способ построения больших матриц смежности (узлов > 1M) в R. Цель состоит не в том, чтобы построить их как сетевой график, а в том, чтобы построить саму матрицу смежности.

Это довольно распространенная визуализация в области сетевого анализа и особенно обнаружения сообществ, но я не могу найти способ получить такой график в R. Самое близкое, что я могу найти, это функция levelplot() из решетки, но она не похоже, что он не может работать с матрицами такого размера.

Ниже приведен пример желаемого результата из статьи Reichardt & Bornholdt.
Матрицы смежности можно загрузить из Стэнфордской коллекции больших сетевых данных.

введите здесь описание изображения


person LTribe    schedule 12.11.2020    source источник


Ответы (1)


Моей первой ставкой было взглянуть на метод image из пакета Matrix. Примером может быть что-то вроде:

#####
# simulate a random matrix
n <- 1000000L # number of nodes
set.seed(1)
rng_i <- sample.int(n, size = 100L * n, replace = TRUE)
rng_j <- sample.int(n, size = 100L * n, replace = TRUE)
i <- c(1:n, rng_i, rng_j)
j <- c(1:n, rng_j, rng_i)
x <- runif(n * 100L)
x <- c(rep(1, n), x, x)

keep <- j <= i & c(rep(TRUE, n), tail(i, -n) != tail(j, -n))
j <- j[keep]
i <- i[keep]
x <- x[keep]

# use the image method from Matrix
library(Matrix)
mat <- sparseMatrix(i = i, j = j, x = x, symmetric = TRUE)
image(mat)

Это занимает некоторое время, но оказывается основанным на levelplot из lattice. На выходе получается большой пустой график.

Немного подумав, если у вас есть, скажем, изображение размером 102 x 102 мм (~ 4 x 4 дюйма) и матрица 1 м x 1 м, то на каждый элемент матрицы приходится ~ 0,0001 x 0,0001 мм, если не учитывать ось и т. д. , Не зная многого о человеческом восприятии или изображениях, я предполагаю, что вам потребуется очень большое количество пикселей на дюйм, чтобы построить их, и я не уверен, что это будет воспринимаемо, если нет более крупных кластеров соседних ненулевых записи.

С другой стороны, если вы измените n <- 10000L, вы получите:

введите здесь описание изображения

довольно быстро. Вышеизложенное также дает представление о том, насколько тяжело будет воспринимать коробки, которые на 1/100 x 1/100 меньше. Я предполагаю, что нужно искать количество соседних ненулевых узлов в большей окрестности, но я не знаю пакета, который это сделает.

person Benjamin Christoffersen    schedule 12.11.2020
comment
Ты лучший! Это именно та функция, которую я искал. Однако сначала у меня были проблемы с упорядочением строк и столбцов по сообществам, потому что, по-видимому, алгоритм обнаружения сообществ, который я использовал, сортировал узлы в каждом сообществе по их центральности. Поэтому для достижения желаемого результата мне нужно было рандомизировать строки и столбцы перед сортировкой по сообществу. - person LTribe; 12.11.2020
comment
Превосходно! Я рад помочь. - person Benjamin Christoffersen; 12.11.2020