3

我正在尝试使用 python 库Nimfa分解非常大的矩阵。由于矩阵太大,我无法在内存中以 dence 格式实例化它,所以我使用scipy.sparse.csr_matrix

该库有一个称为Snmf: Sparse Nonnegative Matrix Factorization (SNMF)的稀疏矩阵函数,这似乎是我正在寻找的。

尝试它时,我在分解时遇到了严重的性能问题(不是内存表示,而是速度),我还不能分解一个简单的 10 x 95 稀疏矩阵。

这就是我构建测试矩阵的方式:

m1 = lil_matrix((10, 95))
for i in xrange(10):
    for j in xrange(95):
        if random.random() > 0.8: m1[i, j] = 1
m1 = csc_matrix(m1)

这就是我运行它的方式

t = time()
fctr = nimfa.mf(m1, 
              seed = "random_vcol", 
              rank = 2, 
              method = "snmf", 
              max_iter = 15, 
              initialize_only = True,
              version = 'r',
              eta = 1.,
              beta = 1e-4, 
              i_conv = 10,
              w_min_change = 0)
print numpy.shape(m1)
a =  nimfa.mf_run(fctr)
print a.coef()
print a.basis()
print time() - t

这似乎根本没有完成。但是如果我做 m1.todense() 它会在几秒钟内完成。由于我无法实例化我的真实矩阵,这对我来说并不是一个好的解决方案。

我尝试了不同的 scipy.sparse 矩阵格式但无济于事:csc_matrix、csr_matrix 和 dok_matrix。

我使用了错误的矩阵格式吗?snmf算法需要哪些矩阵运算才能快速执行?还有其他一些我忽略的错误吗?

4

1 回答 1

3

我做了一些挖掘,在他们的稀疏实现中似乎有一个错误。它是什么,我不知道,但是如果您查看_spfcnlls 中的第 289 行,则 len(f_set) 永远不会减少,并且循环会永远运行。当矩阵不稀疏时,永远不会调用该方法。我在这里的 github 存储库上打开了一个问题。

同时,numpy 或 scipy 中是否有适合您需求的分解功能?

于 2014-06-02T03:16:59.837 回答