我正試圖用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算法需要快速執行哪些矩陣運算?我忽略了其他一些錯誤嗎?
建議:這是一個開源軟件包,所以你可以看看它的源代碼,這可能會澄清一些事情。 –
也許你可以嘗試在http://scicomp.stackexchange.com/上提問 – astrojuanlu