【问题标题】:sparseMatrix with numerical and categorical data具有数值和分类数据的稀疏矩阵
【发布时间】:2015-06-11 07:38:38
【问题描述】:

我正在尝试使用数值和分类数据创建一个稀疏矩阵,该矩阵将用作 cv.glmnet 的输入。当只涉及数值数据时,我可以使用以下语法创建一个 sparseMatrix

sparseMatrix(i=c(1,3,5,2), j=c(1,1,1,2), x=c(1,2,4,3), dims=c(5,2))

对于分类变量,以下方法似乎可行:

sparse.model.matrix(~-1+automobile, data.frame(automobile=c("sedan","suv","minivan","truck","sedan")))

我的非常稀疏的实例有 1,000,000 个观察值和 10,000 个变量。我没有足够的内存来首先创建完整的矩阵。我能想到的创建 sparseMatrix 的唯一方法是通过创建列并将数据转换为 (i,j,x) 格式来手动处理分类变量。我希望有人可以提出更好的方法。

【问题讨论】:

  • 提供数据样本怎么样?

标签: r sparse-matrix model.matrix


【解决方案1】:

稀疏矩阵与密集矩阵具有相同的容量,可以使用两列矩阵作为“[”的单个参数来分配位置:

require(Matrix)
M <- Matrix(0, 10, 10)
dfrm <- data.frame(rows=sample(1:10,5), cols=sample(1:10,5), vals=rnorm(5))
dfrm
#---------
  rows cols       vals
1    3    9 -0.1419332
2    4    3  1.4806194
3    6    7 -0.5653500
4    5    1 -1.0127539
5    1    2 -0.5047298
#--------

M[ with( dfrm, cbind(rows,cols) ) ] <- dfrm$vals
M
#---------------

M
10 x 10 sparse Matrix of class "dgCMatrix"

 [1,]  .        -0.5047298 .        . . .  .       .  .         .
 [2,]  .         .         .        . . .  .       .  .         .
 [3,]  .         .         .        . . .  .       . -0.1419332 .
 [4,]  .         .         1.480619 . . .  .       .  .         .
 [5,] -1.012754  .         .        . . .  .       .  .         .
 [6,]  .         .         .        . . . -0.56535 .  .         .
 [7,]  .         .         .        . . .  .       .  .         .
 [8,]  .         .         .        . . .  .       .  .         .
 [9,]  .         .         .        . . .  .       .  .         .
[10,]  .         .         .        . . .  .       .  .         .

【讨论】:

    【解决方案2】:

    这可能有效,也可能无效,但您可以尝试分别为每个变量创建模型矩阵,然后将它们cBinding 在一起。

    do.call(cBind,
            sapply(names(df), function(x) sparse.model.matrix(~., df[x])[, -1, drop=FALSE]))
    

    请注意,您可能希望创建截距列然后将其删除,而不是像上面那样在公式中指定-1。后者将为您的第一个因素删除一个级别,但为其他因素保留所有级别,因此这取决于变量的顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-07
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多