рандомизированные сингулярные значения SVD

рандомизированный SVD разлагает матрицу путем извлечения первых k сингулярных значений / векторов с использованием k + p случайных проекций. это работает на удивление хорошо для больших матриц.

мой вопрос касается сингулярных значений, выводимых алгоритмом. почему значения не равны первым k-сингулярным значениям, если вы выполняете полную SVD?

Ниже у меня есть простая реализация на R. Любые предложения по улучшению производительности будут оценены.

rsvd = function(A, k=10, p=5) {
       n = nrow(A)
       y = A %*% matrix(rnorm(n * (k+p)), nrow=n)
       q = qr.Q(qr(y))
       b = t(q) %*% A
       svd = svd(b)
       list(u=q %*% svd$u, d=svd$d, v=svd$v)
       }

> set.seed(10)

> A <- matrix(rnorm(500*500),500,500)

> svd(A)$d[1:15]
 [1] 44.94307 44.48235 43.78984 43.44626 43.27146 43.15066 42.79720 42.54440 42.27439 42.21873 41.79763 41.51349 41.48338 41.35024 41.18068

> rsvd.o(A,10,5)$d
 [1] 34.83741 33.83411 33.09522 32.65761 32.34326 31.80868 31.38253 30.96395 30.79063 30.34387 30.04538 29.56061 29.24128 29.12612 27.61804
7
задан pslice 19 November 2010 в 10:16
поделиться