5

Rに疎行列があります

Rで非負行列因数分解を実行したい

data.txt は、Python を使用して作成したテキスト ファイルです。最初の列は行番号、2 番目の列は列番号、3 番目は値を指定する 3 つの列で構成されています。

data.txt

1 5 10
3 2 5
4 6 9

元のdata.txtには、250000x250000疎行列のデータである164009行が含まれています

私はNMFライブラリを使用しましたが、やっています

x=scan('data.txt',what=list(integer(),integer(),numeric()))
library('Matrix')
R=sparseMatrix(i=x[[1]],j=x[[2]],x=x[[3]]) 
res<-nmf(R,3)

それは私にエラーを与えています:

関数内のエラー (クラス、fdef、mtable): 関数 nmf、シグネチャ "dgCMAtrix"、"missing"、"missing" の継承されたメソッドが見つかりません

誰かが私が間違っていることを理解するのを手伝ってくれますか?

4

3 に答える 3

4

最初の問題は、dgCMatrix を nmf に提供していることです。

> class(R)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

ヘルプは次のとおりです。

help(nmf)

メソッドのセクションを参照してください。実数行列が必要です。as.matrix による強制は、エントリの数が多いため、あまり役に立たない可能性があります。

さて、例のデータを使用しても、次のようにマトリックスへの強制は不十分です。

> nmf(as.matrix(R))
Error: NMF::nmf : when argument 'rank' is not provided, argument 'seed' is required to inherit from class 'NMF'. See ?nmf.

ランク付けしましょう:

> nmf(as.matrix(R),2)
Error in .local(x, rank, method, ...) : 
  Input matrix x contains at least one null row.

そして確かにそうです:

> R
4 x 6 sparse Matrix of class "dgCMatrix"

[1,] . . . . 10 .
[2,] . . . .  . .
[3,] . . 5 .  . .
[4,] . . . .  . 9
于 2012-04-21T03:31:00.937 に答える
1

ほぼ10年後、解決策があります。これが速いものです。

dgCMatrix250k 平方の dgCMatrix が 1% 近くのスパースである場合、スパース因数分解アルゴリズムが必要です。

私はRcppML::NMF大きな疎行列のために書いた:

library(RcppML)
A <- rsparsematrix(1000, 10000, 0.01)
model <- RcppML::nmf(A, k = 10)
str(model)

ラップトップでは数秒かかります。

もチェックアウトできますがrsparse::WRMF、それほど高速ではありません。

于 2021-08-26T17:54:19.550 に答える