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