大型稀疏矩阵的快速非负矩阵分解

vpk*_*vpk 5 python numpy sparse-matrix scikit-learn matrix-factorization

使用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.")
Run Code Online (Sandbox Code Playgroud)

有没有办法让这更快,并解决上述问题?我已经尝试过使用numpy稀疏矩阵(列稀疏和行稀疏),但令人惊讶的是 - 在测试中我使用较小的矩阵(~10 ^ 7个单元格)进行测试的速度较慢.

考虑到必须运行这种因子分解的多次迭代(选择理想数量的因子和k倍交叉验证),非常需要更快的方法来解决这个问题.

我也愿意接受不基于sklearn或Pyhon的软件包/工具的建议.我理解不鼓励有关包/工具选择的问题,但对于这样一个特定的用例,了解该领域其他人使用的技术将非常有帮助.

won*_*id2 2

也许对最初的问题进行一些说明可以让我们给出更好的答案。

由于问题的性质,非常大的矩阵上的矩阵分解总是很慢。

建议:减少n_components到 < 20 会稍微加快速度。然而,唯一真正的速度改进将通过限制矩阵的大小来实现。对于像您描述的矩阵,人们可能会认为您正在尝试分解术语频率矩阵。如果是这样,您可以尝试使用 scikit-learn 中的矢量化函数来限制矩阵的大小。大多数都有一个max_features参数。例子:

vectorizer = TfidfVectorizer(
    max_features=10000,
    ngram_range=(1,2))
tfidf = vectorizer.fit_transform(data)
Run Code Online (Sandbox Code Playgroud)

这将显着加快问题的解决速度。

如果我完全错误并且这不是术语频率问题,我仍然会研究限制您尝试分解的初始矩阵的方法。