のソースコードnnet::class.ind
は次のとおりです。
function (cl) {
n <- length(cl)
cl <- as.factor(cl)
x <- matrix(0, n, length(levels(cl)))
x[(1L:n) + n * (unclass(cl) - 1L)] <- 1
dimnames(x) <- list(names(cl), levels(cl))
x
}
.Machine$integer.max
は 2147483647n*(nlevels - 1L)
です。がこの値より大きい場合、エラーが発生するはずです。を解くn
:
imax <- .Machine$integer.max
nlevels <- 5000
imax/(nlevels-1L)
## [1] 429582.6
429583 行以上 (データ マイニング コンテキストでは特に大きくない) がある場合、この問題が発生します。上でコメントしたように、モデリング フレームワークがスパース行列を処理できる場合は、(または) を使用した方がはるかにうまくいくでしょう。または、このボトルネックを回避するために書き直す必要があります(つまり、絶対位置ではなく行と列によるインデックス付け) [上記の @joran のコメントは、R が倍精度値を介して大きなベクトルにインデックスを付けるため、その行をハッキングするだけですMatrix::sparse.model.matrix
Matrix::fac2sparse
class.ind
x[(1:n) + n * (unclass(cl) - 1)] <- 1
おそらくas.numeric()
、強制を強制的に2倍にするために、あちこちに明示的にスローします...]
このステップを完了することができたとしても、5000*650000 のマトリックスになってしまいます。これは 12Gb になるようです。
print(650*object.size(matrix(1L,5000,1000)),units="Gb")
100Gbの空き容量があれば大丈夫だと思います...