使用 Scikit-learn (v 0.15.2) 对大型稀疏矩阵(小于 1% 的值 > 0)进行非负矩阵分解。我想通过仅在矩阵的非零值上最小化错误来找到因子(即,不计算零条目的错误),并支持稀疏性。我不确定我正在尝试的内容是否有问题。scikit-learn 包的 NMF 和 ProjectedGradientNMF 以前对我很有效。但似乎当矩阵大小增加时,分解速度非常慢。
我说的是具有 > 10^10 个单元格的矩阵。对于具有 ~10^7 单元格的矩阵,我发现执行时间很好。
我使用的参数如下nmf_model = NMF(n_components = 100, init='nndsvd', random_state=0, tol = 0.01, sparseness='data')
:
当我尝试稍微不同的参数(更改为init=random
)时,我收到以下警告。警告后,脚本的执行将停止。
/lib/python2.7/site-packages/sklearn/decomposition/nmf.py:252: UserWarning: Iteration limit reached in nls subproblem.
warnings.warn("Iteration limit reached in nls subproblem.")
有没有办法让它更快并解决上述问题?我尝试过使用 numpy 稀疏矩阵(列和行稀疏),但令人惊讶的是 - 在我使用较小矩阵(~10^7 单元格)进行的测试中它更慢。
考虑到必须运行这种分解的多次迭代(以选择理想数量的因子和 k 折交叉验证),因此非常需要一种更快的方法来解决这个问题。
我也愿意接受不基于 sklearn 或 Pyhon 的包/工具的建议。我知道不鼓励提出有关包/工具选择的问题,但是对于这样一个特定的用例,了解该领域的其他人使用什么技术会非常有帮助。