3

Python ライブラリNim​​faを使用して、非常に大きな行列を因数分解しようとしています。マトリックスが非常に大きいため、メモリ内で 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