【问题标题】:How to get an Adjacency matrix from count matrix如何从计数矩阵中获取邻接矩阵
【发布时间】:2017-12-12 04:11:15
【问题描述】:

我有一个 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

【问题讨论】:

  • 您能否发布一个可重现的小示例?最好是可以复制/粘贴的东西。共享代码以生成示例输入(dput() 对此很有用)并显示该输入所需的输出。
  • 当然,我刚刚发布了它。谢谢

标签: r sparse-matrix adjacency-matrix


【解决方案1】:

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

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。

【讨论】:

  • 它不允许我计算乘法(无法分配大小为 1.2 GB 的向量)我的初始矩阵是 200 万乘 70。
  • 我希望得到一个 70x70 的矩阵作为结果。而且我的初始矩阵非常稀疏,平均每行 3 个值
  • 哦,是的,我的行和列已切换。它是一个稀疏矩阵对象吗?只要它存在,它就不应该成为一个真正的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
相关资源
最近更新 更多