在R中执行非负矩阵分解

use*_*389 5 r

我在R中有一个稀疏矩阵

我现在希望在R上执行非负矩阵分解

data.txt是我使用python创建的文本文件,它由3列组成,其中第一列指定行号,第二列指定列号,第三列指定值

data.txt中

1 5 10
3 2 5
4 6 9
Run Code Online (Sandbox Code Playgroud)

原始data.txt包含164009行,这是250000x250000稀疏矩阵的数据

我使用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)
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误函数错误(classes,fdef,mtable):无法找到函数nmf的继承方法,签名"dgCMAtrix","missing","missing"

任何人都可以帮我弄清楚我做错了什么

Mat*_*erg 4

第一个问题是您正在向 nmf 提供 dgCMatrix。

> class(R)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
Run Code Online (Sandbox Code Playgroud)

帮助在这里:

help(nmf)
Run Code Online (Sandbox Code Playgroud)

请参阅方法部分。它需要一个实数矩阵。由于条目的数量,使用 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.
Run Code Online (Sandbox Code Playgroud)

让我们给它一个排名:

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

确实如此:

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

[1,] . . . . 10 .
[2,] . . . .  . .
[3,] . . 5 .  . .
[4,] . . . .  . 9
Run Code Online (Sandbox Code Playgroud)