非常大且非常稀疏的非负基质分解



我的矩阵非常大且稀疏的矩阵(531k x 315k),总细胞数量约为1670亿。非零值仅为1s。非零值的总数约为45K。是否有有效的NMF软件包来解决我的问题?我知道有几个软件包,它们仅适用于少量数据矩阵。任何想法都会有所帮助。预先感谢。

scikit-learn将处理此易于

代码:

from time import perf_counter as pc
import numpy as np
import scipy.sparse as sps
from sklearn.decomposition import NMF
""" Create sparse data """
nnz_i, nnz_j, nnz_val = np.random.choice(531000, size=45000), 
                        np.random.choice(315000, size=45000), 
                        np.random.random(size=45000)
X =  sps.csr_matrix((nnz_val, (nnz_i, nnz_j)), shape=(531000, 315000))
print('X-shape: ', X.shape, ' X nnzs: ', X.nnz)
print('type(X): ', type(X))
# <class 'scipy.sparse.csr.csr_matrix'> #                          !!!!!!!!!!
""" NMF """
model = NMF(n_components=50, init='random', random_state=0, verbose=True)
start_time = pc()
W = model.fit_transform(X)
end_time = pc()
print('Used (secs): ', end_time - start_time)
print(model.reconstruction_err_)
print(model.n_iter_)

输出:

X-shape:  (531000, 315000)  X nnzs:  45000
type(X):  <class 'scipy.sparse.csr.csr_matrix'>
violation: 1.0
violation: 0.2318929397542804
violation: 0.11045394409727402
violation: 0.08104138988253409
...
violation: 9.659665625799714e-05
Converged at iteration 71
Used (secs):  247.94092973091756
122.27109041
70

备注:

  • 确保您使用稀疏matrices作为输入,否则无法利用稀疏性
  • 我正在使用版本 0.19.1 ,因此使用了乘法update 求解器(> = 0.19)
    • 但是,较旧的基于CD的求解器也应该处理此问题!
  • 以上是&lt;800 MB的内存

其他约束

如评论中所述,OP希望添加其他约束,而仍未正式指定这些约束。

这将需要一些全新的优化程序实现,包括一些理论 - 脚步(取决于约束)。

作为替代方案,可以通过通用凸的编程求解器来解决。例如。由cvxpy制定并由SCS求解。当然,也需要执行交替的最小化程序(因为联合问题是非凸面),并且比这种专门的Sklearn-implitation的缩放尺寸更糟。但这可能适用于操作数据。