5

在大型稀疏矩阵上使用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的软件包/工具提出建议。我不理解有关软件包/工具选择的问题,但是对于这种特定用例,了解其他人在现场使用的技术会非常有帮助。

回答

2

也许关于最初问题的几句话可以让我们提供更好的答案。

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

意见建议: 减少n_components为< 20会加快它的速度。然而,通过限制矩阵的大小可以实现唯一真正的速度提升。 用你描述的矩阵,可以认为你正试图分解一个项频率矩阵。如果是这样,你可以尝试在scikit-learn中使用矢量化函数来限制矩阵的大小。他们大多数有max_features参数。例如:

vectorizer = TfidfVectorizer(
    max_features=10000, 
    ngram_range=(1,2)) 
tfidf = vectorizer.fit_transform(data) 

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

我应该完全错误,这不是一个术语频率问题,我仍然会研究如何限制您尝试分解的初始矩阵。

+0

scipy的NMF方法是否仅为矩阵的非零条目计算错误?零条目意味着缺少的值。它是否使用正规化来确保解决方案的稀疏性?我没有在文档中找到详细信息。也许需要挖掘代码。 一般用例,也涉及术语频率,但也包括项目标签。这个矩阵非常稀疏。你的解决方案听起来不错,但是当矩阵很大时,仍然不可扩展。假设我想找出已被标记少于2次的项目,或者属于少于5项目的标签。如何全部过滤它们? – vpk

+0

我假设你是指scikit的NMF方法而不是scipy的方法?算法如何处理稀疏性可以通过参数“稀疏性”来设置。它在文档中。对于最后两种情况,我不明白你为什么要使用NMF。我认为还有其他更合适的工具。 – wonderkid2

+0

是的,scikit。你在谈论什么其他工具? – vpk

2

你可能想看看这篇文章,其中讨论了关于NMF更近的技术:http://www.cc.gatech.edu/~hpark/papers/nmf_blockpivot.pdf

的想法是只对非零项工作进行分解从而降低了,特别是当矩阵/矩阵参与计算时间是非常稀疏的。

另外,来自同一篇文章的作者之一在github上创建了NMF实现,其中包括文章中提到的实现。这里的链接:https://github.com/kimjingu/nonnegfac-python

希望有所帮助。