非常大和非常稀疏的非负矩阵分解
Very Large and Very Sparse Non Negative Matrix factorization
我有一个非常大且稀疏的矩阵 (531K x 315K),总单元数约为 1670 亿。非零值仅为 1。非零值的总数约为 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
备注:
- 确保你使用稀疏矩阵作为输入,否则你不能利用稀疏性
- 我使用的是版本 0.19.1,因此使用了 multiplicative-update 求解器 (>= 0.19)
- 但是旧的基于 CD 的求解器也应该处理这个问题!
- 以上是使用< 800 MB内存
附加约束
如评论中所述,OP 希望添加额外的约束,但仍未正式指定这些约束。
这将需要一些优化程序的全新实现,包括一些理论步法(取决于约束)。
作为替代方案,这可以通过通用的凸面规划求解器来解决。例如。由 cvxpy 制定并由 SCS 解决。当然,交替最小化程序也需要完成(因为联合问题是非凸的)并且它的规模会比这种专门的 sklearn 实现更差。但它可能适用于 OPs 数据。
我有一个非常大且稀疏的矩阵 (531K x 315K),总单元数约为 1670 亿。非零值仅为 1。非零值的总数约为 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
备注:
- 确保你使用稀疏矩阵作为输入,否则你不能利用稀疏性
- 我使用的是版本 0.19.1,因此使用了 multiplicative-update 求解器 (>= 0.19)
- 但是旧的基于 CD 的求解器也应该处理这个问题!
- 以上是使用< 800 MB内存
附加约束
如评论中所述,OP 希望添加额外的约束,但仍未正式指定这些约束。
这将需要一些优化程序的全新实现,包括一些理论步法(取决于约束)。
作为替代方案,这可以通过通用的凸面规划求解器来解决。例如。由 cvxpy 制定并由 SCS 解决。当然,交替最小化程序也需要完成(因为联合问题是非凸的)并且它的规模会比这种专门的 sklearn 实现更差。但它可能适用于 OPs 数据。