10

私はMatrixR にスパースを持っていますが、これは明らかに大きすぎて実行できませんas.matrix()(ただし、超巨大ではありません)。問題のas.matrix()呼び出しはsvd()関数内にあるため、密行列への最初の変換を必要としない SVD の別の実装を誰かが知っているかどうか疑問に思っています。

4

4 に答える 4

9

irlbaパッケージには、疎行列用の非常に高速な SVD 実装があります。

于 2013-04-30T20:09:49.473 に答える
7

http://arxiv.org/abs/0909.4061で説明されているように、ランダム射影を使用して、R で非常に印象的なスパース SVD を実行できます。

サンプルコードは次のとおりです。

# 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))
}
于 2011-05-07T20:48:49.550 に答える
5

だからここに私がやったことがあります。スパース行列 (クラスdgCMatrix) を SVDLIBC の「スパース テキスト」形式のテキスト ファイルにダンプするルーチンを作成し、実行可能ファイルを呼び出して、svd結果の 3 つのテキスト ファイルを R に読み込むのは比較的簡単です。

問題は、かなり非効率的だということです。ファイルの読み取りと書き込みには約 10 秒かかりますが、実際の SVD 計算には約 0.2 秒しかかかりません。とはいえ、計算が全くできないよりは全然マシなので嬉しいです。=)

于 2011-02-11T21:39:01.507 に答える