SVD for sparse matrix in R

后端 未结 4 2131
情歌与酒
情歌与酒 2020-12-06 02:16

I\'ve got a sparse Matrix in R that\'s apparently too big for me to run as.matrix() on (though it\'s not super-huge either). The as.matrix()

4条回答
  •  盖世英雄少女心
    2020-12-06 02:38

    You can do a very impressive bit of sparse SVD in R using random projection as described in http://arxiv.org/abs/0909.4061

    Here is some sample code:

    # 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))
    }
    

提交回复
热议问题