2013-05-25 36 views
3

我正試圖用python庫Nimfa來分解非常大的矩陣。 由於矩陣如此之大,我無法在存儲器中以實際的格式對其進行實例化,所以我使用scipy.sparse.csr_matrix使用Nimfa進行稀疏矩陣分解對於隱式零來說非常緩慢

該庫有一個稱爲Snmf: Sparse Nonnegative Matrix Factorization (SNMF)的稀疏矩陣函數,它似乎是我正在尋找的函數。

試用時,我有嚴重的性能問題與分解(不是內存表示,但在速度)我還沒有能夠將一個簡單的10×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算法需要快速執行哪些矩陣運算?我忽略了其他一些錯誤嗎?

+0

建議:這是一個開源軟件包,所以你可以看看它的源代碼,這可能會澄清一些事情。 –

+0

也許你可以嘗試在http://scicomp.stackexchange.com/上提問 – astrojuanlu

回答

3

我做了一些挖掘工作,似乎在他們稀疏的實現中存在一個錯誤。它是什麼,我不知道,但如果你看看_spfcnlls len(f_set)中的line 289,永遠不會減少,並且循環將永遠運行。當矩陣不稀疏時,該方法從不被調用。我在github存儲庫here上打開了一個問題。

在此期間,在numpy或scipy中是否存在可滿足您需求的分解函數?