У меня есть редкий Matrix
в R, который, по-видимому, слишком большой для меня, чтобы запустить as.matrix()
(хотя и не супер-огромный). Запрос as.matrix()
находится внутри функции svd()
, поэтому мне интересно, знает ли кто-нибудь другую реализацию SVD, которая не требует сначала преобразования в плотную матрицу.
SVD для разреженной матрицы в R
Ответ 1
Пакет irlba имеет очень быструю реализацию SVD для разреженных матриц.
Ответ 2
Вы можете сделать очень впечатляющий бит редкого SVD в R, используя случайную проекцию, как описано в http://arxiv.org/abs/0909.4061
Вот пример кода:
# computes first k singular values of A with corresponding singular vectors
incore_stoch_svd = function(A, k) {
p = 10 # may need a larger value here
n = dim(A)[1]
m = dim(A)[2]
# random projection of A
Y = (A %*% matrix(rnorm((k+p) * m), ncol=k+p))
# the left part of the decomposition works for A (approximately)
Q = qr.Q(qr(Y))
# taking that off gives us something small to decompose
B = t(Q) %*% A
# decomposing B gives us singular values and right vectors for A
s = svd(B)
U = Q %*% s$u
# and then we can put it all together for a complete result
return (list(u=U, v=s$v, d=s$d))
}
Ответ 3
Итак, вот что я сделал. Сложно написать процедуру, которая выгружает разреженную матрицу (класс dgCMatrix
) в текстовый файл в формате SVDLIBC "разреженный текст", затем вызывает исполняемый файл svd
и считывает три результирующих текстовых файла обратно в R.
Уловка в том, что он довольно неэффективен - мне требуется около 10 секунд для чтения и записи файлов, но фактический расчет SVD занимает всего около 0,2 секунды или около того. Тем не менее, это, конечно, намного лучше, чем неспособность выполнить вычисления вообще, поэтому я счастлив. =)
Ответ 4
rARPACK - необходимый вам пакет. Работает как шарм и супербыстро, потому что он параллелизуется с помощью C и С++.