У меня есть квадратная матрица с несколькими десятками тысяч строк и столбцов с несколькими 1
рядом с тоннами 0
, поэтому я использую пакет Matrix
для эффективного хранения этого в R. Объект base::matrix
не может обработать такое количество ячеек, так как мне не хватает памяти.
Моя проблема в том, что мне нужна обратная, а также обобщенная обратная Мура-Пенроуза таких матриц, которые я не могу вычислить в настоящее время.
Что я пробовал:
solve
выдает ошибкуError in LU.dgC(a) : cs_lu(A) failed: near-singular A (or out of memory)
MASS::ginv
несовместим с классомMatrix
- нет прямого способа преобразовать разреженный
Matrix
, например.bigmemory::big.matrix
, а последний все равно не работает сMASS::ginv
если я попытаюсь вычислить факторизацию Холески матрицы, чтобы позже вызвать для этого
Matrix::chol2inv
, я получу следующее сообщение об ошибке:Error in .local(x, ...) : internal_chm_factor: Cholesky factorization failed In addition: Warning message: In .local(x, ...) : Cholmod warning 'not positive definite' at file ../Cholesky/t_cholmod_rowfac.c, line 431
основываясь на связанном вопросе, я также попробовал
pbdDMAT
пакет на одном узле, ноpbdDMAT::chol
выдал сообщение об ошибкеCholmod error 'out of memory' at file ../Core/cholmod_memory.c, line 147
Вопрос в двух словах: есть ли способ вычислить обратную и обобщенную обратную Мура-Пенроуза такой разреженной матрицы, помимо использования класса matrix
на компьютере с тоннами оперативной памяти?
Краткий воспроизводимый пример:
library(Matrix)
n <- 1e5
m <- sparseMatrix(1:n, 1:n, x = 1)
m <- do.call(rBind, lapply(1:10, function(i) {
set.seed(i)
m[-sample(1:n, n/3), ]
}))
m <- t(m) %*% m
Некоторые описания (спасибо Габору Гротендику):
> dim(m)
[1] 100000 100000
> sum(m) / prod(dim(m))
[1] 6.6667e-05
> table(rowSums(m))
0 1 2 3 4 5 6 7 8 9 10
5 28 320 1622 5721 13563 22779 26011 19574 8676 1701
> table(colSums(m))
0 1 2 3 4 5 6 7 8 9 10
5 28 320 1622 5721 13563 22779 26011 19574 8676 1701
И некоторые сообщения об ошибках:
> Matrix::solve(m)
Error in LU.dgC(a) : cs_lu(A) failed: near-singular A (or out of memory)
> base::solve(m)
Error in asMethod(object) :
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
> MASS::ginv(m)
Error in MASS::ginv(m) : 'X' must be a numeric or complex matrix
Целью bounty является поиск способа вычисления обобщенной обратной функции Мура-Пенроуза m
с объемом оперативной памяти менее 8 ГБ (скорость и производительность не важны).
D_1
иD^a_2
было очень быстрым сMatrix::sparseMatrix
, но я застрял с обратным (pseduo). - person daroczig   schedule 25.05.2014m
не создает квадратные матрицы. - person James   schedule 26.05.2014max
сгенерированного образца. - person daroczig   schedule 26.05.2014set.seed
. - person G. Grothendieck   schedule 26.05.2014