如何从计数矩阵中获取邻接矩阵

How to get an Adjacency matrix from count matrix

我有一个 nxp 非常稀疏的计数矩阵,只有非负值和名为 y_1、...、y_p 的列。 (n=200 万,p=70)

我想使用 R 将其转换为一个矩阵,该矩阵计算 y_i 和 y_j 在同一行上具有非零值的次数。

示例:

ID a b c d e 
1  1 0 1 0 0
2  0 1 1 0 0
3  0 0 1 1 0
4  1 1 0 0 0

我想获得:

- a b c d e
a 2 1 1 0 0
b 1 2 1 0 0 
c 1 1 3 1 0
d 0 0 1 1 0
e 0 0 0 0 0

这是一个简单的矩阵乘法。

t(m) %*% m
  a b c d e
a 2 1 1 0 0
b 1 2 1 0 0
c 1 1 3 1 0
d 0 0 1 1 0
e 0 0 0 0 0

使用此数据:

m = read.table(text = "ID a b c d e 
1  1 0 1 0 0
2  0 1 1 0 0
3  0 0 1 1 0
4  1 1 0 0 0", header = T)
m = as.matrix(m[, -1])

这依赖于只有 1 和 0 的原始矩阵。如果不是,您可以使用 m = original_matrix > 0

创建它

这是在您描述的矩阵上工作:

library(Matrix)
nr = 2e6
nc = 70
mm = Matrix(0, nrow = nr, ncol = nc, sparse = T)

# make, on average, three 1s per row
set.seed(47)
mm[cbind(sample(nr, size = 3 * nr, replace = T), sample(nc, size = 3 * nr, replace = T))] = 1 

system.time({res = t(mm) %*% mm})
  #  user  system elapsed 
  # 0.836   0.057   0.895 
format(object.size(res), units = "Mb")
[1] "0.1 Mb

在我的笔记本电脑上,计算时间不到一秒,结果约为 0.1 Mb。