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 アルゴリズムが迅速に実行するために必要な行列演算は何ですか? 私が見落としている他の間違いはありますか?