2013-06-28 24 views
13

R'de bir faktör matrisine sahibim ve bunu her bir faktörün olası tüm seviyeleri için 0-1-1 kukla değişkenler matrisine dönüştürmek istiyorum. Bununla birlikte, bu "kukla" matris çok büyüktür (91690x16593) ve çok seyrektir. Onu seyrek bir matriste saklamam gerekiyor, yoksa 12GB'lık ramıma uymuyor.R: seyrek matris dönüşümü

Şu anda, aşağıdaki kodu kullanıyorum ve çok iyi çalışıyor ve saniye sürer: Ancak, ben R e1071 paketini kullanmak ve sonunda write.matrix.csr() ile formatını LIBSVM için bu matrisi kaydetmek istediğiniz

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) 

, bu yüzden önce benim seyrek matrisi SparseM formatına dönüştürmem gerekiyor.

yapmaya çalıştığım:

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

ama çok çabuk benim RAM doldurur ve sonunda çöküyor R. Dahili olarak, as.matrix.csr ilk önce, seyrek matrisi bilgisayarımın belleğine sığmayan yoğun bir matrise dönüştürüyor.

Diğer seçeneğim seyrek olarak matrisimi doğrudan SparseM formatında oluşturmak olacaktır.
as.matrix.csr(X_factors)'u denedim, ancak bir veri çerçevesi karesini kabul etmiyor.

SparseM paketinde sparse.model.matrix(~.-1, data = X_factors) eşdeğeri var mı? Dokümanlarda aradım ama bulamadım.

cevap

18

Oldukça zor ama sanırım anladım. SparseM hem sütun ve satır odaklı biçimlerini destekler ve kolayca işleyebilir işlevleri sahipken, Matrix paket bir sütun odaklı sıkıştırma biçimini kullanan

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

:

en Matrix paketinden seyrek matris ile başlayalım bir formattan diğerine dönüşüm.

yüzden ilk dönüşüme yol açması bizim sütun odaklı bir sütun odaklı SparseM matris içine Matrix: biz sadece (0 veya 1 başlayacak) sağ kurucu çağırmak ve her iki paket endeksleri için farklı kuralları kullandığını fark dikkatli olmak gerekir:

X.csc <- new("matrix.csc", ra = [email protected], 
          ja = [email protected] + 1L, 
          ia = [email protected] + 1L, 
          dimension = [email protected]) 

Sonra kolon odaklı kürek odaklı biçimden değişimi:

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

Ve bu kadar! İki matrisin aynı olduğunu (küçük örneğimde) şu şekilde kontrol edebilirsiniz:

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

Mükemmel bir şekilde çalıştı. Hizli yanit icin tesekkurler. –