我有稀疏数据问题,通常需要计算稀疏模型矩阵。我最终应该收到的矩阵包含~95%的零。这通常是由于一个热点编码的因素变得稀疏,并进一步与这些稀疏矢量进行交互。
require(Matrix)
require(data.table)
require(magrittr)
n = 500000
p = 10
x.matrix = matrix(rnorm(n*p), n, p)
colnames(x.matrix) = sprintf("n%s", 1:p)
x.categorical = data.table(
c1 = sample(LETTERS, n, replace = T),
c2 = sample(LETTERS, n, replace = T),
c3 = sample(LETTERS, n, replace = T)
)
x = cBind(x.matrix, x.categorical)
myformula = "~ n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 +n10 +
c1 + c1*c2 + c3 + n1:c1"
mm = model.matrix(myformula %>% as.formula, x)
mm2 = sparse.model.matrix(myformula %>% as.formula, x)
我发现稀疏问题上sparse.model.matrix的性能比model.matrix(通常用于密集问题)更糟糕。这是使用Rstudio的分析工具揭示的。
这里稀疏模型矩阵比model.matrix花费更多的时间,并且使用几乎相同的内存量。在一些问题中,我发现当处理稀疏的数据时,sparse.model.matrix比model.matrix慢10倍。
有更好的方法来创建稀疏矩阵吗?我搜索了很多,但没有找到任何。或者,我有兴趣找到其他人或获得如何从头开始实现更智能的sparse.model.matrix的技巧,可能使用Rcpp或data.table函数
问题的根源在sparse2int,虽然我不太了解它的用途,但仍然有一些" FIXME"仍留在代码中。