SVD для разреженной матрицы в R
у меня негусто Matrix
в R, что, по-видимому, слишком большой для меня, чтобы запустить as.matrix()
on (хотя это тоже не супер-огромный). The as.matrix()
вызов в вопросе находится внутри svd()
функция, поэтому мне интересно, знает ли кто-нибудь другую реализацию SVD, которая не требует первого преобразования в плотную матрицу.
4 ответов
вы можете сделать очень впечатляющий бит разреженного 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))
}
Итак, вот что я закончил делать. Относительно просто написать процедуру, которая сбрасывает разреженную матрицу (class dgCMatrix
) в текстовый файл в формате SVDLIBC "разреженный текст", затем вызовите svd
исполняемый файл и прочитайте три результирующих текстовых файла обратно в R.
загвоздка в том, что это довольно неэффективно - мне требуется около 10 секунд для чтения и записи файлов, но фактический расчет SVD занимает всего около 0,2 секунды или около того. Еще, это конечно лучше чем вообще не в состоянии выполнить расчет, так что я счастлив. =)
rARPACK-это пакет, который вам нужен. Работает как шарм и сверхбыстрый, потому что он распараллеливается через C и c++.