[英]R: sparse matrix conversion
我在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)
的等價物? 我在文檔中搜索但我沒有找到。
相當棘手,但我想我明白了。
讓我們從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
矩陣:我們只需要小心調用正確的構造函數並注意兩個包對索引使用不同的約定(從0
或1
開始):
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.