2013-06-28 75 views
13

Tôi có ma trận các yếu tố trong R và muốn chuyển đổi thành ma trận biến giả 0-1 cho tất cả các mức có thể của từng yếu tố.R: chuyển đổi ma trận thưa thớt

Tuy nhiên, ma trận "giả" này rất lớn (91690x16593) và rất thưa thớt. Tôi cần phải lưu trữ nó trong một ma trận thưa thớt, nếu không nó không phù hợp trong 12GB ram của tôi.

Hiện nay, tôi đang sử dụng đoạn mã sau và nó hoạt động rất tốt và mất vài giây:

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) 

Tuy nhiên, tôi muốn sử dụng gói e1071 trong R, và cuối cùng lưu ma trận này để libsvm định dạng với write.matrix.csr() , vì vậy trước tiên tôi cần phải chuyển đổi ma trận thưa thớt của mình sang định dạng SparseM.

Tôi cố gắng để làm:

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

nhưng nó rất nhanh chóng lấp đầy bộ nhớ RAM của tôi và cuối cùng R tai nạn. Tôi nghi ngờ rằng nội bộ, as.matrix.csr đầu tiên chuyển đổi ma trận thưa thớt thành một ma trận dày đặc không phù hợp với bộ nhớ máy tính của tôi.

Phương án thay thế khác của tôi là tạo ma trận thưa thớt trực tiếp ở định dạng SparseM.
Tôi đã thử as.matrix.csr(X_factors) nhưng không chấp nhận khung dữ liệu của các yếu tố.

Có tương đương với sparse.model.matrix(~.-1, data = X_factors) trong gói SparseM không? Tôi đã tìm kiếm trong tài liệu nhưng tôi không tìm thấy.

Trả lời

18

Khá phức tạp nhưng tôi nghĩ tôi đã hiểu.

Hãy bắt đầu với một ma trận thưa thớt từ Matrix gói:

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

Gói Matrix sử dụng một định dạng nén cột theo định hướng, trong khi SparseM hỗ trợ cả định dạng cột và hàng theo định hướng và có chức năng mà có thể dễ dàng xử lý các chuyển đổi từ một định dạng này sang định dạng khác.

Vì vậy, đầu tiên chúng ta sẽ chuyển đổi của chúng tôi cột hướng Matrix thành một SparseM ma trận cột theo định hướng: chúng ta chỉ cần cẩn thận gọi constructor phải và nhận thấy rằng cả hai gói sử dụng quy ước khác nhau cho chỉ số (bắt đầu từ 0 hoặc 1):

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

Sau đó, thay đổi từ định dạng cột hướng chèo theo định hướng:

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

Và bạn đã hoàn tất! Bạn có thể kiểm tra xem hai ma trận có giống hệt nhau hay không (ví dụ nhỏ của tôi) bằng cách thực hiện:

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

Nó hoạt động hoàn hảo. Cảm ơn bạn đã trả lời nhanh chóng. –

Các vấn đề liên quan