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