使用Nimfa的稀疏矩阵分解非常慢,隐式零

时间:2013-05-25 12:03:18

标签: python scipy sparse-matrix factorization

我试图用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算法需要快速执行哪些矩阵运算?我忽视了其他一些错误吗?

1 个答案:

答案 0 :(得分:3)

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

与此同时,numpy或scipy中是否存在符合您需求的分解功能?