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

时间:2015-07-22 07:38:05

标签: python numpy scikit-learn sparse-matrix matrix-factorization

使用Scikit-learn(v 0.15.2)对大型稀疏矩阵进行非负矩阵分解(小于1%值> 0)。我想通过最小化矩阵的非零值上的错误来找到因子(即,不计算零的条目的错误),并且有利于稀疏性。我不确定我正在尝试的是否有什么问题。 scikit-learn包的NMF和ProjectedGradientNMF以前对我有用。但似乎当矩阵大小增加时,因子分解非常缓慢。

我正在谈论与>的矩阵。 10 ^ 10个细胞。对于具有~10 ^ 7个单元的矩阵,我发现执行时间是好的。

我使用的参数如下: $id_exist = 0; $sql = "SELECT id FROM tap" ; $sql_prepare = $dbh->prepare($sql); $sql_prepare->execute(); while($row = $sql_prepare->fetchObject()) { if($_POST['id'] == $row->id) { $id_exist = 1; } } if($id_exist == 1) { // perform update here } else { echo 'No such animal'; }

当我尝试稍微不同的参数(更改为nmf_model = NMF(n_components = 100, init='nndsvd', random_state=0, tol = 0.01, sparseness='data'))时,我收到以下警告。警告之后,脚本的执行停止。

init=random

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

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

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

2 个答案:

答案 0 :(得分:2)

关于初始问题的几个问题可能会使我们能够提供更好的答案。

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

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

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

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

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

答案 1 :(得分:2)

您可能需要查看本文,讨论有关NMF的最新技术:http://www.cc.gatech.edu/~hpark/papers/nmf_blockpivot.pdf

我们的想法是只对非因子化条目进行分解,这会减少计算时间,特别是当涉及的矩阵/矩阵非常稀疏时。

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

希望有所帮助。