稀疏矩阵转换

15

我有一个R中的因子矩阵,希望将其转换为每个因子的所有可能水平的0-1虚拟变量矩阵。

然而,这个"虚拟"矩阵非常大(91690x16593),并且非常稀疏。我需要将其存储在稀疏矩阵中,否则它无法适应我的12GB内存。

目前,我正在使用以下代码,它运行得非常好,并且只需几秒钟:

library(Matrix)
X_factors <- data.frame(lapply(my_matrix, as.factor))
#encode factor data in a sparse matrix
X <- sparse.model.matrix(~.-1, data = X_factors)

然而,我想在R中使用e1071软件包,并最终使用write.matrix.csr()将此矩阵保存为libsvm格式,因此我需要先将我的稀疏矩阵转换为SparseM格式。

我尝试了以下操作:

library(SparseM)  
X2 <- as.matrix.csr(X)

但它很快占用了我的 RAM ,最终导致 R 崩溃。我怀疑在内部,as.matrix.csr 首先将稀疏矩阵转换为密集矩阵,而后者不适合我的计算机内存。

我的另一个选择是直接用 SparseM 格式创建稀疏矩阵。
我尝试了 as.matrix.csr(X_factors) 但它不接受因子数据框。

在 SparseM 包中是否有与 sparse.model.matrix(~.-1, data = X_factors) 等价的函数?我查看了文档但没有找到。

1个回答

20

有点棘手,但我想我明白了。

让我们从 Matrix 包中的稀疏矩阵开始:

i <- c(1,3:8)
j <- c(2,9,6:10)
x <- 7 * (1:7)
X <- sparseMatrix(i, j, x = x)

Matrix 包使用列式压缩格式,而 SparseM 支持列式和行式格式,并且具有可轻松处理从一种格式转换为另一种格式的函数。

因此,我们将首先将我们的列式 Matrix 转换为列式 SparseM 矩阵:我们只需要小心地调用正确的构造函数并注意这两个包对索引的不同约定(从 01 开始):

X.csc <- new("matrix.csc", ra = X@x,
                           ja = X@i + 1L,
                           ia = X@p + 1L,
                           dimension = X@Dim)

然后,从列式格式转换为行式格式:

X.csr <- as.matrix.csr(X.csc)

完成了!你可以通过以下方法检查这两个矩阵是否相同(在我的小例子中):

range(as.matrix(X) - as.matrix(X.csc))
# [1] 0 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接