Исходный код 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
является 2147483647. Если n*(nlevels - 1L)
больше, чем это значение, которое должно произвести свою ошибку. Решение для n
:
imax <- .Machine$integer.max
nlevels <- 5000
imax/(nlevels-1L)
## [1] 429582.6
Вы столкнулись с этой проблемой, если у вас есть 429583 или больше строк (не особенно большие для контекста данных добычи). Как уже отмечалось выше, вы сделаете намного больше с Matrix::sparse.model.matrix
(или Matrix::fac2sparse
), если ваша модельная структура может обрабатывать разреженные матрицы. В качестве альтернативы вам придется переписать class.ind
, чтобы избежать этого узкого места (например, индексирование по строкам и столбцам, а не по абсолютному местоположению) [комментарии @joran выше, что R индексирует большие векторы с помощью значений двойной точности, поэтому вы можете уйти только с хакерством этой строки в
x[(1:n) + n * (unclass(cl) - 1)] <- 1
возможно бросание в явном as.numeric()
здесь или там, чтобы заставить принуждение удвоить ...]
Даже если вы были в состоянии выполнить этот шаг, вы бы в конечном с матрицей 5000 * 650000 - похоже, что это будет 12 ГБ.
print(650*object.size(matrix(1L,5000,1000)),units="Gb")
Я думаю, если у вас есть 100Gb бесплатно, что может быть в порядке ...
Сколько строк делает ваши данные имеют ... 'FLN <- data.frame (class.ind (паста (1: 5000, «a»))) 'работает без проблем на моем старом лаппе. – user20650
возможно https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/sparse.model.matrix.html полезно – user20650
Я собирался согласиться с @ user20650. Это будет сложно для людей в системах с ограниченной памятью, чтобы воспроизвести это. На моем ноутбуке результаты «z <- factor (rep (1: 5000, n)); FLN <- data.frame (nnet :: class.ind (z)) 'либо либо в зависимости от' n', (1) fine; (2) очевидные ошибки относительно слишком большой матрицы или отсутствия памяти; (3) сбой моего сеанса R из-за слишком больших запросов на память –