我正在尝试使用 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算法需要哪些矩阵运算才能快速执行?还有其他一些我忽略的错误吗?