СВД для разреженной матрицы в R - PullRequest
10 голосов
/ 10 февраля 2011

У меня есть редкий Matrix в R, который, по-видимому, слишком велик, чтобы я мог запустить as.matrix() (хотя он и не супер-огромный).Соответствующий вызов as.matrix() находится внутри функции svd(), поэтому мне интересно, знает ли кто-нибудь другую реализацию SVD, которая не требует предварительного преобразования в плотную матрицу.

Ответы [ 4 ]

9 голосов
/ 01 мая 2013

Пакет irlba имеет очень быструю реализацию SVD для разреженных матриц.

7 голосов
/ 08 мая 2011

Вы можете сделать очень впечатляющую часть разреженного 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))
}
5 голосов
/ 12 февраля 2011

Итак, вот что я в итоге сделал. Относительно просто написать подпрограмму, которая выводит разреженную матрицу (класс dgCMatrix) в текстовый файл в формате SVDLIBC «разреженный текст», затем вызывает исполняемый файл svd и считывает три результирующих текстовых файла обратно в R.

Суть в том, что это довольно неэффективно - у меня уходит около 10 секунд на чтение и запись файлов, но фактический расчет SVD занимает всего около 0,2 секунды или около того. Тем не менее, это, конечно, лучше, чем вообще не выполнять вычисления, так что я счастлив. =)

3 голосов
/ 06 апреля 2014

RARPACK - это пакет, который вам нужен.Работает как шарм и является супербыстрым, потому что он распараллеливается через C и C ++.

...